Git 命令速查

Git常用命令速查表

配置用户名邮箱

1
2
git config --global user.name "jingtalk"
git config --global user.email "jinghuang1130@yahoo.com"

配置別名

1
2
3
4
5
6
git config --global alias.ci commit
git config --global alias.check checkout
git config --global alias.st status
git config --global alias.br branch
git config --global alias.last "log -3 HEAD" #显示最新提交的3个日志
git config --global alias.di diff

删除本地分支

1
2
git branch -d dev
git branch -D dev #强制删除

删除远程分支

1
git branch -r -d origin/dev

上面只是删除本地对应远程分支的track, 正确做法

1
git push origin :dev

冒号前面的空格不能少,原理是把一个空分支push到server上,相当于删除该分支

重命名本地分支

1
2
git branch -m dev newdev
git branch -m | -M oldbranch newbranch #重命名分支,如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名

git重命名远程分支=先删除远程分支,然后重命名本地分支,再推送

新建分支

本地新创建了一个local_br 需要推送到远程的 remote_br分支上 (冒号前后不要加空格)

1
git push origin local_br:remote_br

删除本地远程分支缓存

有时候远程分支跟本地对应分支已经删除, 但是 git branch -r 命令还是查看到之前已经追踪的远程分支, 如下:

1
2
3
4
5
6
7
8
9
10
11
F:\iMSDK-Android (hakim_webview_fixed)
λ git br -r
origin/HEAD -> origin/master
origin/dandi_imsdkhelp
origin/dev
origin/facebook_invite_return_friendlist // deleted
origin/hakim_webview_bug_fixed // deleted
origin/hakim_webview_multiprocess // deleted
origin/hzg_fix_base_NullPointerException // deleted
origin/ld
origin/master

此时可以使用 git remote prune origin 来删除无用的分支追踪

1
2
3
4
5
6
7
8
9
F:\iMSDK-Android (hakim_webview_fixed)
λ git remote prune origin
Password for 'http://hakimhuang@git.code.oa.com':
Pruning origin
URL: http://hakimhuang@git.code.oa.com/iMSDK/iMSDK-Android.git
* [pruned] origin/facebook_invite_return_friendlist
* [pruned] origin/hakim_webview_bug_fixed
* [pruned] origin/hakim_webview_multiprocess
* [pruned] origin/hzg_fix_base_NullPointerException

也可使用 git fetch -p 命令

cherry-pick

在常规开发过程中,经常会遇到这样的问题,dev作为新功能提交分支,每天都有提交代码;而master作为稳定版本分支,可能一个月才提交一次,这样就会遇到dev的很多功能性代码部分合入master的需求,此时为使用cherry-pick的绝佳时机, commit_id为dev分支上提交的commit id

1
2
3
git checkout master
git cherry-pick <commit_id> #此步可能会生冲突,但修改冲突的代价远小于代码比对合入
git push origin master

查看代码库地址

1
git remote -v

新建仓库

如果想保留仓库原有的文件夹名字

1
git clone https://github.com/JingTalk/jingtalk.github.io.git

如果想起一个新的名字

1
2
3
4
5
mkdir jingtalkblog
cd jingtalkblog
git init
git remote add origin https://github.com/JingTalk/jingtalk.github.io.git
git pull origin master

添加远程库

如果现在已经本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步;首先先在git上建立一个空的仓库jingtalk;然后可以将本地的仓库与jingtalk关联;

1
2
git remote add origin https://github.com/JingTalk/jingtalk.github.io.git
git push -u origin master

第一次推送master分支时,使用-u参数,Git把本地的master分支推送的远程新的master分支,同时把本地的master分支和远程的master分支关联起来,以后只需要下面命令来推送最新修改

1
git push origin master

commit撤销

1
2
3
4
git reset --hard <commit_id> #彻底回退到某个版本,本地的源码也会变为上一个版本的内容,代码已删除
git reset --hard HEAD^
git reset --soft<commit_id> #回退到某个版本,只回退了commit的信息,代码没有删除
git reset --soft HEAD^

在Git中,用HEAD表示当前版本, 上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

1
2
3
git reset --hard HEAD
git reset --hard HEAD^
git reset --hard HEAD^^

线上版本回退

如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。
首先要回退本地分支:

1
2
git reflog
git reset --hard commit_id

紧接着强制推送到远程分支:

1
2
3
git push -f
// 上面如果执行报错,可以使用下面这种
git push origin master -f

注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支

git reflog

可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录

1
2
3
4
5
6
7
8
9
10
F:\git_TOS\wear\twssports (goer_master_GA)
λ git reflog
bbb7bc3 HEAD@{0}: cherry-pick: 中英文修改
58e8584 HEAD@{1}: reset: moving to 58e8584f6f39c84301c9399d3ffe2dfb8fd43231
0492752 HEAD@{2}: checkout: moving from dev to goer_master_GA
27d8437 HEAD@{3}: checkout: moving from master to dev
27d8437 HEAD@{4}: reset: moving to 27d843767ce98fb78faf7a03bfd8509faaa6b519
f4767fd HEAD@{5}: checkout: moving from dev to master
27d8437 HEAD@{6}: commit: 静置导致的关闭运动Toast添加运动状态判断
d402152 HEAD@{7}: checkout: moving from goer_master_GA to dev

暂存修改

1
2
3
4
5
6
7
8
9
10
git stash
git stash save "message about stash op" // 添加描述信息
git stash save -a "message about stash op(including new file)" // -a 会添加新增的本地文件到缓存
git stash list
git stash apply // 应用最新的修改
git stash apply stash@{id} // 应用指定的修改
git stash drop
git stash pop // 出栈最新的保存修改
git stash pop stash@{id} // 出栈指定的保存修改
git stash clear

查看提交记录

1
2
git log
git log <file>

删除git远程库中的文件

1
2
3
4
git rm --cached -r gradle.properties
#delete gradle.properties in .gitignore
git add .gitignore
git push origin master

.gitignore规则

1
2
3
4
5
6
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

1
2
3
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

SSH权限

通过命令生成两个文件 id_rsa 和 id_rsa.pub ,而 id_rsa 是密钥,id_rsa.pub 就是公钥,将后者添加到github、coding.net相应的设置中即可通过ssh方式拉取代码(不用再输入用户名和密码)

1
ssh-keygen -t rsa -C jinghuang1130@yahoo.com

Mac系统下的.ssh文件位于/Users/用户名/.ssh下面

Error问题

refusing

git push origin master的时候,有时会报下面的错误

1
2
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

使用 --allow-unrelated-histories 处理,如下

1
git push origin master --allow-unrelated-histories