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

时间:2013-05-03 22:45:25

标签: git

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

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

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

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

2 个答案:

答案 0 :(得分:29)

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

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

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

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

git log --graph --decorate $(git rev-list -g --all)

答案 1 :(得分:2)

你想要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

之后,使用 git show 获取更多信息——例如:git show d3c3

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

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