当我想将最后一次提交返回到暂存区域时,我一直在使用git reset --soft HEAD^
和git reset --soft HEAD~1
。我一直在互相使用它们,但想知道是否有任何微妙的差异?如果没有,你能解释语法差异吗? ^
只是~1
的别名吗?
答案 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 擦除所有内容(甚至是您当地的更改)。 〜后头告诉你从顶部有多少提交。