git代码回退

情况1、还没有push
可能 git add ,commit以后发现代码有点问题,想取消提交,用:

reset
git reset [--soft | --mixed | --hard]

  eg:
  git reflog
  git reset --hard Obfafd

--soft  :保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.
--mixed :会保留源码,只是将git commit和index 信息回退到了某个版本. git reset 默认是 --mixed 模式; git reset --mixed等价于git reset
--hard :源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码)

push代码以后,不能再使用git reset --hard <commit...> 回退代码到某个之前版本,因为这样会有一个问题,你线上的代码没有变,
线上commit,index都没有变,当你把本地(线下)代码修改完提交的时候全是冲突.....

 

情况2、已经push
此时若想回退本地代码也想同时回退线上代码,将线上代码回滚到某个指定的版本,使线上线下代码保持一致.使用:

git revert c011eb3c(哈希值)

git revert用于反转提交,执行evert命令时要求工作树必须是干净的.
git revert用一个新提交来消除一个历史提交所做的任何修改.
revert之后你的本地代码也会回滚到指定的历史版本,这时你再git push即可以把线上的代码更新.(这里不会像reset造成冲突的问题)

git revert注意事项:

1.使用revert HEAD是撤销最近的一次提交,如果你最近一次提交是用revert命令产生的,那么你再执行一次,就相当于撤销了上次
的撤销操作,换句话说,你连续执行两次revert HEAD命令,就跟没执行是一样的
2.使用revert HEAD~1 表示撤销最近2次提交,这个数字是从0开始的,如果你之前撤销过产生了commi id,那么也会计算在内的。
如果使用revert撤销的不是最近一次提交,那么一定会有代码冲突,需要你合并代码,合并代码只需要把当前的代码全部去掉,保留之前版本的代码就可以了.


revert与reset的不同之处:
1.git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
2.上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.
3.如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.
4.reset是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD (版本)是一直向前的.所以,当你用revert回退之后,所有人pull之后,他们的代码也自动的回退了。 

 

==========================

方法2:

也可以:
  git reflog
  git reset --hard Obfafd
  git push -f
强制推送到远程分支;注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支

 

posted on 2017-12-21 00:24  Hello-World3  阅读(1176)  评论(0编辑  收藏  举报

导航