天天看點

git revert實戰1.reset revert差別2.revert commit3.revert merge

1.reset revert差別

  • git reset是直接删除指定的commit,把HEAD向後移動了一下
  • git revert是一次新的特殊的commit,HEAD繼續前進,本質和普通add commit一樣,僅僅是commit内容很特殊:送出的内容是與前面普通commit文本變化的反操作。比如前面普通commit是增加一行a,那麼revert内容就是删除一行a

    由于reset方式HEAD指針後移,推送到遠端時需要有強制更新權限或者删除分支權限,公司gforge設有權限限制,走不通。

2.revert commit

僅僅用于非merge操作的普通commit

假設按時間順序依次有commit1, commit2, commit3,commit4,對應有version1, version2, version3, version4四個狀态.

  • revert某次commit(例子中commit4,commit4不是merge,那麼revert後包括commit4以及後面的commit都會被抵消,最終檔案狀态為commit4前,即version 3狀态)

    git revert commit4

    [master 3a2ea91] Revert "version 4"
    1 file changed, 1 insertion(+), 2 deletions(-)      
    git status
    #位于分支 master
    #您的分支領先 'origin/master' 共 1 個送出。#   (使用 "git push" 來釋出您的本地送出)
    #
    無檔案要送出,幹淨的工作區      

    此時git push即可推送至遠端

    push後有commit5(commit5即本次convert操作),對應着version5,剛好version5與version3的檔案狀态一緻,因為version4及以後的修改被抵消掉了.

    revert過程有可能遇到沖突,要麼git revert --abort終止此次revert操作,代碼還原至revert指令前。要麼手動消除沖突(同普通的沖突解決),然後add commit

3.revert merge

适用于merge操作的commit

假設目前狀态:

commit 94ce4b8dcb898f730e6eecd73c00491f8020b67e
Merge: a2471f3 6a17d85
本次屬于merge commit,注意Merge 标注
Author: 羅** <luo**@youku.com>
Date:   Fri May 20 11:03:53 2016 +0800

    merge

commit a2471f331c36a21d25aa158668cdc05987eef114
Author: 羅** <luo**@youku.com>
Date:   Fri May 20 11:03:01 2016 +0800

    verison 9

commit 6a17d85b04e52eddeb2ecb2a311804e10dada1e6
Author: 羅** <luo**@youku.com>
Date:   Fri May 20 11:02:10 2016 +0800

    version 8

commit 9441871ec2ff071e1a5be41646a32b2aea0b5502
Author: 羅** <luo**@youku.com>
Date:   Fri May 20 10:56:08 2016 +0800

    version 7

      

可以看到94ce4b8是一次merge commit,Merge 标注為Merge: a2471f3 6a17d85,意思是說目前分支commit a2471f3(version 9),加上來自其他分支的commit 6a17d85(version 8).此時要撤銷94ce4b8所表示的merge.

如果不指定-m參數

git revert 94ce4b8dcb898f730e6eecd73c00491f8020b67e
error: 送出 94ce4b8dcb898f730e6eecd73c00491f8020b67e 是一個合并送出但未提供 -m 選項。
fatal: 還原失敗
      

指定-m參數

git revert 94ce4b8dcb898f730e6eecd73c00491f8020b67e -m 2
# 位于分支 develop
無檔案要送出,幹淨的工作區
      

-m參數含義:Merge 标注為Merge: a2471f3 6a17d85,傳1表示撤銷到a2471f3所代表的commit,傳2表示撤銷到6a17d85所代表的commit。數字1,2表示的是标注冒号後的位置編号

上面例子中傳參-m 2,是以撤銷到6a17d85,最終檔案狀态與6a17d85 commit後一緻(注意與上文差異),本例子中結果狀态是“version 8”,不是version 7, git log确認結果如下:

commit 290c2f72d8d56d6be1008807450d4635095a549b
Author: 羅** <luo**@youku.com>
Date:   Fri May 20 11:32:34 2016 +0800

    Revert "merge"

    This reverts commit 94ce4b8dcb898f730e6eecd73c00491f8020b67e, reversing
    changes made to 6a17d85b04e52eddeb2ecb2a311804e10dada1e6.