7

呃哦......我错误地提交了一个非常复杂的更改(包括子目录和文件重命名),而我并不真正知道我在做什么(或者 Git 会做什么)。

我现在想撤消所有这些:

  1. 提交被完全逆转(好像它从未完成过,也许也将它从历史中删除)
  2. 将当前工作目录(在哪里.git)恢复到某个分支(现在最后一个)。

我找到了对git reset --softgit reset --hard的引用,但我已经向自己证明,在不完全理解命令的情况下过早使用命令会造成真正的损害。:)

我找到了git reset 手册页,但我仍然对以下内容感到困惑:

  1. 是什么HEAD
  2. HEAD和 和有什么不一样 * master
  3. 在我的情况下(见上文),我需要使用--soft,--hard还是其他(另外 3 个选项)?
  4. 我是否需要运行另一个命令(在执行之后git reset)来“完成”反转?

更新:阅读以下答案后:

  1. 我是否正确理解在我的情况下我需要做的就是发出一个命令git reset --hard HEAD^
  2. 如何验证是否正确执行了冲销?
4

2 回答 2

7
  1. HEAD是签出分支的最新提交。
  2. master是一个分支(按照惯例,主分支),而HEAD是签出分支的历史位置。HEAD相对于您所在的分支。
  3. git reset --soft会将您的更改留在工作树中,不承诺您可以随心所欲地做任何事情。git reset --hard会将工作树恢复到您重置到的提交时的状态。
  4. 不需要其他命令。

首先,要保留提交以防您以后要检查它,请创建一个分支:

git checkout -b my_bad_commit

(或者git branch my_bad_commit按照拉尔斯曼的评论中提到的那样做。)

然后返回master或您所在的任何分支并重置:

git checkout branch_with_bad_commit
git reset --hard HEAD^

HEAD^ 转换为“HEAD 的父级”,您甚至可以将其堆叠为 HEAD^^ = 2 次提交。有关此主题的更多信息,请查看 git 社区书籍中有关git 撤消的章节

于 2011-07-08T13:21:41.517 回答
1
  1. HEAD当前分支的尖端
  2. HEAD和之间的区别在于masterHEAD当您签出分支(或提交)时会发生变化。
  3. --soft将保留更改,因此您可以重新添加/提交它们或通过git checkout对更改的文件执行操作来撤消它们。--hard会将工作区重置为您要重置的提交的状态。
  4. 如果你不是reset --hard。您可能必须git push --force远程存储(尽管,如果您所做的更改已经在远程,则强烈建议不要重写历史记录)。
于 2011-07-08T13:08:33.980 回答