25

我喜欢查看我的 git 日志的方式是

git log --graph --oneline --all --decorate

在我发现它的输出有用的其他事情中,有分支名称。但是,如果我删除一个分支,那么上面就不再显示它们了。我的意思是看到一堆东西,比如:

* 87c3294 (QueueExample) blah blah

比一堆更具表现力(尤其是当列表变长时)

* 87c3294 blah blah

这个问题的答案,特别是这个评论似乎暗示分支名称仍然是“某处”。

如何将它们打印在输出中git log或至少以其他方式打印?

或者,我怎样才能从 git branch 的输出中删除分支,同时仍然保留它们以达到目的git log

4

4 回答 4

37

在 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,它只记录您正在切换到/从哪些分支。它主要用于灾难恢复(哎呀,我不是要删除那个分支!),而且它对于你正在谈论的那种分支历史并不是真的有用。

于 2012-08-24T18:40:43.283 回答
4

用于git log --merges列出合并提交。已删除(但合并)的分支的名称将与其他合并分支的名称一起显示。

于 2018-10-22T02:04:55.607 回答
3

该评论正在谈论合并提交消息,例如Merge QueueExample into master。当你删除一个分支时,这个分支就消失了。如果您想使用 维护日志的主题视图,请--decorate尝试改用标签(或不要删除分支)。

于 2012-08-24T18:25:22.537 回答
0

如果您在本地存储库中删除了一个分支,它仍然存在于该存储库的任何其他克隆中。如果您将该删除推送到其他存储库,则分支本身(只是一个方便命名的指向特定提交的指针)可能会不复存在。但是,它指向的提交仍然会存在一段时间,即使绝对没有任何东西指向它。如果它已被合并到其他分支中,以便该提交构成某个其他分支的祖先的一部分,那么只要它仍然可以从现有分支访问,它就会保留下来。然而,追踪它有点棘手。早期,它会在你的 HEAD reflog 中出现一段时间,但最终它可能会从那里消失。

如果您希望它们始终出现在git log输出中,请不要删除它们。或者,用标签替换分支指针,以指向删除之前分支所在的位置。

于 2012-08-24T18:58:06.180 回答