git reset - hard和git checkout之间的区别

Atl*_*250 6 git version-control git-checkout git-reset

假设我要撤消先前提交引入的所有更改.

据我所知,git reset --hard <specified commit>将删除所有提交,直到指定的提交,并撤消所有更改.
另一方面,git checkout <specified commit>将更改我的目录以反映指定的提交.

所以,如果我git reset之后git checkout会有与之相同的结果git reset --hard吗?

或者,如果我git commit之后git checkout,新创建的提交是否会覆盖现有的提交?

mik*_*1aj 5

简而言之,git commits是一棵树,而分支只是一些commits的指针。

git checkout <specified commit>不移动分支指针。执行此操作时,您将处于分离状态。您将看到此消息,这很不言自明:

您处于“分离头”状态。您可以环顾四周,进行实验性更改并将其提交,也可以放弃在此状态下所做的任何提交,而不会通过执行另一次签帐而影响任何分支。

如果要创建新分支以保留创建的提交,则可以(现在或以后)通过再次将-b与checkout命令一起使用来进行。例:

git checkout -b new_branch_name

另一个区别是git checkout更安全,因为它不会拒绝您对工作树的更改,并且不会丢失任何提交¹。

git reset --hard <specified commit>另一方面,会将您当前的分支移动到指定的提交,您将丢失工作树中的所有更改。另外,如果您要移至较旧的提交,而较新的提交不在其他分支中,则也会丢失这些较新的提交。这不是安全的操作,除非您真正了解自己在做什么,否则请不要这样做。

有关如何撤消git commit的信息,另请参见这些出色的答案

您也可以从使用SourceTree之类的GUI工具中受益。


¹-好吧,除非您在某些悬空提交时已经处于分离的头脑状态,但通常您不必担心。