Git Revert,Checkout和Reset有什么区别?
我正在尝试学习如何将文件和项目恢复或回滚到之前的状态,而不理解git revert , checkout和reset之间的区别。 为什么有三个不同的命令用于看似相同的目的,什么时候应该有人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的状态。