git reset命令之间的区别

时间:2013-06-13 21:33:24

标签: git

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

6 个答案:

答案 0 :(得分:3)

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

^指的是提交的第一个父级。 ~n指的是n:th的祖先。所以^^(父母的父母)相当于~2

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

gitrevisions man page有很多细节和例子。

答案 1 :(得分:2)

尽管HEAD^HEAD~1做同样的事情,但它们意味着略有不同。 HEAD^HEAD^1的简写,它引用提交的第一个父级,HEAD^2引用提交的第二个父级。 HEAD~HEAD~1的简写,它引用提交的第一个父级,HEAD~2引用提交的第一个父级的第一个父级。除非HEAD是合并提交,否则这两种语法是可以互换的,在这种情况下,它可以有多个父级(主分支上的先前提交和合并到主服务器的分支上的先前提交)。 / p>

答案 2 :(得分:1)

区别在于HEAD~1用于线性历史记录,而HEAD^能够跟随多个父母的提交。

答案 3 :(得分:1)

HEAD ^和HEAD~1是一回事。

从我的笔记:

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

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

有更复杂的表单可以让您处理基本引用(例如HEAD)是合并结果的情况。

实际上,它可以让真正复杂化。见https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html

答案 4 :(得分:0)

不,HEAD^HEAD~1(以及HEAD~HEAD^1)引用相同的提交。

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

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

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

~之后的数字是指要返回的世代数(在每一步的第一个父关系之后),1表示直接父级,2表示祖父级,依此类推。

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

答案 5 :(得分:0)

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