是否有工具让git在图表中显示"分离头"?

dmn*_*mnd 27 git

我经常提到git log --graph --decorate --oneline --all --full-history看到我的分支的当前状态,但它没有显示分离的头/匿名分支.有没有办法让分离头出现在这个图中?

我知道git reflog存在,但由于没有结构,所以很难阅读 - 所有你需要继续的是提交消息,如果还没有完成提交,它仍然可能是WIP.

一些背景(这不是回答问题所必需的,但有助于解释它的动机):我是Mercurial用户,我的工作流程涉及很多匿名分支.我倾向于使用hg heads很多东西来检查这些头部,并且经常hg rebase根据易于理解的代码审查的目的来分离或组合一系列提交.

虽然我已经习惯了使用git,但我常常发现自己处于分离的状态,例如,我将一些提交从一个分支转换为一个新的分支.找到这些独立的头脑很烦人git reflog,说实话,它们有点可怕,它们只是从平常中消失了git log.我甚至忘记了这种方式的旧提交,并且不得不在git reflog一两天后将它们挖出来.在Mercurial中,这些提交仍然是一个匿名的头,我会被提醒我需要完成它们.

Dav*_*vid 32

听起来你正在尝试使用与git工作方式不完全匹配的工作流程.

首先,git中的"独立头"与Mercurial的"头部"概念不同.Git只有一个HEAD,它只是当前签出的提交."分离"只是意味着您目前没有签出分支.因此,当您创建提交时,它将不会与分支关联,并且在您签出其他提交时它将丢失.

在Git中,您关注的每个提交都应该可以从某个分支中访问.没有"匿名分支"之类的东西,这就是为什么git在承诺分离头时会发出警告的原因.在分离的头上提交就像分配一个对象然后扔掉指针一样; 这是可能的,但几乎从来没有你想做的事情.请记住,git中的分支是轻量级的,可以是短暂的.只需在提交之前创建一个分支,以便您可以再次找到您的提交.

总而言之,如果您真的想要查看存储库的结构,包括仅从reflog引用的提交,您可以使用:

git log --graph --decorate $(git rev-list -g --all)
Run Code Online (Sandbox Code Playgroud)

  • 这听起来很懒惰,但是必须提前为分支想一个名字很烦人。然后我以后也必须删除这个名字。这对我来说听起来并不轻巧。我想知道是否有一个扩展可以为我维护指向每个未命名分支的指针。然后我可以重命名分支,如果我决定保留它,或者如果我想让它被 GCed 删除它。 (2认同)
  • 我不知道这样的扩展,但听起来很简单.将"git commit"替换为首先测试HEAD是否已分离的shell脚本(通过检查`git symbolic-ref HEAD`的退出状态),如果是,则使用您喜欢的任何命名方案创建新分支. (2认同)
  • 所以我正在做一个特别棘手的 rebase 并且想在我开始基于更新的 `master` 之前找到我的 `branch` HEAD。我不得不通读了 3 段批评,但不知道这个答案是否有用,然后你才显示命令,让我找到我的旧 `branch` 的提交,它从我的“旧 `master`”分叉出来。 (2认同)

Dmi*_*117 22

你要git fsck --lost-found

它会给你悬空的提交(不在分支上)。

输出将如下所示:

Checking object directories: 100% (256/256), done.
dangling blob 18bcff3c8741a2cf2522f29e90570efec46b32a6
dangling blob 98ea60e43e9ec74b5e4a6b9bee774fc39be2feed
dangling blob bdd4824eb73f39327afd191fb704a0380963384a
dangling blob 45a99326deead9d436ff6b54d7e40b3d8b16c4b2
dangling commit 488bc730f09ceba206331660ecb1f9156f5ae594
dangling commit d3c35fc70085c3c25b916073554ab631bdb8b11c
dangling commit ee99e7a0e2fe2e34a68a19ca76f623274edc2ab6
Run Code Online (Sandbox Code Playgroud)

然后,通过--示例获取更多信息git showgit show d3c3

您还可以获取有关“blob”的信息,该“blob”可能是合并冲突造成的分阶段更改,但从未提交。有助于恢复丢失的数据。

顺便说一句,上面使用的答案git log也很棒。