git reset
git reset的作用是还原Index的状态或改动本地分支HEAD的位置。
这个命令适合用于从某个提交点又一次开新的分支。比方,假设某个提交之后的代码我们都不要了,就能够在本地reset至指定commit,然后开一个新的branch继续新的开发(原来分支在远程上没有发生不论什么变化的)。
使用git reset是不影响远程分支的。一切都在本地发生。假设回退须要非常快影响远程分支的,应该使用git revert。
git revert
假如某些旧提交我们不想要了,而又不愿通过自己改动代码又一次提交的方式来完毕,这个时候我们就能够把这项工作交给revert命令。
Git Revert原理:依据你要回退的提交所做的改动做相反的改动,然后又一次提交代码,使代码达到没有这些旧提交所能达到的状态。
假设对于git revert的回退策略还没理解,这样讲或许你就能理解了:回退旧的提交必定会导致当前最新代码发生变化,比方之前某个提交加了一行代码,那么回退就是在同样位置减一行代码。Git不会真的把旧提交抛弃,假设直接抛弃,历史记录就追踪不到了。因此。旧提交事实上是没动的,Git仅仅是依据旧提交反着做了一遍,这才导致最新的代码发生了改变。
仅仅有把revert命令回退导致的改动又一次提交,revert命令才算真的完毕并生效。否则效果仅仅相当于改动了工作树的文件而已。
注意:revert之后须要push到远程分支上其它用户才干看到回退发生的改动。
使用git revert会出现的问题
由于git revert是用新提交覆盖旧提交,因此,被覆盖的提交等于不会被採用了。
假设两个分支(假设是master和A分支)先合并再用revert回滚。之后又合并(A合并到master),就会发如今master分支上,A分支第一次合并之前的改动大部分不见了。
这是由于从时间的发生顺序来看,A分支第一次合并之前的改动发生在revert之前,revert发生在后,而 revert抛弃了A第一合并之前的改动,那么再合并Git就觉得你永远抛弃了A第一次之前的改动。
要解决问题,须要把revert产生的提交再revert一次。