`git reset HEAD`和`git reset HEAD~`之间有什么区别吗?

时间:2017-08-17 08:20:54

标签: git commit reset

我正在学习git reset命令。

我只是想知道,git reset HEADgit reset HEAD~之间有什么区别。

这些命令有两种方法可以达到同样的效果吗?或者它们之间存在差异,只能在某些条件下观察到?

当我在相同的情况下运行这两个命令时,它们似乎表现相同,但为了避免what you see is all there is陷阱,我问这个问题只是为了确定。

3 个答案:

答案 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)表示:

  1. HEAD引用移至COMMIT
  2. 将索引重置为COMMIT
  3. Reset Demystified

    完整解释了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

检索