在 Git 中,分支只是指向随着新提交添加到该分支而移动的提交的指针。换句话说,一旦指针移动了,之前的提交在那个分支上就没有记忆了。起初,这对我来说是一个很难理解的概念。也许是这个名字:“分支”让我想到了由边连接的多个节点,但在 Git 中,分支实际上只是一个指向节点的移动指针。
git log
用指向它们的任何分支尽职地注释提交。例如,我创建了一个 repo,在分支 master 上提交了 "one"、"two" 和 "three",在分支功能上提交了 "uno"、"dos" 和 "tres",然后将功能合并回 master。这是git log
在我删除分支之前告诉我的内容:
* 9eb6e93 (HEAD, master) Merge branch 'feature'
|\
| * 523e2ac (feature) tres
| * 6d3cc0f dos
| * 1bc0b2e uno
* | d39734b three
* | 779d37b two
* | facbcbf one
|/
* 58848f4 Initial commit.
很容易误以为“(功能)”注释以某种方式指代右侧的那个分支,但事实并非如此:它只是指代提交523e2ac
。
请注意,默认情况下,当 Git 创建合并提交(9eb6e93
在我们的例子中)时,它会自动添加一条注释,说明它正在合并分支“功能”,因此有一些记录表明那里有一个分支,但这只是一条注释,仅此而已。
当我删除分支“功能”时,除了提交523e2ac
不再标有“(功能)”之外,没有任何变化:
* 9eb6e93 (HEAD, master) Merge branch 'feature'
|\
| * 523e2ac tres
| * 6d3cc0f dos
| * 1bc0b2e uno
* | d39734b three
* | 779d37b two
* | facbcbf one
|/
* 58848f4 Initial commit.
因此,要回答您的问题,不,一旦您删除了一个分支,您就无法git log
使用该分支名称来注释提交(因为它不再存在)。但是,您有一些选择:
不要删除分支。留下树枝并没有什么坏处,只是它会在你输入时弄乱你的屏幕git branch
。此外,您可能希望重新使用分支名称,如果您不删除分支,以后可能会导致问题。
在删除分支之前标记提交。标签实际上是一个不会移动的分支。您甚至可以使标签名称与分支名称相同。
对合并提交的自动评论感到满意。如前所述,当 Git 进行合并时,默认情况下,它会在提交注释中引用要合并的分支的名称,从而创建分支存在的记录。对我来说,这是最干净的解决方案,基于 Git 中分支的工作方式。由于分支并不真正指代一系列提交,因此分支的存在实际上只是具有历史意义。
分支历史可能存在的另一个地方是您的 reflog,它只记录您正在切换到/从哪些分支。它主要用于灾难恢复(哎呀,我不是要删除那个分支!),而且它对于你正在谈论的那种分支历史并不是真的有用。