【问题标题】:how to get git log display name of (deleted) branches如何获取(已删除)分支的 git log 显示名称
【发布时间】:2012-08-24 18:05:20
【问题描述】:

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

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

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

* 87c3294 (QueueExample) blah blah

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

* 87c3294 blah blah

this question 尤其是this comment 的答案似乎暗示分支名称仍然是“某处”。

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

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

【问题讨论】:

    标签: git logging


    【解决方案1】:

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

    【讨论】:

    • “分支只是指向提交的指针” - +1。为了证明这一点,在 git 项目目录中,运行 ls .git/refs/heads。嘿看,你所有的分支都是文件!现在cat 这些文件之一。它仅包含特定提交的哈希。标签是相同的,在refs/tags。看到这让我真正理解了“一个分支实际上只是一个节点”这样的陈述是什么意思。
    • @Davide - 更多证据:cp ./git/refs/heads/master .git/refs/heads/fancypants。现在git branch。嘿看,一个新的分支,它似乎与master 拥有完全相同的血统!那是因为分支没有历史; commits 有历史和沿袭。分支只是提交的标签。
    • 嗨@EthanBrown,很好的答案,这个答案我。问题需要此答案的最后一部分:stackoverflow.com/q/1307114/634572
    • 谢谢@Dan,另一个问题很好......我认为其他海报已经涵盖了我会尝试的所有想法。
    【解决方案2】:

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

    【讨论】:

    • 这是一个有用的命令,但它似乎没有列出已删除分支的名称。我猜这仅适用于您保留默认列出合并分支名称的默认合并提交消息。如果您输入自己的提交消息,则不会保留要合并的分支的名称。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-12-06
        • 2010-12-22
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 2012-05-22
        • 2023-04-01
        • 2022-10-12
        • 1970-01-01
        相关资源
        最近更新 更多