【问题标题】:is there any difference between `git reset HEAD` and `git reset HEAD~``git reset HEAD` 和 `git reset HEAD~` 之间有什么区别吗?
【发布时间】:2023-03-23 03:18:01
【问题描述】:

我目前正在学习 git reset 命令。

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

这些命令是实现同一目标的两种方式吗?还是它们之间存在仅在某些条件下才能观察到的差异?

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

【问题讨论】:

  • HEAD~HEAD 的第一个父级。确保您在 repo 中至少有两个提交,您会看到更改。
  • 嗨@axiac,谢谢你的评论。所以从你所说的来看,我猜git reset HEADgit reset HEAD~ 的意思是一样的,即它们都意味着:使HEAD 指针指向HEAD 当前指向的提交的父提交?我的理解正确吗?
  • 你使用的是什么版本的 Git?我刚刚检查了这两个命令,它们肯定会使 repo 处于不同的状态。
  • 了解指定Git revisions的方法。
  • 记住,HEAD 表示当前提交。如果有什么东西,比如git reset HEAD~changes哪个commit是current,那么HEAD的含义也刚刚改变了。因此,无论您是使用git reset HEAD; git reset HEAD~ 还是使用git reset HEAD~; git reset HEAD~,这都很重要。但是如果你先做git reset HEAD~(改变HEAD)然后git reset HEAD(使用改变的HEAD但不再改变它),或者git reset HEAD(使用不变的HEAD)然后git reset HEAD~(改变HEAD),你有无论哪种方式,都只更改过一次。

标签: git commit reset


【解决方案1】:

如果您只有一个提交,它们是相同的,否则 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旁注:从这篇博文中,我终于了解了重置的实际工作原理。

现在再花一点时间看看那个图表并了解它的作用。它仍然取消了您的最后一次提交,但也取消了所有内容。您回滚到运行所有 git 添加和 git commit 之前。

【讨论】:

  • HEAD^1HEAD 不同。
  • 是的,我在尝试了一些东西后意识到了这一点,我更新了我的介绍。你同意它或任何其他提示吗?
  • 嗨,ckruczek,感谢您的链接!我看了一眼,他们似乎真的很好。
【解决方案2】:

一方面,git reset COMMIT(相当于git reset --mixed COMMIT)意味着:

  1. HEAD 对指向COMMIT 的引用移动
  2. 将索引重置为COMMIT的树

git resetReset Demystified中有完整的解释)

另一方面:

  • HEAD 代表当前提交
  • HEAD~ 代表HEAD 的第一个祖先

~的含义在git revisions的文档中有解释,看小节末尾的例子更好理解)

当你将两者结合起来时:

  • git reset HEAD:只需重置索引
  • git reset HEAD~:移至上一个提交并相应地重置索引

在这两种情况下,您的工作目录都不会受到影响。

【讨论】:

    【解决方案3】:

    运行

    git reset HEAD~
    git reset HEAD
    

    第二个命令没有效果,因为在第一个之后新的 HEAD 是前一个 HEAD~。 见

    git rev-parse HEAD HEAD~ HEAD^@
    

    注意git reset HEAD~可以用

    撤消
    git reset HEAD@{n}
    

    其中 n 可以使用git reflog 检索

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 2020-04-07
      • 2014-08-25
      • 2011-07-04
      • 2018-06-25
      • 2017-12-10
      • 2021-10-28
      • 2011-09-06
      相关资源
      最近更新 更多