我经常提到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)
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 show:git show d3c3
您还可以获取有关“blob”的信息,该“blob”可能是合并冲突造成的分阶段更改,但从未提交。有助于恢复丢失的数据。
顺便说一句,上面使用的答案git log也很棒。