图解 Git(转载 & 整理)

这篇博文是我对 图解 git 的整理,按照我自己的理解加入了一些注释,在这里首先要感谢原作者和翻译者为我们带来这么精彩的图文,下面是我的整理:

1. git 常用操作

图 1:git 常用操作 1
注意:图 1 所示的四条命令在工作目录、暂存区域(又叫索引)和历史仓库之间复制文件。

git add files # 把当前文件放入暂存区域
git commit # 给暂存区域生成快照并提交到历史仓库
git reset -- files # 撤销最后一次 git add files,可用 git reset 撤销所有暂存区域文件
git checkout -- files # 把文件从暂存区域复制到工作目录,用来丢弃本地修改

图 2: git 常用操作 2
注意:图 2 所示的命令是图 1 所示命令的简化版本。

git commit -am "some message" # 相当于运行 git add 将所有文件加入暂存区域再运行 git commit
git checkout HEAD -- files # 回滚并复制最后一次提交

2. git diff:查看两次提交之间的变动

图 3:git diff 操作
注意:图 3 显示了 git diff 命令几种不同的用法,从图中就比较容易理解了。

3. git commit:新建提交(3种常见情况)

(1)普通提交:

图 4:git commit 操作 1

(2)在当前分支某次提交的祖父节点上:

图 5:git commit 操作 2

(3)更改一次提交:

图 6:git commit 操作 3
注意:使用 –ammend 参数,git 会使用与当前提交相同的父节点重新进行一次提交,旧的提交会被取消,多用于修改 comment。

4. git checkout:从历史仓库(或者暂存区域)中拷贝文件到工作目录或切换分支

(1)当前提交节点的父节点 HEAD~,如果命令中没有指定提交节点,则会从暂存区域中拷贝内容(参见常用操作):

图 7:git checkout 操作 1

(2)切换分支,当不指定文件名,而是给出一个(本地)分支时:

图 8:git checkout 操作 2

注意:新提交节点(图 8 中的 a47c3 )中的所有文件都会被复制(到暂存区域和工作目录中);只存在于老的提交节点(ed489)中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。

(3)其他情况:指定一个标签、远程分支、SHA-1 值或者类似 master~3 的标记

图 9:git checkout 操作 3

注意:这样的操作得到一个匿名分支,称作 detached HEAD(被分离的 HEAD 标识)。这样可以方便地在历史版本之间互相切换,例如你想要查看 1.6.6.1 版本,就可以运行 git checkout v1.6.6.1(v1.6.6.1 是一个标签),查看之后可以切换回 master 分支(git checkout master)或者其他分支。当 HEAD 处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支:

图 10:git checkout 操作 4

这种情况下,一旦此后你切换到别的分支(例如 master),那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了:

图 11:git checkout 操作 5

但是,如果你想保存这个状态,可以用命令 git checkout -b name 来创建一个新的分支:

图 12:git checkout 操作 6

5. git reset:将当前分支指向另一某次提交,并且有选择地变动工作目录和索引

图 13:git reset 操作 1

注意:如果不给选项,当前分支(HEAD)指该提交,从历史仓库中复制文件到索引但不变动工作目录;如果用 –hard 选项,工作目录也更新;如果用 –soft 选项,两者都不变。如果没有给出提交的版本号(即 git reset),默认指当前分支的最新提交即 HEAD:

图 14:git reset 操作 2

6. git merge:分支合并,合并前索引必须和当前提交相同

(1)如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做

(2)当前提交是另一个分支的祖父节点,导致 fast-forward 合并(只是简单的移动指向并生成一次新提交):

图 15:git merge 操作 1

(3)真正的分支合并:

图 16:git merge 操作 2
注意:如图 16 所示,默认把当前提交(ed489)和另一个提交(33104)以及他们的共同祖父节点(b325c)进行一次三方合并(先保存工作目录和索引,然后以 ed489 和 33104 为父节点做一次新提交):

7. git cherry-pick:复制一个提交节点并在当前分支做一次完全一样的新提交

图 17:git cherry-pick 操作

8. git rebase:衍合,在当前分支上重演另一个分支的历史(提交历史是线性的)

图 18:git rebase 操作 1

注意:要限制回滚范围,使用 –onto 选项,下面的命令在 master 分支上重演当前分支从 169a6 以来的最近几个提交(2c33a):

图 19:git rebase 操作 2

0%