如何获取git log显示(已删除)分支的名称

Dav*_*ide 18 git logging

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

git log --graph --oneline --all --decorate
Run Code Online (Sandbox Code Playgroud)

除了我发现有用的输出之外,还有分支名称.但是,如果我删除了一个分支,那么上面的代码就不再显示了.我的意思是看到一堆像:

* 87c3294 (QueueExample) blah blah
Run Code Online (Sandbox Code Playgroud)

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

* 87c3294 blah blah
Run Code Online (Sandbox Code Playgroud)

这个问题的答案,特别是这个评论似乎意味着分支名称仍然"在某处".

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

或者,我如何从git分支的输出中删除分支,同时仍然保持它们的目的git log

Eth*_*own 27

在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.
Run Code Online (Sandbox Code Playgroud)

很容易被人误以为"(特征)"注释在某种程度上是指右边的那个分支,但事实并非如此:它只是指提交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.
Run Code Online (Sandbox Code Playgroud)

所以,回答你的问题,不,一旦你删除了一个分支,你就无法git log用该分支名称来批注提交(因为它不再存在).但是,您有一些替代方案:

  • 不要删除分支.留下分支是没有害处的,除了当你打字时它会弄乱你的屏幕git branch.此外,您可能希望重新使用分支名称,如果不删除分支,以后可能会导致问题.

  • 在删除分支之前标记提交.标签实际上是一个不移动的分支.您甚至可以使标记名称与分支名称相同.

  • 满足自己对合并提交的自动评论.如前所述,当Git进行合并时,默认情况下,它引用在提交注释中合并的分支的名称,从而创建分支存在的记录.对我来说,这是最干净的解决方案,基于分支在Git中的工作方式.由于分支实际上并不是指一系列提交,因此只存在分支存在的历史后果.

分支历史可能会延续的另一个地方是您的reflog,它只记录您要切换到的分支.它主要用于灾难恢复(ooops,我并不是要删除那个分支!),它对你所谈论的那种分支历史并不是很有用.

  • "分支只是提交的指针" - **+ 1**.为了证明这一点,在git项目目录中运行`ls .git/refs/heads`.嘿看,你所有的分支都是文件!现在`cat`其中一个文件.它仅包含特定提交的哈希值.标签在`refs/tags`中是相同的.看到这一点帮助我真正理解"分支实际上只是一个节点"这样的陈述意味着什么. (4认同)
  • @Davide - 更多证据:`cp ./git/refs/heads/master .git/refs/heads/fancypants`.现在`git branch`.嘿看,一个新的分支,它看起来与`master`完全相同的血统!那是因为分支机构没有历史;**承诺**有历史和血统.分支只是提交的标签. (2认同)

rbe*_*low 6

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