Git Revert,Checkout和Reset有什么区别?

我正在尝试学习如何将文件和项目恢复或回滚到之前的状态,而不理解git revertcheckoutreset之间的区别。 为什么有三个不同的命令用于看似相同的目的,什么时候应该有人select一个呢?

这三个命令有完全不同的目的。 他们甚至不是很相似。

git revert

这个命令创build一个新的提交,撤销之前提交的更改。 该命令将新的历史logging添加到项目中(不会修改现有的历史logging)。

git checkout

这个命令将从存储库中检出内容并将其放入工作树中。 它也可以有其他的效果,这取决于命令的调用方式。 例如,它也可以改变你当前正在工作的分支。 该命令不会对历史进行任何更改。

git reset

这个命令有点复杂。 它实际上根据调用方式做了几个不同的事情。 它修改了索引(所谓的“暂存区域”)。 或者它改变分支头当前指向的提交。 这个命令可以改变现有的历史(通过改变分支引用的提交)。

使用这些命令

如果一个提交已经在项目的历史中的某个地方做了,然后你决定提交是错误的,而且不应该完成,那么git revert就是这个工作的工具。 它将撤消由不良提交引入的更改,在历史logging中logging“撤销”。

如果你修改了工作树中的一个文件,但是没有提交修改,那么你可以使用git checkout来检出文件的新存储库副本。

如果你已经做了一个提交,但没有与其他人共享,而你决定不需要,那么你可以使用git reset重写历史logging,使其看起来好像你从来没有提交过。

这些只是一些可能的使用场景。 还有其他一些在某些情况下可能有用的命令,上面的三个命令也有其他用途。

  • git revert用于撤销以前的提交。 在git中,你不能改变或擦除先前的提交。 (实际上,你可以,但是它可能会导致问题。)所以,而不是编辑早期的提交,恢复引入了一个新的提交,扭转了一个较早的提交。
  • git reset用于撤消工作目录中尚未完成的更改。
  • git checkout用于将文件从其他提交复制到当前工作树。 它不会自动提交文件。
  • git checkout修改你的工作树,
  • git reset修改你所在分支的哪个引用指向,
  • git revert添加一个提交撤消更改。

如果你破坏了树,但没有提交代码,你可以使用git reset ,如果你只想恢复一个文件,你可以使用git checkout

如果你打破了树并提交了代码,你可以使用git revert HEAD

http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html

重置 –在提交级别上,重置是将分支的提示移到其他提交的一种方法。 这可以用来删除当前分支的提交。

恢复 –恢复通过创build一个新的提交撤销提交。 这是撤消更改的安全方法,因为它没有重写提交历史的机会。 将这与git reset进行比较,这会改变现有的提交历史logging。 出于这个原因,应该使用git revert来撤销公共分支上的更改,并且应该保留git reset以撤消对私有分支的更改。

你可以看看这个链接 – 复位,签出和还原

假设你有提交:

 C B A 

git revert B ,将创build一个提交,撤消B更改。

git revert A ,将创build一个提交,撤销A更改,但不会触及B更改

请注意,如果B中的更改依赖于A更改,则A的还原是不可能的。

git reset --soft A ,将会改变提交历史和仓库; 暂存和工作目录仍然处于C状态。

git reset --mixed A ,会改变提交历史logging,存储库和分段; 工作目录仍然处于C状态。

git reset --hard A ,会改变提交历史,存储库,分段和工作目录; 你会完全回到A的状态。