Git常用命令小结

因为最近项目用到git较多,一些常用的命令经常忘记,好记性不如烂笔头,索性总结一下。这篇文章会系统的逐渐更新所有在git中用到的命令操作或者git基础知识,仅仅起到一个索引的作用,如果你有一定的git基础,但是想知道或者了解git在一个小团队的分支管理工作流程,可以参考这篇文章
在git的版本管理中心有这样的一层关系,用流程图画出来会比较好。

该图借用了阮一峰老师blog的图。

  • Workspace:工作区
  • Index:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

Workspace就是项目的工作目录,index是在你git add .之后,文件修改会放入index暂存区,Repository是每个开发者自己的机子上维护的一个仓库,remote就是公司的Gitlab或者GitHub上存放的远程仓库。

Git配置

1
2
3
4
5
6
# 显示当前的Git配置,包括远程仓库、分支追踪关系等等
$ git config --list
# 设置提交代码时的用户信息,注意:加--global,表示全局,否则为当前项目
$ git config [--global] user.name "name"
$ git config [--global] user.email "email address"

增加/提交文件

增加文件

1
2
3
4
5
# 添加当前目录的所有文件到暂存区(☆)
$ git add .
# 添加指定文件到暂存区
$ git add [file1] [file2] ...

提交文件

1
2
3
4
5
6
7
8
# 提交暂存区到仓库区
$ git commit -m [message]
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 还有可以修改上次提交author和committor信息

增加远程仓库

1
2
3
4
5
6
# 显示所有远程仓库
$ git remote -v
# 增加一个新的远程仓库,并命名,比如:
# git remote add origin ssh://xxx.xx.xx/xx.git
$ git remote add [shortname] [url]

如果没有添加远程仓库,eclipse中每次push都需要手动添加远程仓库url,会很繁琐。

追踪关系

在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支,Git也允许手动建立追踪关系,但是一般并不这样搞。

1
2
3
4
5
# 下面命令指定本地master分支追踪origin/dev分支。
$ git branch --set-upstream master origin/dev
# 下面的命令可以看到当前分支追踪的远程分支
$ git branch -vv

远程同步

push

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# =========================git push==============================
# 注意,分支推送顺序的写法是<来源地>:<目的地>
# 所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
$ git push <远程主机名> <本地分支名>:<远程分支名>
# 如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名)
# 如果该远程分支不存在,则会被新建。
$ git push origin master
# 上面命令表示,将本地的master分支推送到origin主机的master分支。
# 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
$ git push origin
# 上面命令表示,将当前分支推送到origin主机的对应分支。
# 如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push

pull

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
# 比如取远程主机别人的分支xxx与自己的分支dev合并,则可以如下操作
$ git pull origin xxx:dev
# 如果远程分支与当前分支名称一致,则冒号后面的部分可以省略。
$ git pull origin dev
# 如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
$ git pull origin
# 上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
# 如果当前分支只有一个追踪分支,连远程主机名都可以省略。
$ git pull
# 上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

分支管理

一般最常见的就是一个master分支和一个dev分支,dev分支用于日常开发,master分支用于版本更新版本发布。

查看分支

1
2
3
4
5
6
7
8
# 列出所有本地分支
$ git branch
# 查看远程所有分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a

创建分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基于当前分支创建新的分支,比如在master分支外面在开一个dev分支
$ git branch dev
# 切换到新的分支dev
$ git checkout dev
# 如果将上面两条命令合并在一起,就是基于当前创建新分支(dev)的同时,切换到新分支(dev)
$ git checkout -b dev
# 另外,前面是基于本地分支新建分支,如果想要在远程分支的基础上新建分支feature来
$ git checkout -b feature origin/feature
# 切换到上一个分支的快捷方式,比如master
$ git checkout -

合并分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 如果当前分支是master,需要合并dev分支上修改的内容
$ git merge dev
# 比如在dev上开发了一段时间,要将代码合并到master分支
# 可以先切换到master分支,然后执行下面命令
$ git merge dev --no-ff
# 其中--no-ff的意思是,不将dev所有的提交节点合并到master分支上
# 这样做的好处是能保证master分支节点干净
# 查看查看尚未合并的分支
$ git branch --no-merged
# 查看哪些分支已被并入当前分支(译注:也就是说哪些分支是当前分支的直接上游。)
$ git branch --merged

删除分支

1
2
3
4
5
# 删除完成使命的分支(比如:已经合并完成的分支fix-bug),用小写-d作为参数,这样如果分支中还包含着尚未合并进来的工作成果,会出现错误提示;
$ git branch -d fix-bug
# 如果用-D则是强制删除分支
$ git branch -D fix-bug

标签管理

标签其中一个用处是用来标记一些版本信息,比如在master分支上打上v1.0、v1.1等版本信息,这样版本更新信息一目了然。

1
2
3
4
5
6
7
8
9
10
11
# 在当前commit上添加标签tag
$ git tag v1.0
# 可以指定给之前的commit添加tag,commit_id用commit号前几位就行(4位好像可以)
$ git tag v0.9 commit_id
# 默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:
$ git push origin v1.1.0
# 或者一次性推送所有新增的标签
$ git push origin --tags

储藏

经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。

“‘储藏”“可以获取你工作目录的中间状态——也就是你修改过的「被追踪」的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

1
2
3
4
5
6
7
8
# 将追踪过得文件的变更存入堆栈
$ git stash
# 查看堆栈中所有的储藏记录
$ git stash list
# 取出刚刚存入堆栈的变更(也就是栈顶的储藏)
$ git stash pop

注意堆栈是针对分支是全局的,所以各个分支都能看到你在另一个分支的stash,目前就用到了储藏的以上三个功能,其他更高级的慢慢接触。

撤销

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 修改了一些文件,还没add放入暂存区,这时可以checkout,就是按照暂存区的文件来恢复工作区,使得工作区文件于暂存区文件保持一致。
# git checkout . 表示恢复所有文件。
$ git checkout .
# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 另外一种情况,假如我不小心add到了暂存区,但是还没commit,这时候想恢复暂存区,就需要重置暂存区了。
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
# 如果不是想与上一次commit保持一致,而是某个指定的commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 再一种情况,直接是工作区的修改都想重置了,这种情况一般要小心,因为你没提交的工作区的修改很有可能就没有了,因为不仅仅是暂存区被重置,还有工作区也会被重置。
# 重置【暂存区与工作区】,与上一次commit保持一致
$ git reset --hard
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

参考资料

常用 Git 命令清单
Git远程操作详解
Git 工具 - 储藏

-EOF-