【发布时间】:2020-07-13 14:15:09
【问题描述】:
如果我在本地分支上有两个提交,并且我运行 git reset head^ 两次。它只会撤消两次提交,还是会遇到问题?
【问题讨论】:
-
请注意,它是
HEAD,而不是head。后者可能在具有不区分大小写的文件系统的机器上工作,但只是偶然的,不应依赖。
如果我在本地分支上有两个提交,并且我运行 git reset head^ 两次。它只会撤消两次提交,还是会遇到问题?
【问题讨论】:
HEAD,而不是head。后者可能在具有不区分大小写的文件系统的机器上工作,但只是偶然的,不应依赖。
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。
是的,这是一回事,您只需撤消两次提交(但保留更改)。
请注意,您也可以运行 git reset HEAD^^
【讨论】: