我一直在使用git reset --soft HEAD^
,git reset --soft HEAD~1
当我想将最后一次提交返回到暂存区时。我一直在交替使用它们,但想知道是否有任何细微的差异?如果没有,你能解释一下语法上的区别吗?^
只是一个别名吗~1
?
6 回答
HEAD^
并HEAD~1
引用相同的提交。
^
指提交的第一个父级。~n
指第n个祖先。所以^^
(parent-of-parent) 等价于~2
。
我能想到的主要微妙之处是当前提交是否有多个父级(即它是一个合并提交)。在这种情况下,两者HEAD^
和HEAD^2
都是有效的并引用不同的提交。HEAD~1
指HEAD^
但不是HEAD^2
gitrevisions手册页有很多细节和例子。
即使HEAD^
做HEAD~1
同样的事情,它们的含义也略有不同。HEAD^
是 的简写HEAD^1
,它引用提交的第一个父级,HEAD^2
并将引用提交的第二个父级。HEAD~
是 的简写HEAD~1
,它引用提交的第一个父级并HEAD~2
引用提交的第一个父级的第一个父级。这两种语法是可以互换的,除非HEAD
是合并提交,在这种情况下,它可以有多个父级(主分支上的上一个提交和合并到主分支上的上一个提交)。
不同之处在于HEAD~1
它用于线性历史,而HEAD^
它能够跟随多个父级的提交。
HEAD^ 和 HEAD~1 是一回事。
从我的笔记中:
ref ^ 表示ref之前的提交。可以使用多个 ^ 字符。示例:头^^^
ref ~n 表示ref之前的第 n 次提交。示例:HEAD~3
有更复杂的形式允许您处理基本引用(例如 HEAD)是合并结果的情况。
实际上,它可能会变得非常复杂。见https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
不,HEAD^
and HEAD~1
(以及HEAD~
or HEAD^1
)指的是同一个提交。
在描述提交的内容之后添加^
或~
之后都将更改对参数前面部分描述的提交的第一个父项的引用。
当数字跟在符号后面时,差异就出现了。如果没有给出数字,它的工作方式与1
使用相同。
a 后面的数字^
选择应该使用合并提交的哪个父级(有点像选择父亲或母亲)。第一个父级将是在创建合并提交时签出的提交,其他父级将是使用git merge
命令命名的提交。
a 后面~
的数字表示要返回的代数(在每一步都遵循第一个父关系),1 表示直系父母,2 表示祖父母,依此类推。
这些符号也可以链接起来,例如HEAD~3^2~5
,尽管使用 SHA1 ID 来引用需要这种符号的提交通常会更简单。
如果您已经提交到本地存储库(即 git commit -m ),那么您可以通过执行git reset --soft HEAD ~1来撤销最后一次提交 如果您已经暂存了您的更改(即使用 git add 。)那么您可以通过执行git reset --mixed HEAD 和git reset --hard清除所有内容(甚至是您的本地更改)来反转分期。头后的 ~ 告诉你从顶部到多少次提交。