git - 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 次提交之前的提交?
解决方案
如果您打算结帐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 log
或git 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 5
git log -n 5
HEAD~4
HEAD~5
推荐阅读
- c# - 如何在 Windows 2016 服务器上运行 .net framework 4 构建应用程序?
- google-cloud-functions - 模拟嵌套函数的最佳方法是什么?
- automation - 如何在特定时间范围内重复启动 Alexa Skill
- reporting-services - 有没有办法让 runningvalue() 朝相反的方向工作?
- apache-spark - 在 pySpark 中删除重复项的最佳方法
- powershell - 无法删除项目,因为它正在使用中,尽管它不是
- mysql - PDI 中的 MySQLNonTransientConnectionException
- vim - 在 sagemath 上使用 syntastic(或任何 vim 检查器)
- function - 显示菜单提示并将用户选择描述保存为 powershell 脚本中的变量
- nlp - 为什么 doc2vec 中最相似的 Gensim 给出与输出相同的向量?