我经常引用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中,这些提交仍然是一个匿名的头,我会被提醒我需要完成它们。
答案 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
的答案也很棒。