Git --all缺失的提交

4

请问有人能帮我理解这里正在发生的事情吗?

我用 git log --oneline 开始,输出结果如下:

4df9421 (HEAD, master) moved some aliases around
d3810e4 (origin/master) some terminal color changes
a7182d3 git colors, ignores, etc.
995fe8c added gitconfig, moved some personal stuff out of the public repo
8a100b7 misc unimportant updates
55d2c08 added a fix to "open with", refactored
7ec7d83 Removed some vim colors; added a couple searching aliases
330c7fc Minor updates
44e80a1 Added vim files
48537c6 Fixed some formatting problems
14933a2 Initial Commit

然后我执行git reset --hard 330c7fc,这将把日志还原到:

330c7fc (HEAD, master) Minor updates
44e80a1 Added vim files
48537c6 Fixed some formatting problems
14933a2 Initial Commit

到目前为止一切都很好,但(现在我已经重置了),当我运行 git log --oneline --all 命令时,我得到以下输出:

 d3810e4 (origin/master) some terminal color changes
 a7182d3 git colors, ignores, etc.
 995fe8c added gitconfig, moved some personal stuff out of the public repo
 8a100b7 misc unimportant updates
 55d2c08 added a fix to "open with", refactored
 7ec7d83 Removed some vim colors; added a couple searching aliases
 330c7fc (HEAD, master) Minor updates
 44e80a1 Added vim files
 48537c6 Fixed some formatting problems
 14933a2 Initial Commit

请注意,最新的条目“4df9421移动了一些别名”在此列表中缺失。

我的理解是,--all选项应该显示所有提交记录。为什么我回滚到早期的提交后最新的记录消失了?

谢谢。

3个回答

6
由于没有被HEAD或分支引用,所以它已经丢失了。
你使用git reset --hard将它们都(HEAD和master)重置到另一个提交。
只有git reflog才会显示最近的提交。
git log --all仅用于列出在refs/中引用的提交(如标签、头等)。
--all

假装所有 refs/ 下的引用都被列在命令行中作为 <commit>

明白了,这很有道理。我想最好总是保持一个分支在最新的提交上,如果你想回滚到早期的某个版本,可以在一个分支上进行操作。 - Oliver Taylor
@OliverTaylor 是的:这样,您可以保留旧 HEAD 的引用,然后在 git log --all 中仍然可见。 - VonC
这就引出了一个问题,是否有一种方法可以将reflog中的提交与日志中的提交合并?从而创建一个所有提交的主列表,而不管它们是否存在于refs/中。 - Oliver Taylor
@OliverTaylor,一般来说这是不建议的,为了避免在之后类似提交被取消引用时所留下的污染,例如,在变基(rebase)中(在那里你会获得两组相同的提交)。话虽如此,可以看一下 git log--walk-reflogs 选项。(例如,https://dev59.com/gnRB5IYBdhLWcg3wAjXR#746790) - VonC

2

--all选项并不是让git log显示所有的提交。它要求显示所有的引用日志,基本上就是你的分支和标签。重置命令从master中删除了该提交,因此该提交现在无法访问。


0

你应该接受VonC的答案。为了完成它:

"缺失的提交"没有被推送到服务器,或保存在另一个分支中。因此,你的git reset --hard 删除了它。

幸运的是,git有一种魔法撤消堆栈:git reflog。查看VonC的链接以找出如何恢复它。

当你使用git reset时要小心,这个命令可能会破坏提交。

作为一个经验法则:在操作你的历史记录之前,确保你仍然有一些方法可以回到你原来的位置。我的本地存储库充斥着backuporigwip分支,我每个月左右就会清理一次。


“删除了它”?不完全是。它被“取消引用”了。除非你执行git gc --prune=today --aggressive(或者git gc --prune=now),否则它仍然会在reflog中列出(默认情况下保留90天)。 - VonC
你当然是对的。如果没有这样做,你将无法恢复它。但在“正常的git流程”中,看起来你确实已经删除了你的提交。 - LeGEC

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