38

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

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

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

虽然我已经习惯了使用 git,但我经常发现自己的头脑很独立,例如,当我从一个分支重新提交一些提交以创建一个新分支时。找到这些分离的头很烦人git reflog,老实说,它们从平常中消失有点可怕git log。我什至以这种方式忘记了旧的提交,并且不得不在git reflog一两天后将它们挖掘出来。在 Mercurial 中,这些提交将保留为匿名负责人,我会被提醒我需要完成它们。

4

2 回答 2

60

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

首先,git 中的“分离的头”与 Mercurial 的“头”概念不同。Git 有一个 HEAD,它只是当前签出的提交。“分离”仅表示您当前没有签出分支。因此,当您创建提交时,它不会与分支关联,并且在您签出不同的提交时它会丢失。

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

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

git log --graph --decorate $(git rev-list -g --all)
于 2013-05-03T23:17:54.633 回答
7

你要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也很棒。

于 2021-03-12T07:47:01.070 回答