我正在学习git reset
命令。
我只是想知道,git reset HEAD
与git reset HEAD~
之间有什么区别。
这些命令有两种方法可以达到同样的效果吗?或者它们之间存在差异,只能在某些条件下观察到?
当我在相同的情况下运行这两个命令时,它们似乎表现相同,但为了避免what you see is all there is
陷阱,我问这个问题只是为了确定。
答案 0 :(得分:2)
如果您只有一个提交,它们是相同的,否则HEAD~
将始终引用提交的第一个父级。
此外,我可以为git reset
建议一些有趣的阅读。
git reset HEAD
展开git reset --mixed HEAD
。来自--mixed
因此git reset HEAD~
将展开git reset --mixed HEAD~1
,这意味着Reset the HEAD's first parent with the --mixed option
- 混合 重置索引但不重置工作树(即,保留更改的文件但未标记为提交)并报告尚未更新的内容。这是默认操作。
我现在参考非常好的博客文章git reset demystified。 Side Note :在这篇博文中,我终于了解到重置实际上是如何工作的。
现在再花一点时间来看看这个图并意识到它做了什么。它仍然解除了你的最后一次提交,但也取消了一切。在运行所有git add AND git commit之前,你回滚到了。
答案 1 :(得分:2)
一方面,git reset COMMIT
(相当于git reset --mixed COMMIT
)表示:
HEAD
引用移至COMMIT
COMMIT
git reset
另一方面:
HEAD
代表当前提交HEAD~
代表HEAD
(~
的含义在git revisions的文档中有解释,请参阅本节末尾的示例以便更好地理解)
当你将两者结合起来时:
git reset HEAD
:只需重置索引git reset HEAD~
:移至上一次提交并相应地重置索引在这两种情况下,您的工作目录都不会受到影响。
答案 2 :(得分:1)
正在运行
git reset HEAD~
git reset HEAD
第二个命令没有效果,因为在第一个新HEAD是先前的HEAD~之后。 见
git rev-parse HEAD HEAD~ HEAD^@
请注意git reset HEAD~
可以撤消
git reset HEAD@{n}
其中n可以使用git reflog