为什么在删除分支时仍保留git分支历史记录

时间:2015-07-07 12:09:54

标签: git merge branch

我在git中删除了一个分支,并通过运行确认它不再存在:

git branch -a

但是,我仍然能够使用我的Git GUI工具查看分支,尽管没有标记。

branch

这是标准行为吗?我期待那个分支的历史成为它合并的分支的一部分。

1 个答案:

答案 0 :(得分:4)

该分支的历史记录是它合并到的分支的一部分。如果您从合并到您的分支运行git log,则会在您合并的分支中看到提交。它们是历史的一部分。

那你为什么还要#34;看到分支"?因为你看到的是一系列祖先 - 后裔关系,而不是分支。

A"分支"在git中不是一系列提交。我们这样对待它,因为它对我们的心智模型有意义,但分支只是一个可移动的标签。它是分配给特定提交的名称。当您在分支X上工作并创建新的提交时,git会创建该提交,将其父级设置为X指向的当前提交,然后将分支X移动到指向新提交。

所以,假设你是分公司的主人。分支主机当前是pointint提交1(我将使用数字来引用提交; git使用哈希,但它没有区别)。您进行了一些更改,运行git commit。这意味着git创建一个新提交,提交2.提交2的父提交1.然后移动标记主提交2.因此,如果你打开你的git GUI工具,你会看到master在提交2,然后在它下面提交1行。这是因为1是2的父提交。

所以现在假设您创建了一个新分支。您运行git branch new; git checkout new。现在你站在新的分店。 Branch new是由你创建的,所以它也是pointint to commit 2.在你的GUI工具中,你会看到master和new都指向commit 2。

现在进行一些更改,运行git commit。这将创建commit 3,它将commit 2作为其父级,并将branch标签new移动到3. Branch Branch master仍然指向2。

现在回到主人git checkout master,然后进行一些更改git commit。同样,新的提交(让我们说4),这个也有2作为其父。在GUI工具中,您可以看到3和4都有一条线将它们连接到2。

现在,与您的问题相关的部分。仍在掌握中,运行git merge new。这将合并到分支新。那么git中的合并是什么?合并只是一个提交,而不是一个父提交,有两个父提交。当你运行git merge new git所做的是创建一个新的提交5,并设置提交3和4 作为其父项(4因为它是一个主要指向的,3因为它是一个新的要点)。因此,如果您打开GUI工具,您将看到在这种情况下您期望看到的确切内容:master指向5,两个行,1到4和1到3,因为两个提交都是5个人的父母。既然你没有告诉git,你仍然会看到新的分支标记提交3。

现在,您创建的所有git历史记录都完全独立于分支,如果删除分支,它仍然存在。请记住,分支只是附加到提交的标记。删除分支不会删除提交或其任何历史记录,只是删除标记。所以现在你可以运行git branch -d new,而新的分支将会消失。但是,提交3,即#34;在分支新"中仍将存在。提交3的父母仍然是2,提交3仍然是5的父母之一。那么如果你看一下GUI工具会发生什么?好吧,你会看到提交5标记为主,然后两行出来,标记提交4和3作为其父,然后从4和3标记2作为其父,然后从2到1的行那么与删除新分支之前完全一样。

我希望这说清楚。