git学习——代码回滚(5)

一、参考资料

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 是一直向前的。
原文地址:https://www.cnblogs.com/jaspersong/p/8697096.html