Git / Sourcetree基本分支和合并

时间:2013-05-07 05:32:20

标签: git atlassian-sourcetree

新手提问!!!我刚刚开始使用Git,特别是Sourcetree,它似乎是一个很好的应用程序,可视化它。在我的第一次测试中,它很顺利,分支和合并(参见顶部图表)。我知道这个结构意味着我正在以错误的方式使用开发和主分支,但这很好,因为至少它有效。

在我的第二次尝试中,我似乎无法想象任何分支,即使在两者中都进行了工作,它们似乎出现在一个单独的分支中(带有“7前置”注释),当我尝试合并似乎什么都没发生。希望第二个截图足以让某人告诉我这里发生了什么?如果不是,我会尝试提供更多信息。

我现在只是玩游戏,所以仍然要掌握正确的工作流程,只是尝试通过Sourcetree以一致的方式进行基本的分支和合并操作。任何帮助将不胜感激。

enter image description here

4 个答案:

答案 0 :(得分:13)

在第二张图片中有分支。在本地你有2个分支,& 开发。两个分支都在同一个提交中休息。如果你想在第一张图片中“看到分支”,你可以在 develop 上进行提交,但是图表仍然是线性的。如果需要,您将能够合并

如果您希望看到图表发散,请尝试在 master 上提交。然后你会开始看到更像第一张照片的东西。

为了了解git如何使用这样的可视化程序,我建议你按照我上面的建议进行操作,并在每个中间步骤看一下图。

答案 1 :(得分:4)

这里发生了一些事情。首先,理解Git中的分支是真正的标签"是有用的。那些坚持特定提交的东西,当你提交分支时会自动移动; Git将使用新的提交哈希创建新提交,并更新分支/标签以指向新提交。 (你可能会问,这与标签有什么不同呢?标签粘贴在同一个提交中,并且在你调用git commit时不会得到更新。)

当你创建一个新分支时,所有发生的事情是Git创建一个新标签,指向你所在的同一个提交。只有在签出此新分支时创建新提交时,您是否会看到新分支与其他分支不同。

当你再次开始合并分支时,真正的困惑开始了,这主要是由于Git称之为#34;快速合并"这是一个奇怪的事情,它默认情况下 。让我们来看看你的第二个例子,想象你的主人和开发者是最初的起源/主人和起源/发展的地方:

Simple linear branching example

当你要求Git将一个分支合并到另一个分支时,Git会去找出它需要做些什么来区分这些分支到目标分支。让我们假设您想将您开发的更改合并为master,所以你告诉git:

$ git checkout master
$ git merge develop

Git会看一下分支,看看开发只是提前几个提交,但没有比那更复杂的了。所以,它会做一个"快进"通过简单地获取主标签并将其粘贴到develop指向的提交中进行合并。完成任务,之前发展的变化现在也是掌握的。

每个分支都应该有额外的提交,比如在你将master合并到develop之前的第一个例子中,"更复杂的东西" 正在进行中。你在master上做了一个提交,然后做了一个git checkout开发,在那里做了一个提交,然后让Git将master合并回develop。 Git现在不能再欺骗"只需移动分支标签即可。它需要弄清楚如何将来自两个分支的变化统一到其控制下的文件的单个状态中(让我们假设,现在,它始终能够做到这一点,这远不是那么远真相;它非常擅长。如果它不能,你就会发生合并冲突,这实际上没有听起来那么糟糕)。

合并后的新内容既不是第一个分支的最后一个状态,也不是第二个分支的状态。所以,它需要用一个全新的提交来表示,这是你在第一个例子的顶部看到的; Git创建了它所谓的" merge commit"表示新状态,每个分支的更改合并为一个状态。

最后,您可以强制Git始终创建合并提交,尽管严格地说,技术上是不需要的。在命令行中,您可以使用标志--no-ff执行此操作,以便不进行快进。图形客户端将有一个完成相同操作的复选框(在SourceTree中,它当前标记为"即使通过快进&#34解决合并,也创建提交)。很多人(包括我自己)实际上建议只合并--no-ff,因为这样的合并行为总是记录在历史记录中,无论技术上是否可以只是移动分支指针。

答案 2 :(得分:2)

我遇到了同样的问题,发现SourceTree中有一个设置为“合并时不要快进,总是创建提交”。确保已选中,您将看到它们的分支结构。

此设置位于首选项的Git选项卡中。

答案 3 :(得分:1)

您可以通过在工具/选项中启用“合并时不要快进,始终创建提交”来阻止分支在源树中永久消失。

Disabling fast-forward when merging permanently in Source Tree

如果您想决定每个合并操作,在合并对话框中有一个选项“创建新提交,即使可以快进”。

Disable fast-forward when merging during each merge operation in Source Tree

另外,我建议您提及Eelke Blokanswer以获取技术细节。