我一直在使用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清除所有内容(甚至是您的本地更改)来反转分期。头后的 ~ 告诉你从顶部到多少次提交。