一、参考资料
https://www.jianshu.com/p/f7451177476a
http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
https://git-scm.com/docs/git-reset
http://gitbook.liuhui998.com/4_9.html
二、Git revert
- 1、git revert用一个新提交来消除一个历史提交所做的任何修改。
- 2、git revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新。
- 3、git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。这种作法在你已经把代码发布的情况下十分正确。
命令:
# 撤销提交到指定版本
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
# 撤销前一次 commit,作为一次新的commit
git revert HEAD
# 撤销前前一次 commit,作为一次新的commit
git revert HEAD^
- 4、git revert 其实不会直接创建一个提交(commit), 把撤消后的文件内容放到索引(index)里,你需要再执行git commit命令,它们才会成为真正的提交(commit)。
三、Git reset
reset 为 重置到这次提交,将当前HEAD重置为指定状态。
- 1、git reset 命令后面是需要加2种参数的:--hard 和 --soft。这条命令默认情况下是 –soft。
命令:
# 先回退
git reset --hard commit_id 强制退到/进到 指定commit_id
# 再提交
git push origin remote_branch_name:local_branch_anme --force
- 2、修复未提交文件中的错误(重置)
解释一下上面的意思:就是如果你现在的工作目录(work tree)里搞的一团乱麻,但是你现在还没有把它们提交;你可以通过下面的命令, 让工作目录回到上次提交时的状态(last committed state)。这条命令会把你工作目录中所有未提交的内容清空。
git reset --hard HEAD
- 3、执行上述命令时,这条commit号之后(时间作为参考点)的所有commit的修改都会退回到git缓冲区中。使用
git status
命令可以在缓冲区中看到这些修改。而如果加上-–hard参数,则缓冲区中不会存储这些修改,git会直接丢弃这部分内容。
可以使用git push origin HEAD --force
强制将分区内容推送到远程服务器。
四、Git reset和Git revert的差异
- 1、git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
- 2、上面我们说的如果你已经push到线上代码库,reset 删除指定commit以后,你git push可能导致一大堆冲突,但是revert 并不会。
- 3、reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了;而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的。