0. Git 的相关原理
Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!
Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。
Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有父节点的原因,我们会在图示中用箭头来表示这种关系。(注意被箭头指向的是父节点)
1. git commit (提交代码到本地)
如图所示,目前有 2 次提交记录(这里用C0,C1 表示,实际中应该是一串哈希值),我们在「master」分支下使用命令行。
git commit -m "First log"
C2 出现了,也就是说,版本更新到 C2了。
当然我们可以继续在 C2 提交代码。
这样 C3 就出现了,这就是「commit」
我们的每一次提交都会生成一个提交记录。
2. git branch (创建本地分支)
那么我们如何再新建一条分支用来修复 bug 呢? 这里我创建了名为 「fixbug」 的分支
首先,我们可以通过下面命令来创建分支
git branch fixbug
然后再通过下面命令来切换到刚刚新建的分支
git checkout fixbug
最后我们在「fixbug」分支上提交一次代码,当前的状态如下图所示
当然创建分支和切换分支可以用一条命令来达到,如下
git checkout -b fixbug
有小伙伴注意到 「fixbug 」分支上的「 * 」星号了吗?这表示当前所在的分支是 「fixbug 」
3. git merge (合并分支)
当有两条分支各自开发的内容需要合并的时候就需要合并分支了。
如下图,我在 C1 新建了分支「fixbug」并提交了一次,主分支「master」也提交了一次。
这时候他们两者的内容是不同的,如果业务需要合并代码。
我们首先切换到主分支上,如图,「master」旁边有星号,然后通过下边的命令行。
git merge fixbug
关于谁合并谁的问题,我们只要知道,发起合并所在的分支是强势方,另一方是被合并方。
这样我们就简单的合并了,当然这里还没讲到关于冲突的问题。
4. git rebase (合并分支)
第二种合并分支的方法就是 rebase。
rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
他的优点是如果项目一直使用 rebase 那么提交历史就会很清晰,只有一条主线,而不像 merge 一样合并来合并去。
下图命令是在 「bugFix」 所在的分支下使用,将他复制一份到「master」分支后。
这样「bugFix」就有了「master」 里面的所有内容了。
这里我们也没有考虑冲突问题。
git rebase master
5. HEAD
什么是 「HEAD」?
我们在版本控制的日志中,经常会看到一个「HEAD」标识,其实这个「HEAD」的意思类似于游标,你当前在哪个分支,他就会出现在对应的分支上。
即:「HEAD 」指向的就是当前所在的分支。
「HEAD」一般指向分支,而分支指向提交记录,所以正常情况下「HEAD」跟随着分支一起动,但我们也可以使「HEAD」指向具体的提交记录。
在这里我们使用
git checkout C6
如图切换到了 C6 的提交记录上去了,这时候「HEAD」就指向了 C6
6. 相对引用
正常情况下我们要切换到某个提交记录都是要通过哈希值来确定。
git checkout C0
当然我们还有另一种方式,使用相对引用
1.使用 ^ 向上移动 1 个提交记录,如下图,我们在 C1 使用了如下代码,「HEAD 」指向了 C0,如果重复使用会一层层往上。
git checkout HEAD^
2.使用 ~<num>
向上移动多个提交记录,如 ~3
git checkout HEAD~3
7. 强制修改分支位置
可以直接使用 -f 选项让分支指向另一个提交。例如:
当「master」 分支指向 C6 时。
下面的命令会将 「master 」分支强制指向「HEAD 」的第 3 级父提交。
git branch -f master HEAD~3
当然这种形式也是支持的。
git branch -f master HEAD^
如果什么都不填,「master 」就会和 「HEAD」指向同一个提交。
git branch -f master
8.代码撤销
主要通过下面两种方式来进行撤销 git reset,git revert。
git reset 是通过回退到某个提交记录来实现撤销的,但是这种方式对于远程分支来说是无效的。
如图我们的本地分支在 C3 的提交记录上,这时候我们想撤销回到 C1 就可以使用
git reset HEAD~1
而 git revert 是在我们要撤销的提交记录后多一个新的提交,新提交记录 C2' 引入了更改 ,这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的,这样也相当于对代码进行了撤销。
git revert HEAD
9. 整理提交记录
如果你想将其他分支的一些提交复制到当前所在的位置也就是「HEAD」下面的话, cherry-pick 是最直接的方式。如下图我们把 C2 和 C3 的提交记录复制到 C5 下
git cherry-pick C2 C3
10. 交互式的 rebase
当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了。
但是如果你不清楚你想要的提交记录的哈希值呢? 我们可以利用交互式的 rebase
interactive 的 rebase 命令, 简写为 -i
使用该条命令,可以使当前分支下,任意条数的提交记录被直接复制下来,然后再另外的地方粘贴。当然期间还可以修改顺序,通过更改 pick 的状态删除不想要的提交,还能把多个提交记录合并。
我们在「master」上使用下面命令。
git rebase -i HEAD~4
参考 https://github.com/pcottle/learnGitBranching
喜欢的可以关注一下咯
扫描二维码更多精彩哦~星球圈子是免费的。