哦哦......我错误地提交了一个非常复杂的更改(包括子目录和文件重命名),却不知道我在做什么(或者Git会做什么)。
我现在要撤消所有内容:
.git
所在的地方)
分支(最后一个将立即执行)。我找到了对git reset --soft和git reset --hard的引用,但我已经向自己证明过,如果没有完全理解它,过早地使用命令会造成真正的伤害。 :)
我找到git reset man page,但我仍然感到困惑:
HEAD
?HEAD
和* master
?--soft
,--hard
或
其他(另外3个选项)?git reset
之后)
“敲定”逆转?更新:阅读以下答案后:
git reset --hard
HEAD^
?答案 0 :(得分:7)
HEAD
是签出分支的最新提交。master
是一个分支(按照惯例是主分支),而HEAD
是签出分支的历史记录中的位置。 HEAD
与您所在的分支相关。git reset --soft
会将您的更改留在工作树中,不承诺为您做任何您喜欢的事情。 git reset --hard
会将工作树恢复到您重置为的提交状态。首先,要保留提交以防以后要进行检查,请创建一个分支:
git checkout -b my_bad_commit
(或者在larsman的评论中提到git branch my_bad_commit
。)
然后返回master
或您所在的任何分支并重置:
git checkout branch_with_bad_commit
git reset --hard HEAD^
HEAD ^转换为“HEAD的父级”,您甚至可以将其堆叠为HEAD ^^ = 2提交回来。有关此主题的更多信息,请查看undo in git
上的git社区书籍章节答案 1 :(得分:1)
HEAD
是tip of the current branch。HEAD
和master
之间的区别在于,当您签出分支(或提交)时,HEAD
会发生变化。--soft
将保留更改,因此您可以通过对更改的文件执行git checkout
来重新添加/提交或撤消它们。 --hard
会将工作区重置为您要重置的提交状态。reset --hard
,则不是。您可能必须git push --force
进行远程回购(但是,如果您所做的更改已经在远程,则强烈建议不要重写历史记录。)