git

Git 常用命令集合

Posted by Sunday on 2017-11-21

11

Git 配置

1.在安装完成 Git 后,开始正式使用前,是需要有一些全局设置的,如用户名、邮箱。
设置的主要命令是 git config:

1
2
git config --global user.name "your name"      // 设置全局用户名
git config --global user.email "your email" // 设置邮箱

其中, –global 指定为全局配置,不使用该参数,则为当前所在仓库配置。

2.除了用户名、邮箱之外,还有很多的配置可以用来自定义 Git,如:

1
2
git config --global color.ui true        // 让 Git 显示不同的颜色
git config core.ignorecase true // 让 Git 对仓库中的文件大小写敏感

3.查看所有的已经做出的配置:

1
git config -l

基础操作

1. 创建 Git 版本库

在本地创建 Git 版本库,需要使用 git init 命令。
首先,你需要新建一个存放版本库的目录,然后进入到该目录所在路径,然后执行:

1
git init

然后查看目录结构中,就可以看到包含有 .git 子目录,这就说明创建版本库成功了。

2. 将文件添加到版本库

要将一个文件纳入到版本库管理,首先要将其添加到暂存区(这里不做深入介绍),然后才能提交到仓库中。

2.1 将文件添加到暂存区,使用的是 git add:

1
2
git add Readme.md        // 添加单个文件到暂存区
git add . // 将当前目录下所有修改添加到暂存区,除按照规则忽略的之外

注意:这边空文件夹是不会被添加到暂存区中的。

2.2 将暂存区中的文件,提交到仓库中。需要使用 git commit:

1
2
git commit        // 如果暂存区有文件,则将其中的文件提交到仓库
git commit -m 'your comments' // 带评论提交,用于说明提交内容、变更、作用等

注意:这边直接用 git commit 提交,会先弹出添加评论的页面。

3. 查看仓库的状态

不论我们是新建了文件,将文件加入暂存区,或者其他的修改等等,我们都可以通过:

git status
来随时查看仓库中文件的状态。这个应该是使用 Git 做版本控制过程中,我使用最多的一个命令。

4. 查看仓库中的具体修改

很经常的,我们对某个文件做了修改,但过不久就忘记了。这时候就可以通过 git diff 来查看具体的修改内容。

1
2
git diff    // 查看版本库中所有的改动
git diff Readme.md // 查看具体文件的改动

5. 查看提交历史记录

有的时候,你会需要查看自己做过哪些提交,来回顾自己完成的部分。或者需要寻找某个具体的提交来查看当时的代码。这里需要用到:

1
2
git log     // 显示所有提交的历史记录
git log --pretty=oneline // 单行显示提交历史记录的内容

在 git log 的输出内容中,可以看到每次提交的 ID,是一个 40 位的字符串。

6. 版本回退

有了 git log 来查看提交的历史记录,我们就可以通过 git reset –hard 来回退到我们需要的特定版本,然后使用当时的代码进行各种操作。

1
2
3
git reset --hard HEAD^        // 回退到上一个提交版本
git reset --hard HEAD^^ // 回退到上上一个提交版本
git reset --hard 'commit_id' // 会退到 commit_id 指定的提交版本

7. 回到未来的某个提交

当退回到某个提交的版本以后,再通过 git log 是无法显示在这之后的提交信息的。但是,通过 git reflog 可以获取到操作命令的历史。

因此,想要回到未来的某个提交,先通过 git reflog 从历史命令中找到想要回到的提交版本的 ID,然后通过 git reset –hard 来切换。

1
2
git reflog
git reset --hard 'commit_id'

8. 撤销修改

撤销修改同样包括两方面的内容,由于仓库中的文件在提交之前,可能在工作区中,尚未在版本控制范围内,也可能在暂存区中。

8.1 丢弃工作区中文件的修改

1
2
3
git checkout -- Readme.md    // 如果 Readme.md 文件在工作区,则丢弃其修改
git checkout -- . // 丢弃当前目录下所有工作区中文件的修改
注意: git checkout -- 中的 -- 是必须的。

8.2 丢弃已经进入暂存区的修改

1
git reset HEAD Readme.md // 将 Readme.md 恢复到 HEAD 提交版本的状态

9. 删除文件

在文件未添加到暂存区之前,对想删除文件可以直接物理删除。或者通过 git checkout – file 来丢弃。如果文件已经被提交,则需要 git rm 来删除:

1
git rm Readme.md // 删除已经被提交过的 Readme.md

注意: git rm 只能删除已经提交到版本库中的文件。其他状态的文件直接用这个命令操作是出错的。

分支管理

分支是版本控制系统中很重要的一个概念,在 Git 中新建、合并等分支的操作非常轻量便捷,因此我们会很经常的用到。

1. 查看分支

查看分支使用 git branch:

1
2
3
git branch        // 查看本地分支信息
git branch -v // 查看相对详细的本地分支信息
git branch -av // 查看包括远程仓库在内的分支信息

注意:在 git branch 的输出内容中,有一个分支,前面带有 * 号,这标识我们当前所在的分支。

2. 创建分支

当我们要修复一个 Bug,或者开发一个新特性,甚至是在初学的时候怕打乱原来的代码,都可以新建一个分支来避免对原来代码的影响。

1
git branch dev // 新建一个名称为 dev 的分支

3. 切换分支

当我们创建完分支以后,我们需要切换到新建的分支,否则,所有的修改,还是在原来的分支上。事实上,所有的改动,只能影响到当前所在的分支。

1
git checkout dev // 新建完 dev 分支以后,通过该命令切换到 dev 分支

4. 创建并切换分支

git checkout -b dev // 新建 dev 分支,并切换到该分支上
这个命令合并了前两个独立的命令,平常使用中一般这样使用。

5. 合并分支

当我们修复完成一个 Bug,或者开发完成一个新特性,我们就会把相关的 Bug 或者 特性的上修改合并回原来的主分支上,这时候就需要 git merge 来做分支的合并。

首先需要切换回最终要合并到的分支,如 master:

1
2
git checkout master        // 切换回 master 分支
git merge dev // 将 dev 分钟中的修改合并回 master 分支

合并回主分支的时候,后面可能会面临到冲突的问题。冲突的解决暂不在这里说明。

6. 删除分支

当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可以删除它。

1
git branch -d dev // 删除 dev 分支

远程仓库

上面的所有命令都是针对本地仓库的操作。当我们希望多个人来协作时,会将代码发布到一个统一的远程仓库,然后多个人在本地操作以后,在推送到远程仓库。其他人协作时,需要先同步远程仓库的内容,再推送自己的修改。

1. 从远程仓库克隆

如果你本地没有仓库,希望从已有的远程仓库上复制一份代码,那么你需要 git clone。

1
2
git clone https://github.com/git/git.git     // 通过 https 协议,克隆 Github 上 git 仓库的源码
git clone linfuyan@github.com/git/git.git // 通过 ssh 协议,克隆 Github 上 git 仓库的源码

注意: git clone 后面的仓库地址,可以支持多种协议,如 https, ssh 等。

2. 添加远程仓库

如果你已经有了一个本地仓库,如之前创建的 git-guide,然后你打算将它发布到远程,供其他人协作。那么使用:

1
git remote add origin your_remote_git_repo // 为本地仓库添加远程仓库

3. 推送本地的内容到远程仓库

当本地仓库中,代码完成提交,就需要将代码等推送到远程仓库,这样其他协作人员可以从远程仓库同步内容。

1
2
git push -u origin master // 第一次推送时使用,可以简化后面的推送或者拉取命令使用
git push origin master // 将本地 master 分支推送到 origin 远程分支

注意: git push -u origin master,第一次使用时,带上 -u 参数,在将本地的 master 分支推送到远程新的 master 分支的同时,还会把本地的 master 分支和远程的 master 分支关联起来。

4. 从远程仓库获取最新内容

在多人协作过程中,当自己完成了本地仓库中的提交,想要向远程仓库推送前,需要先获取到远程仓库的最新内容。

可以通过 git fetch 和 git pull 来获取远程仓库的内容。

1
2
git fetch origin master    
git pull origin master

git fetch 和 git pull 之间的区别:

1
2
git fetch 是仅仅获取远程仓库的更新内容,并不会自动做合并。
git pull 在获取远程仓库的内容后,会自动做合并,可以看成 git fetch 之后 git merge

注意:建议多使用 git fetch。

5. 查看远程仓库信息

1
git remote [-v] // 显示远程仓库信息

6. 建立本地分支和远程分支的关联

在本地仓库中的分支和远程仓库中的分支是对应的。一般情况下,远程仓库中的分支名称和本地仓库中的分支名称是一致的。

有的时候,我们会需要指定本地分支与远程分支的关联。

1
git branch --set-upstream 'local_branch' origin/remote_branch

7. 修改本地仓库对应的远程仓库地址

当远程的仓库地址发生变化时,需要修改本地仓库对应的远程仓库的地址。主要应用在工程迁移过程中。

1
git remote set-url origin url

标签管理

在项目开发过程中,当一个版本发布完成时,是需要对代码打上标签,便于后续检索。获取处于其他的原因,需要对某个提交打上特定的标签。

1. 创建标签

1
git tag -a 'tagname' -m 'comment' 'commit_id'

-a 参数指定标签名, -m 添加备注信息, ‘commit_id’ 指定打标签的提交。

2. 查看所有标签

1
git tag // 查看本地仓库中的所有标签

3. 查看具体标签信息

1
git show tagname

4. 删除本地标签

如果打的标签出错,或者不在需要某个标签,则可以删除它。

1
git tag -d tagname

5. 删除远程标签

1
2
3
4
5
git push origin :refs/tags/tagname

git push origin --delete tagname

git push origin :tagname

6. 推送标签到远程仓库

打完标签以后,有需要推送到远程仓库。

6.1 推送单个标签到远程仓库

1
git push origin tagname

6.2 一次性推送所有标签到远程仓库。

1
git push origin --tags

进阶操作

1. 临时保存修改

在执行很多的 Git 操作的时候,是需要保持当前操作的仓库/分支处于 clean 状态,及没有未提交的修改。如 git pull, git merge 等等,如果有未提交的修改,这些将无法操作。

但是做这些事情的时候,你可能修改了比较多的代码,却又不想丢弃它。那么,你需要把这些修改临时保存起来,这就需要用到 git stash。

1.1 临时保存修改,这样仓库就可以回到 clean 状态。

1
git stash // 保存本地仓库中的临时修改。

注意:可以多次的 git stash 来保存不同的临时修改。
1.2 查看临时保存。当你临时保存以后,后面还是要取回来的,那它们在哪里呢?

1
git stash list // 显示所有临时修改

1.3 当我们处理完其他操作时,想要恢复临时保存的修改。

1
2
git stash apply        // 恢复所有保存的临时修改
git stash pop // 恢复最近一次保存的临时修改

1.4 或者,我们后面觉得临时保存不想要了,那可以丢弃它。

1
git stash clear // 丢弃所有保存的临时修改

命令集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
git config --global user.name "xxx"                       # 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件
git config -l # 查看所有配置

git config --global core.editor vim # 编辑器
git config --global color.ui true # git status等命令自动着色
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global --unset http.proxy # remove proxy configuration on git

git init # 创建初始化新仓库
git clone git@github.com:aria2/aria2.git # clone远程仓库
git status # 查看当前版本状态(是否修改)
git add xyz # 添加xyz文件至index
git add . # 增加当前子目录下所有更改过的文件至index
git commit -m 'xxx' # 提交
git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改)
git commit -am 'xxx' # 将add和commit合为一步
git rm xxx # 删除index中的文件
git rm -r * # 递归删除
git log # 显示提交日志
git log -1 # 显示1行日志 -n为n行
git log --stat # 显示提交日志及相关变动文件
git log -p -m
git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容
git show dfb02 # 可只用commitid的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git tag # 显示已存在的tag
git tag -a v2.0 -m 'xxx' # 增加v2.0的tag
git show v2.0 # 显示v2.0的日志及详细内容
git log v2.0 # 显示v2.0的日志

git diff # 显示所有未添加至index的变更
git diff --cached # 显示所有已添加index但还未commit的变更
git diff HEAD^ # 比较与上一个版本的差异
git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异
git diff origin/master..master # 比较远程分支master上有本地分支master上没有的
git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用于push/pull/fetch)

git branch # 显示本地分支
git branch --contains 50089 # 显示包含提交50089的分支
git branch -a # 显示所有分支
git branch -r # 显示所有原创分支
git branch --merged # 显示所有已合并到当前分支的分支
git branch --no-merged # 显示所有未合并到当前分支的分支
git branch -m master master_copy # 本地分支改名
git checkout -b master_copy # 从当前分支创建新分支master_copy并检出
git checkout -b master master_copy # 上面的完整版
git checkout features/performance # 检出已存在的features/performance分支
git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支
git checkout v2.0 # 检出版本v2.0
git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出
git checkout -- README # 检出head版本的README文件(可用于修改错误回退)
git merge origin/master # 合并远程master分支至当前分支
git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改
git push origin master # 将当前分支push到远程master分支
git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支
git push --tags # 把所有tag推送到远程仓库
git fetch # 获取所有远程分支(不更新本地分支,另需merge)
git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支
git pull origin master # 获取远程分支master并merge到当前分支
git mv README README2 # 重命名文件README为README2
git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退)
git rebase
git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933
git ls-files # 列出git index包含的文件
git show-branch # 图示当前分支历史
git show-branch --all # 图示所有分支历史
git whatchanged # 显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD # 内部命令:显示某个git对象
git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH
git reflog # 显示所有提交,包括孤立节点
git show HEAD@{5}
git show master@{yesterday} # 显示master分支昨天的状态
git log --pretty=format:'%h %s' --graph # 图示提交日志
git show HEAD~3
git show -s --pretty=raw 2be7fcb476
git stash # 暂存当前修改,将所有至为HEAD状态
git stash list # 查看所有暂存
git stash show -p stash@{0} # 参考第一次暂存
git stash apply stash@{0} # 应用第一次暂存
git grep "delete from" # 文件中搜索文本“delete from”
git grep -e '#define' --and -e SORT_DIRENT
git gc
git fsck

https://gist.github.com/guweigang/9848271#file-git_toturial-L10
https://segmentfault.com/a/1190000011673663#articleHeader2