【问题标题】:Is running (git reset head~2) equivalent to running (git reset head^) twice?运行 (git reset head~2) 是否等同于运行 (git reset head^) 两次?
【发布时间】:2020-07-13 14:15:09
【问题描述】:

如果我在本地分支上有两个提交,并且我运行 git reset head^ 两次。它只会撤消两次提交,还是会遇到问题?

【问题讨论】:

  • 请注意,它是HEAD,而不是head。后者可能在具有不区分大小写的文件系统的机器上工作,但只是偶然的,不应依赖。

标签: git git-reset


【解决方案1】:

git reset 默认为--mixed,它确实会撤消提交,将更改保留在本地树中(“更改的文件被保留但未标记为提交”)。

至于修订。虽然在您描述的场景中,您会得到相同的行为,但您可能想说:HEAD~ 并运行两次......或者更好的是HEAD~~ 或只是HEAD~2。

这不是不常见的混淆来源,但简而言之:

  • ~ 世代相传(更深层次的第一代父母)
  • ^ 遍历上一代的parents(助记:circumflex 看起来像一个小叉子,你可以访问历史叉子的节点)。

只要你不带任何数字地使用它们,每次跳跃你总是得到最左边的祖先,所以HEAD~~~ 和HEAD^^^ 会让你落在同一个地方,HEAD~2(两个最左边的父母回来)不是与HEAD^2 相同(左父第二个)。

您可以在git rev-parse 描述中看到更多细节,包括这个视觉插图:

这是 Jon Loeliger 的插图。提交节点 B 和 C 都是提交节点 A 的父节点。父提交按从左到右的顺序排列。

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A

A =      = A^0
B = A^   = A^1     = A~1
C = A^2  = A^2
D = A^^  = A^1^1   = A~2
E = B^2  = A^^2
F = B^3  = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2  = B^^2    = A^^^2  = A~2^2
I = F^   = B^3^    = A^^3^
J = F^2  = B^3^2   = A^^3^2

此外,如果您担心执行某个操作,您可以随时分支(例如git checkout -b temp),尝试您的命令,当满意切换回来时,删除临时分支并在那里执行。

【讨论】:

  • 默认模式是--mixed,而不是--soft。
  • @torek 对此感到抱歉,已更正...并在顶部提供链接。 :)
【解决方案2】:

是的,这是一回事,您只需撤消两次提交(但保留更改)。

请注意,您也可以运行 git reset HEAD^^

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2021-07-04
    • 2023-03-23
    • 2018-01-13
    • 2019-09-05
    • 2014-08-25
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多