Git / Sourcetree基本的分支和合并
新手提问! 我刚开始使用Git,特别是Sourcetree,它似乎是一个很好的可视化应用程序。 在我的第一个testing中,它进行得非常好,分支和合并(参见上图)。 我知道这个结构意味着我正在使用开发和主分支错误的方式,但这很好,因为至less它的工作。
在我第二次尝试的时候,我似乎无法想像任何分支,即使他们两人都在做这些分支,他们似乎出现在一个单独的分支中(“7”字条),当我尝试合并似乎没有发生。 希望第二个截图足以让别人告诉我这里发生了什么? 如果没有,我会尝试,给一些更多的信息。
我现在只是在玩弄,所以还是要掌握正确的工作stream程,只是试图通过Sourcetree以一致的方式来实现基本的分支和合并操作。 任何帮助将不胜感激。
在第二张图中有分支。 本地你有2个分支, 掌握和发展 。 尽pipe这两个分支都在同一个承诺。 如果您想像第一张图片那样“看到分支”,您可以对开发做出承诺,但是图表仍然是线性的。 如果你愿意的话,你可以把 开发合并为主 。
如果你想看到graphics分歧,也可以尝试在master上进行提交。 然后你会开始看到更像第一张照片的东西。
为了了解git如何与这样的可视化程序一起工作,我build议你按照我上面的build议做一些动作,并在每个中间步骤看一下graphics。
这里有一些事情要做 首先,理解Git中的分支实际上只是被粘在一个特定的提交上的“标签”是有用的,当你提交到分支时,这些标签会自动移动; Git会用新的提交哈希创build新的提交,并更新分支/标签以指向新的提交。 (你可能会问,这与标签有什么不同呢?标签粘在同一个提交上,而且在你调用git commit时不会得到更新。)
当你创build一个新的分支时,发生的一切就是Git创build一个新的标签,指向你所在的同一个提交。 只有在检出此新分支时创build新提交时,才会看到来自其他分支的新分支分歧。
当你重新开始合并分支时,真正的困惑就开始了,这很大程度上是由于Git所谓的“快进合并”,这是默认的 。 让我们拿你的第二个例子,想象你的主人和发展是最初的起源/主人和起源/发展的地方:
当你要求Git把一个分支合并到另一个分支时,Git会去找出它需要做些什么来获得这些分支到目标分支的差异。 假设您想要将您开发的更改合并为主,那么您应该告诉git:
$ git checkout master $ git merge develop
Git会看看分支机构,看到发展只是less数几个提交的主人,但没有比这更复杂的了。 所以,它会做一个“快进”的合并,只要把主标签贴在发展指向的提交上。 使命完成了,只有在发展之前的变化现在也在掌握之中。
如果每个分支都有额外的提交,就像在你把第一个例子合并成为开发之前一样,“更复杂的事情”正在进行。 你对master做了一个commit,然后做了一个git checkout开发,在那里做了一个commit, 然后让Git把master重新合并为develop。 Git现在不再可以通过移动分支标签来“欺骗”了。 它需要弄清楚如何将两个分支的变化统一到其控制下的文件的单一状态(现在让我们假设它总是能够做到这一点,这与事实并不遥远;相当不错,如果不行的话,就会出现合并冲突,实际上并不如听起来那么糟糕)。
合并后的新内容既不是第一个分支的最后一个状态,也不是第二个分支的状态。 所以,它需要用一个全新的提交来表示,这就是你在第一个例子的顶部看到的; Git创build了它所谓的“合并提交”来表示新的状态,每个分支的更改合并为一个状态。
最后,您可以强制Git始终创build合并提交,尽pipe严格来说,技术上并不需要。 在命令行中,你可以用–no-ff这个标志来做到这一点,因为没有快进。 graphics客户端将有一个checkbox,将完成相同的事情(在SourceTree中,它现在被标记为“即使通过快进合并parsing创build提交”)。 许多人(包括我自己)实际上build议只合并–no-ff,因为这样合并的行为总是logging在历史logging中,而不pipe技术上是否在技术上只是移动分支指针。
我遇到了同样的问题,发现SourceTree中的一个设置是“合并时不要快进,始终创build提交”。 确保选中,你会看到他们的分支结构。
此设置位于首选项的Git选项卡上。
您可以通过在工具/选项中启用“合并时不要快进,始终创build提交”来防止分支永久消失在源代码树中。
如果您要决定每个合并操作,则在“合并”对话框中有一个选项“ 即使可以快进也创build新的提交 ”。
另外我build议你参考Eelke Blok的技术细节。