我希望看到我的git日志的方式是
git log --graph --oneline --all --decorate
除了我发现有用的输出之外,还有分支名称。但是,如果我删除了一个分支,那么上面的代码就不再显示了。我的意思是看到一堆像:
* 87c3294 (QueueExample) blah blah
比一堆
更具表现力(特别是当列表变长时)* 87c3294 blah blah
this question,特别是this comment的答案似乎暗示分支名称仍然“某处”。
如何在git log
的输出中或至少以其他方式打印它们?
或者,我如何从git branch的输出中删除分支,同时仍为git log
目的保留它们?
答案 0 :(得分:24)
在Git中,分支只是指向在该分支上添加新提交时移动的提交的指针。换句话说,一旦指针移动,就没有先前提交在该分支上的内存。这对我来说是一个难以理解的概念。也许这就是名称:“branch”让我想到通过边连接的多个节点,但在Git中,分支实际上只是一个节点。
git log
尽职地为任何指向它们的分支注释提交。例如,我创建了一个repo,在分支主机上提交“one”,“two”和“three”,在分支功能上创建“uno”,“dos”和“tres”,然后将功能合并回主服务器。这是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
)时,它会自动添加一条注释,说明它正在合并分支'feature',所以有一些记录显示在那里分支,但它只是一个评论,仅此而已。
当我删除分支“功能”时,除了提交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,它只记录您要切换到的分支。它主要用于灾难恢复(ooops,我并不是要删除那个分支!),它对你所谈论的那种分支历史并不是很有用。
答案 1 :(得分:3)
该评论讨论的是合并提交消息,例如Merge QueueExample into master
。删除分支时,分支已消失。如果您想使用--decorate
维护日志的主题视图,请尝试使用标记(或不要删除分支)。
答案 2 :(得分:0)
如果删除本地仓库中的分支,它仍然存在于该仓库的任何其他克隆中。如果将该删除推送到其他repos,则分支本身(只是一个方便命名的指向特定提交的指针)可能不再存在。但是,它指向的提交仍然存在一段时间,即使绝对没有任何指向它。如果它已合并到其他分支中,以便该提交形成其他分支的祖先的一部分,那么它将保留,只要它仍然可以从现有分支到达。然而,追踪它有点棘手。在早期,它会在你的HEAD reflog中停留一段时间,但最终它可能会从那里消失。
如果您希望它们始终显示在git log
输出中,请不要删除它们。或者,使用标记替换分支指针,以指向删除分支之前的分支。
答案 3 :(得分:0)
使用AWK=''' { printf (""%s %s %s %s"", $1, $2, $3, $4); }
{ for (f = 5; f <= NF; f += 2) printf (""%s %s"", $(f), $(f + 1)); }
{ printf (""\n""); } '''
awk ""${AWK}"" InFile > OutFile
列出合并提交。 已删除(但已合并)的分支名称将与其他合并分支的名称一起显示。