4

我一直在使用git reset --soft HEAD^git reset --soft HEAD~1当我想将最后一次提交返回到暂存区时。我一直在交替使用它们,但想知道是否有任何细微的差异?如果没有,你能解释一下语法上的区别吗?^只是一个别名吗~1

4

6 回答 6

3

HEAD^HEAD~1引用相同的提交。

^指提交的第一个父级。~n指第n个祖先。所以^^(parent-of-parent) 等价于~2

我能想到的主要微妙之处是当前提交是否有多个父级(即它是一个合并提交)。在这种情况下,两者HEAD^HEAD^2都是有效的并引用不同的提交。HEAD~1HEAD^但不是HEAD^2

gitrevisions手册页有很多细节和例子。

于 2013-06-13T21:34:42.690 回答
2

即使HEAD^HEAD~1同样的事情,它们的含义也略有不同。HEAD^是 的简写HEAD^1,它引用提交的第一个父级,HEAD^2并将引用提交的第二个父级。HEAD~是 的简写HEAD~1,它引用提交的第一个父级并HEAD~2引用提交的第一个父级的第一个父级。这两种语法是可以互换的,除非HEAD是合并提交,在这种情况下,它可以有多个父级(主分支上的上一个提交和合并到主分支上的上一个提交)。

于 2013-06-13T21:41:01.630 回答
1

不同之处在于HEAD~1它用于线性历史,而HEAD^它能够跟随多个父级的提交。

于 2013-06-13T21:38:04.230 回答
1

HEAD^ 和 HEAD~1 是一回事。

从我的笔记中:

ref ^ 表示ref之前的提交。可以使用多个 ^ 字符。示例:头^^^

ref ~n 表示ref之前的第 n 次提交。示例:HEAD~3

有更复杂的形式允许您处理基本引用(例如 HEAD)是合并结果的情况。

实际上,它可能会变得非常复杂。见https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html

于 2013-06-14T00:27:20.920 回答
0

不,HEAD^and HEAD~1(以及HEAD~or HEAD^1)指的是同一个提交。

在描述提交的内容之后添加^~之后都将更改对参数前面部分描述的提交的第一个父项的引用。

当数字跟在符号后面时,差异就出现了。如果没有给出数字,它的工作方式与1使用相同。

a 后面的数字^选择应该使用合并提交的哪个父级(有点像选择父亲或母亲)。第一个父级将是在创建合并提交时签出的提交,其他父级将是使用git merge命令命名的提交。

a 后面~的数字表示要返回的代数(在每一步都遵循第一个父关系),1 表示直系父母,2 表示祖父母,依此类推。

这些符号也可以链接起来,例如HEAD~3^2~5,尽管使用 SHA1 ID 来引用需要这种符号的提交通常会更简单。

于 2013-06-13T21:42:49.460 回答
0

如果您已经提交到本地存储库(即 git commit -m ),那么您可以通过执行git reset --soft HEAD ~1来撤销最后一次提交 如果您已经暂存了您的更改(即使用 git add 。)那么您可以通过执行git reset --mixed HEADgit reset --hard清除所有内容(甚至是您的本地更改)来反转分期。头后的 ~ 告诉你从顶部到多少次提交。

于 2016-02-22T14:31:37.403 回答