在 Git 中,分支只是指向随着新提交添加到该分支而移动的提交的指针。换句话说,一旦指针移动了,之前的提交在那个分支上就没有记忆了。起初,这对我来说是一个很难理解的概念。或许就是这个名字:“branch”让我想到了由边连接的多个节点,但在 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.
人们很容易误以为“(feature)”注释以某种方式指代右侧的那个分支,但事实并非如此:它只是指提交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,它仅记录您正在切换到/从哪些分支。它主要用于灾难恢复(哎呀,我不是故意要删除那个分支!),它对于你所说的那种分支历史并没有真正的用处。