有没有一种工具可以让Git在图表中显示“分离的头”?

41
我经常使用git log --graph --decorate --oneline --all --full-history查看我的分支的当前状态,但它不会显示分离头/匿名分支。有没有办法让这些分离头在此图中出现?
我知道git reflog存在,但由于没有结构,很难阅读-你所能依据的只有提交信息,如果我还没有完成提交,那么信息可能仍然是WIP。
一些背景(这并非回答问题所必需的,但将有助于解释其动机):我是Mercurial用户,我的工作流程涉及大量的匿名分支。 我经常使用hg heads检查这些分支,而且经常使用hg rebase根据易于理解的代码审查目的分离或组合提交系列。
尽管我正在适应使用git,但通常会遇到分离头,例如,当我从一个分支中rebase某些提交以创建一个新分支时。 使用git reflog找到这些分离头很烦人,并且老实说,他们竟然从常规的git log中消失了,有点可怕。 我甚至忘记了旧的提交,不得不在一两天后从git reflog中挖出它们。 在Mercurial中,这些提交将保留为匿名头,我将被提醒需要完成它们。
2个回答

75

听起来你试图使用一种与Git工作方式不太匹配的工作流。

首先,在Git中,“detached head”并不等同于Mercurial中的“head”。Git只有一个HEAD,它是当前检出的提交。 “Detached”表示您当前没有检出任何分支。因此,当您创建一个提交时,它不会与任何分支相关联,并且在检出不同的提交时将丢失。

在Git中,您关心的每个提交都应该可以从某个分支访问到。不存在“匿名分支”,这就是为什么Git在在游离状态下提交时会发出警告的原因。在游离状态下提交就像分配一个对象然后丢弃指针一样;它是可能的,但几乎永远不是你想要做的事情。请记住,Git中的分支是轻量级的,可以是暂时的。只需在提交之前创建一个分支,这样您就可以再次找到自己的提交。

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

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

4
听起来有些懒惰,但是事先想好一个分支的名称很麻烦。然后我还得删除这个名称。这对我来说不是轻松的事。我想知道是否有一个扩展程序可以为我维护每个没有命名的分支的指针。那么,如果我决定保留它,我就可以给它重新命名;如果我想让它被垃圾收集,我就可以将其删除。 - dmnd
2
我不知道是否有这样的扩展,但它听起来很简单。用一个shell脚本替换"git commit",首先测试HEAD是否分离(通过检查git symbolic-ref HEAD的退出状态),如果是,则使用任何你喜欢的命名方案创建一个新分支。 - David
1
@dmnd FYI,不存在“未命名分支”这样的东西。分离头不被跟踪,并被视为等待收集(丢弃)的垃圾。如果您想跟踪提交,需要对其进行标记或将其放入分支中。 - eddiemoya
1
我在非常棘手的变基之前使用标签而不是分支 - 例如 git tag hold - 这与创建分支并没有根本区别,但感觉更简单、不太重要。 - Gary Fixler
2
所以我正在进行一项特别棘手的变基操作,并希望在开始在更新的“主分支”上进行变基之前找到我的“分支”HEAD。在你展示了允许我找到旧“主分支”分叉出的旧“分支”的提交命令之前,我不得不阅读三段批评性的文字,不知道这个答案是否有用。 - nyanpasu64
显示剩余10条评论

21

你想要运行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的答案也很棒。


1
我发现git cat-file -p <object>非常有用,可以找到悬空对象的父级。 - AverageAdam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接