首页 > 解决方案 > git checkout HEAD~N 不会进行我期望的提交

问题描述

我看到git checkout HEAD~N在我的 git 历史记录中不会返回 N 次提交的行为。

如果我的提交历史看起来像这样

git log --oneline -n 5

3ad352f (HEAD -> develop, origin/develop, asdf) commit message
93eeda7 Merged in branch (pull request #224)
911eb78 (origin/sdfa, asdf) Removes txt file
4b9de92 branch1
7a162e3 Merged in branch1 (pull request #223)

我做了一个git checkout HEAD~5我的理解是我的 HEAD 应该指向 5 次提交之前的提交。但是,当我运行此命令时,我会看到如下内容:

$ git checkout HEAD~5

$ git rev-parse HEAD
49569625ffe9bfc13fdd4f1f5baab9a72ef7ca02

$ git rev-list --count `git rev-parse HEAD`..develop
13

看来我实际上是在 13 次提交之前检查了一次提交,而不是像我预期的那样检查了 5 次。

谁能解释发生了什么,以及我如何才能实际签出 N 次提交之前的提交?

标签: git

解决方案


如果您打算结帐7a162e3 Merged in branch1 (pull request #223)

  • 最简单、明确的方法是运行git checkout 7a162e3(你有 sha,使用它)
  • 如果你跑过git log --oneline --graph -n 5,你可能会看到类似的东西:
3ad352f * (HEAD -> develop, origin/develop, asdf) commit message
93eeda7 * Merged in branch (pull request #224)
        |\
911eb78 | * (origin/sdfa, asdf) Removes txt file
4b9de92 | * branch1                                
7a162e3 * Merged in branch1 (pull request #223)

注意:从您问题中的提交消息中,我不确定我是否了解您的回购的正确历史,请在您的终端中检查您的提交是如何相关的)

如果历史如上所述,从您的活动提交中计算“第一父母”,您将计算HEAD~2(而不是HEAD~5


<commit>~N只会遵循从 开始的“第一父母”序列<commit>,而git loggit log --oneline没有其他选项将列出(在平面列表中)来自合并分支的提交,这将“添加”到显示的提交计数。

git log或者git rev-list两者都有一个--first-parent选项,也可以将显示的提交列表限制为这个“第一父母”序列:

git log --oneline --first-parent HEAD~5..HEAD  # will list only 5 commits
git rev-list --count --first-parent HEAD~5..HEAD  # will display '5'

我还强烈建议滥用--graph,git log以了解您看到的提交如何相互依赖:

git log --oneline --graph   # you will have a view of what commits are merges,
                            # and what commits come from side branches

额外说明

由于HEAD(相当于HEAD~0)显示在的输出中,因此您在: 显示的列表中git log也会出现“off by one”错误:您最多会看到,而不是。-n 5git log -n 5HEAD~4HEAD~5


推荐阅读