我经常引用git log --graph --decorate --oneline --all --full-history
来查看我的分支的当前状态,但它不显示分离的头/匿名分支。有没有办法让分离的头出现在这个图中?
我知道git reflog
存在,但这很难阅读,因为没有结构-所有你必须继续的是提交消息,如果我还没有完成提交,它仍然可能是错误的。
一些背景(这不是回答问题的必要条件,但有助于解释它的动机):我是一个Mercurial用户,我的工作流程涉及到很多匿名分支。我倾向于使用hg heads
来检查这些头,并且经常使用hg rebase
来分离或合并系列提交,基于什么是有意义的,以便于理解代码审查。
当我习惯使用git的时候,我经常发现自己有分离的头,例如,当我从一个分支中重基一些提交来创建一个新的分支时。在git reflog
中找到这些分离的头是很烦人的,老实说,它们从通常的git log
中消失了,这有点可怕。我甚至忘记了旧的提交。在Mercurial中,这些提交将保持为匿名头部,我会被提醒需要完成它们。
3条答案
按热度按时间vof42yt11#
这听起来像是你试图使用一个与git工作方式不太匹配的工作流程。
首先,git中的“detached head”与Mercurial中的“head”概念不一样。Git只有一个HEAD,也就是当前 checkout 的提交。“Detached”只是意味着当前没有 checkout 的分支。所以当你创建一个提交时,它不会与分支关联,当你 checkout 一个不同的提交时,它会丢失。
在Git中,你关心的每一个提交都应该可以从某个分支中访问。没有所谓的“匿名分支”,这就是为什么git在提交到一个分离头上时会警告你。在一个分离头上提交就像分配一个对象,然后扔掉指针;这是可能的,但几乎从来没有你想做的。记住,git中的分支是轻量级的,并且可以是短暂的。只需在提交之前创建一个分支,这样你就可以再次找到你的提交。
话虽如此,如果你真的想看到你的仓库的结构,包括只从reflog引用的提交,你可以使用用途:
字符串
wfsdck302#
你想要
git fsck --lost-found
它会给你给予悬空提交(不是在分支上)。
输出结果如下所示:
字符串
然后,使用
git show
获取更多信息--例如:git show d3c3
你也可以得到关于“blob”的信息,这可能是合并冲突中的一个阶段性更改,但从未提交。有助于恢复丢失的数据。
顺便说一句,上面使用
git log
的答案也很棒。w8rqjzmb3#
考虑使用Jujutsu或Sapling等替代工具,这两种工具都是以匿名的head为中心的工作流。这两种工具都可以与Git repos一起使用,尽管只有Zetsu可以拥有一个“托管的Git repo”,这使得它可以在大部分时间使用以Git为中心的工具。
(我过去是Sapling的主要贡献者,尽管我现在更喜欢并全职使用Yuttsu。