git checkout有什么区别。 vs git reset --hard HEAD

时间:2018-03-25 03:24:11

标签: git

如果我必须撤消我在工作分支中所做的任何更改,

git checkout .
git reset --hard HEAD 

这两个命令都会将我带到最后一次提交。 这两个命令有什么区别?当我们应该使用哪个命令?

任何帮助将不胜感激。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

简短版本:git checkout仅触及您的工作副本,但git reset --hard可以更改分支指向的内容。来自man git-reset的示例:

Undo a commit, making it a topic branch

    $ git branch topic/wip     (1)
    $ git reset --hard HEAD~3  (2)
    $ git checkout topic/wip   (3)

1. You have made some commits, but realize they were premature to
   be in the "master" branch. You want to continue polishing them in a
   topic branch, so create "topic/wip" branch off of the current HEAD.
2. Rewind the master branch to get rid of those three commits.
3. Switch to "topic/wip" branch and keep working.

在您的示例中,它们可以有效地互换,但如果您使用了除HEAD之外的其他内容(如手册页中的示例所示),则可以更改历史记录。

答案 1 :(得分:2)

git checkout只会更新工作树,即使用git add ...尚未暂存的更改。

git reset --hard HEAD将更新工作树和索引(暂存文件)。

更灵活和透明的选项是使用git checkout -p,它会提示每个部分单独撤消,并且不会撤消已经上演的更改。这是撤消您不想要的代码的绝佳选择,同时保留一些工作树更改。它还会强迫您查看您正在删除的内容,从而减少出现无法恢复的错误。

如果您有大量工作树和分阶段更改,并且确定要撤消,例如删除意外文件夹或错误git mv后,使用重置会更合适。