Git是什么?代码管理工具。Git是怎么实现的?我们不需要关心。我们只要把目光盯着每个commit,知道git的每个命令都是为此服务的,足矣。
正如我在模型里形容的,git的每个分支都可以理解为一根竹子,而每个commit就是竹子的一节,这就是我们需要的全部信息。merge、rebase、cherry-pick就是维护和改造commit的三把利器。
merge就是从两根竹子的根部,一节节向上对比它们的不同,当有不同发生时,有两条路走就两条路都保留,并用一个新的节点糅合起来,只有一条路就直接走过去,当然两条路可能有冲突,解决一下就好了。
rebase也同样是从两根竹子的根部出发,只不过当遇到不同时,就把你的这条路多出的部分剪掉,先把别人的放进来,再一节一节安回去,因为每一节都重新安,所以commitId都会变,而且每一节都有可能产生冲突,理论上糟糕的情况是有多少节竹子要安,就得解决多少次冲突。所以务必勤快些,随时随地git pull --rebase
。
cherry-pick就简单了,不需要从竹子根部出发,只取需要的commit就行,它像是rebase的后半段,也有可能产生一堆冲突。。
除了merge的Non Fast Forward(非快进式合并),其他的所有方式都会丢失操作记录,所以一定要牢记自己的关注点是操作记录还是整洁。
还有一个概念需要了解一下,HEAD和FETCH_HEAD。HEAD就是头节点,是一个指针,也就是始终指向竹子上一节。FETCH_HEAD是当你执行 git fetch 时,拉取下来的代码的头结点。
只要真的把每个分支都想象成一根竹子,记得我上边说的区别,把自己当成git,你在操作git时就能游刃有余,遇到的大多数问题都有把握搞定,而不至于被git整的焦头烂额。大多数人遇到问题往往就是因为对git的理念不熟悉,不了解每条命令的目的造成的。包括之前的我也是,经常忙碌到后,发现自己渴求的不过是回到开始的状态,好给自己一次重新来过的机会。。
以下是我在平时会使用到的一些命令的总结,希望能够对大家有所帮助。
后演示一下 git rebase -i
和 git reflog
的作用。输入 git rebase -i HEAD~
会打开以下页面:
在选中范围内的commit会依次列出,前面有一个 pick 单词,替换这个单词为提示中的某一个就可以进行变更。例如改为 r 或者 reword,表示只修改commit message,保存之后git会再次弹出一个框,就可以修改对应的commit message了。
git reflog记录的是你的操作记录,而不是commit记录,这点一定要分清。以下就是一个示例:
这时候,你想回到哪一步,直接 git reset --hard [commitId]
就可以了,这是git为你提供的一份超级后悔药,请合理食用哦。
本文的分享到此就结束了,git还有很多五彩斑斓的命令,但是本文目的不在于把git的每个命令都介绍给你,遇到特定问题查一下资料就可以做到。我们是希望你能够理解git的主要目的,时刻谨记自己在操作哪根竹子,关注哪个竹节,不要陷于无穷无尽的命令中无法自拔,让git成为提高工作效率的利器,而不是你前进道路上的绊脚石。git的好处,使用越久就会越有体会,希望git能够陪伴你成长,记录你进步的旅途。