Git常用操作

Clone项目

克隆

1
git clone https://github.com/psvmc/RESideMenu_Swift.git ../RESideMenu_Swift

克隆分支

1
git clone -b 分支名 https://github.com/psvmc/RESideMenu_Swift.git ../RESideMenu_Swift

克隆下来的项目git的配置信息也下载下来了,所以不用git init

Git拉取

1
git pull <远程主机名> <远程主机分支名>:<本地分支名>

比如 取回origin主机的next分支,与本地的master分支合并,需要写成下面这样

1
git pull origin next:master

拉取远程指定分支

1
2
git fetch origin 分支名称
git checkout 分支名称

git fetch 和 git pull 的差别

1
2
3
4
5
6
7
8
9
10
11
# git fetch 相当于是从远程获取最新到本地,不会自动merge
# 将远程仓库的master分支下载到本地当前branch中
git fetch orgin master
# 比较本地的master分支和origin/master分支的差别
git log -p master ..origin/master
# 进行合并
git merge origin/master

# git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master
git pull <远程主机名> <远程分支名>:<本地分支名>

密码凭据

Git 提供了凭据助手(credential helper)来缓存或存储你的账号密码。

缓存凭据

临时保存,适合安全性要求高的环境

1
git config --global credential.helper cache

默认缓存 15 分钟。

可以指定时间(例如 10 小时 = 36000 秒):

1
git config --global credential.helper 'cache --timeout=36000'

注意:

这种方式将密码明文缓存在内存中,不写入磁盘。

存储凭据

永久保存,密码以明文形式保存在文件中

1
git config --global credential.helper store

首次输入账号密码后,Git 会将其保存在 ~/.git-credentials 文件中(格式为明文),后续操作不再提示。

远程覆盖本地

1
2
git fetch --all
git reset --hard origin/master

虽然会让 Git 管理的文件 与远程完全一致,但它 不会删除本地新增的、未被 Git 跟踪的文件(即“未跟踪文件”或“untracked files”),比如你临时创建的 test.py、日志文件、编译产物等。

清理未跟踪文件

1
2
3
4
5
# 1. 先查看哪些文件会被删除(安全预览)
git clean -nd

# 2. 如果确认无误,执行删除(-f 表示强制)
git clean -fd

参数说明:

  • -f:强制删除(必须加,除非配置了 clean.requireForce false
  • -d:同时删除未跟踪的目录
  • -n:dry-run,只显示会删什么,不真删(用于预览)

组合成一行

1
git fetch origin && git reset --hard origin/master && git clean -fd

冲突解决

备份当前分支

1
git branch master_backup

还原

1
git fetch origin && git reset --hard origin/master && git clean -fd

Git提交

第一次提交

进入项目的根目录

1
cd  /xx/xx

git初始化

1
git init

添加远程库

1
git remote add origin https://github.com/psvmc/RESideMenu_Swift.git

输入账号密码

添加修改的文件

1
git add .

提交已添加的文件

1
git commit -m "注释信息"

修改push到远程

1
git push origin master

提交

进入项目的根目录

1
cd  /xx/xx

把远程的pull过来

1
git pull origin master

修改文件

添加修改的文件

1
git add .

提交已添加的文件

1
git commit -m "注释信息"

修改push到远程

1
2
git push origin master
git push <远程主机名> <本地分支名>:<远程主机分支名>

比如 把本地的master分支推送到远程my_master

1
git push origin master:my_master

修改提交的备注

1
git commit --amend

本地覆盖远程

1
git push origin master:master --force

提交记录

查看某人的提交历史

1
2
git log --author="psvmc"
git log --author="zhangjian"

所有的提交历史

1
git log --date=iso --pretty=format:’"%h","%an","%ad","%s"’ >> D:\git_log\schoolweb.csv

某段时间历史

时间正序

1
git log --after="2022-2-1" --before="2022-12-31" --date=short --reverse --pretty=format:"%h","%an","%ad","%s" >> D:\git_log\schoolweb.csv

时间倒序

1
git log --after="2022-2-1" --date=iso --pretty=format:"%h","%an","%ad","%s" >> D:\git_log\schoolweb.csv

Git分支

添加本地分支

1
git branch <新分支名字>

切换本地分支

1
git checkout <分支名>

该语句和上一个语句可以和起来用一个语句表示:

1
git checkout -b <分支名>

推送远程分支

1
git push origin <本地分支>:<远程分支>

查看本地分支

1
git branch

查看远程分支

1
git branch -a

删除本地分支

1
git branch -d <本地分支>

删除远程分支

1
git push origin :<远程端分支>

Tag操作

Git 跟其它版本控制系统一样,可以打标签(tag),作用是标记一个点为一个版本号,打标签的操作发生在我们 commit 修改到本地仓库之后。

添加标签

1
2
3
git add .
git commit -m "fixed some bugs"
git tag -a 1.0 -m "Release version 1.0"

上传标签

1
2
git push origin master
git push origin --tags

--tags 参数表示提交所有 tag 至服务器,普通的 git push origin master 操作 不会推送标签到服务器端

删除本地标签

1
git tag -d 1.0

删除远程标签

1
git push origin :refs/tags/1.0

其他操作

设置用户名与邮箱

设置

1
2
git config --global user.name "psvmc"
git config --global user.email "183518918@qq.com"

查看

1
2
git config --get user.name
git config --get user.email

取消SSL验证

修改git的配置文件,设置http.sslVerify为false,即可关闭TLS证书验证:

1
git config --global http.sslverify false

如果您仍然想要进行TLS证书验证,但是不想看到警告信息,可以使用以下命令来关闭Git的警告信息:

1
git config --global advice.detachedHead false

禁止提交文件

假设我们在配置.gitignore文件之前就提交了123.txt

那么即使我们以后.gitignore中添加上123.txt
该文件依旧会被提交,该怎样解决呢

先移除追踪

1
git rm --cached 123.txt

再提交

1
git commit -m "移除追踪"

改写历史

1
2
3
4
git clone https://github.com/psvmc/psvmc.github.io.git
git filter-branch --tree-filter 'rm -f jekyll-themes/ztheme/images/*.jpg' --tag-name-filter cat -- --all
git push origin --tags --force
git push origin --all --force

例如 删除.idea文件夹

1
2
3
git filter-branch --tree-filter 'rm -rf .idea/*' --tag-name-filter cat -- --all
git push origin --tags --force
git push origin --all --force

取消跟踪已版本控制的文件

不再追踪文件改动

1
git update-index --assume-unchanged filePath

恢复追踪文件改动

1
git update-index —no-assume-unchanged filePath

删除被管理的文件

1
git rm —cached filePath

删除被管理的文件夹

1
git rm -rf —cached filePath

版本回退

查看之前的版本

1
git reflog

复制完要回退的版本号后 按q键退出

回退到指定版本

1
2
git reset --soft xxxx
git reset --hard xxxx

回退到上个版本

1
2
git reset --soft HEAD~1
git reset --hard HEAD~1

HEAD 就代表当前,所以上一个版本其实就是当前-1

前者表示只是改变了HEAD的指向,本地代码不会变化,我们使用git status依然可以看到,同时也可以git commit提交。

后者直接会改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码,所以使用是一定要小心,想清楚。

常见问题

问题1

fatal: bad object refs/remotes/origin/master

解决方法

1
2
3
4
mv .git/refs/remotes/origin/master /tmp
git gc
git branch --set-upstream-to=origin/master master
git pull

Git每次提交都要输入url

当代码不是clone下来,而是本地分享到git,以后每次push都需要输入url,
原因在于生成的config文件中不包含远程git的信息

解决方法:

  • 打开项目下.git文件夹,找到config文件,打开
  • 替换内容为以下
1
2
3
4
5
6
7
8
9
10
[core]
repositoryformatversion = 0
filemode = false
logallrefupdates = true
[remote "origin"]
url = https://github.com/psvmc/js-form-validate.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master

修改url为你git仓库的url

无法Clone

当项目过大时会报一下的错误

1
RPC failed; curl 18 transfer closed with outstanding read data remaining

解决方法

1
2
git  config --global http.postBuffer 24288000
git config --list

如果还不行呢

1
2
3
git clone http://github.com/myproject --depth 1
cd myproject
git fetch --unshallow

如果上面的还不行 就可能是Nginx做代理缓存设置过小的缘故

把代理中的缓存关闭就行了(折腾了好久,才试出来的)

1
2
3
location / {
proxy_buffering off;
}

Github提交失败

先查看系统的代理

image-20240103181022526

设置git代理

1
2
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy http://127.0.0.1:1080

取消代理

1
2
3
4
5
6
7
# 取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy

# 查看代理
git config --global --get http.proxy
git config --global --get https.proxy

客户端推荐

Sourcetree

强烈推荐最好用的客户端 免费使用。

https://www.sourcetreeapp.com/