虽然Git是一个非常强大的工具,但是我相信大部分同学在学习Git的时候都会觉得很吃力~我总是习惯于复现学过的知识,Git也是一样的:当我们执行switchbranch命令时,分支是如何交互的呢?它如何影响历史提交?当我在master分支上强制reset强制push到远端,删除了.git文件夹,为什么我的同事哭了??于是就有了把这些命令做成动画的想法!由于篇幅有限,本文主要介绍一些常用命令的默认行为~MergeRebaseResetRevertCherry-PickFetchPullReflog合并(Merging)使用多个分支可以方便我们相互隔离,防止误提交到生产环境。对分支模型感兴趣的小伙伴也可以看作者之前的文章:使用git-flow来自动化你的git工作流当我们的一个功能开发完成后,我们需要将这些改变应用到生产环境中。这适用的方法之一是gitmerge!这个命令有两种类型:一种称为快进模式,另一种称为非快进模式。现在看不懂也没关系,我们先对比一下这两个选项。以下示例将master称为master分支或当前分支。快进(--ff)当主分支与被合并的分支相比没有额外的提交时,可以使用快进合并。吉特是。.懒惰,它会首先尝试使用最简单的快进选项。这个方法并没有创建新的commit,可以说只是把我们的commit和HEAD指针移动了一个位置。完美的!现在我们所有的改动都从dev分支合并到master分支了~no-fast-forward(--no-ff)没有额外commit的主分支当然是最好的情况,但是在多人协作的情况下,这种情况当然很少见,毕竟大家都在加班啊~然后如果主分支有额外的提交,git在合并的时候会使用no-fast-forward选项。当使用no-fast-forward选项时,Git在当前分支上创建一个新的合并提交。而这个提交的上层同时指向了当前分支和要合并的分支!详见动图:没什么大不了的,完美合并!master分支现在包含来自dev分支的所有提交。合并冲突(MergeConflicts)虽然Git对于合并的默认行为非常好,但总有需要我们自己解决的时候。例如,当两个分支上都有新的提交时,同一文件的同一行内容同时被修改,或者一个文件在一个分支上被删除,但是另一个分支修改了那个文件等。这些情况下,Git要求我们提供帮助。假设我们同时修改了两个分支上的README.md文件。如果我们想将dev合并到master中,这会产生冲突:因为Git不知道你是否想要Hello!或嘿!?所以当我们合并分支的时候,Git会准确的告诉我们哪里发生了冲突。我们需要手动删除不需要的地方,保存修改,然后提交。竖起大拇指!引起矛盾虽然很烦人,但也是顺理成章的。机器毕竟是机器,它肯定不能决定哪些内容需要帮我们保留~变基(Rebasing)我们刚刚看到了gitmerge的合并过程。将更改从一个分支应用到另一个分支的另一种方法是:gitrebase。关于这两个命令的区别,还可以阅读作者之前的文章:带你了解Git中的Merge和Rebase简单来说:Merge保留历史,而Rebase重写历史。gitrebase将一个分支(dev)的提交复制到另一个分支(master)的顶部。完美,现在我们已经将dev的起点设置为新的master分支。与Merge相比,一个很大的不同是Git不会查找哪些文件需要保留,哪些不需要。我们的dev分支可以使用rebase来始终跟踪最新的master分支。这样就不会有冲突,同时会有线性的Git历史。图中的例子是以master作为dev的基础(基础分支)。在大型项目中,我们通常不会这样做。gitrebase会修改项目的历史,复制的commit也会生成新的hash值。当你在feature分支上工作,当master分支更新时,你可以使用rebase将master上的分支无缝更新到你的feature分支上!交互式变基(InteractiveRebase)在变基之前,我们还可以修改之前的提交,使用的是交互式变基。当您想要修改当前工作分支的某些提交时,交互式变基也很有用。对上次提交一共可以应用6个操作:reword:修改提交的消息(commitmessage)edit:修改提交内容squash:合并一次提交和之前的提交fixup:同squash,但丢弃提交消息exec:在你要rebase的submission上依次执行某个命令drop:删除某个submission就可以了!这样,我们就可以完全控制我们的提交。如果你需要删除一个commit,直接drop吧~或者如果我们需要合并多个commit来清理历史,没问题:interactiverebase给了我们很大的权力来控制commit,即使在你的分支上没问题目前正在研究。待续。由于原文太长,本文先说说前两个命令:Merge和Rebase。这两个也是Git分支操作中最重要的两个命令。在下一篇文章中,我们将继续讲剩下的命令。下面六个命令~跟着我了解更多~参考文章CS可视化:有用的Git命令
