回滚master代码_Git之master主干代码回滚
本節概覽:通過git revert來實現線主干代碼的回滾。如下命令
對于 merge類型的commit對象,還需要“-m”參數
git revert -m 1? commit-id
1
gitrevert-m1?commit-id
對于普通的commtit對象
git revert commit-id
1
gitrevertcommit-id
1 問題描述
一個同事不小把自己代碼合并 到了master生成C2。但是在該同事還沒有回滾之前,又有其他同事合并到master生成了C3。現在問題是我們想要回滾到C1應該怎么做?
2 解決問題
1、選擇git revert還是git reset?
git revert是生成新的commit對象,而git reset是刪除commit對象,為了保留記錄,使用git revert命令。
2、解決
按時間順序,依次回滾每一個commit對象,直到自己想要的那個commit對象為準。如下:
# 回滾C3 ,c3-id是C3對應的那個commit-id
git revert -m? 1? c3-id
# 回滾C2。其中c2-id是C2對應的那個commit-id
git? revert? -m? 1? c2-id
1
2
3
4
5
# 回滾C3 ,c3-id是C3對應的那個commit-id
gitrevert-m?1?c3-id
# 回滾C2。其中c2-id是C2對應的那個commit-id
git?revert?-m?1?c2-id
3、上面的命令為什么有“-m 1”?
這是因為上面的C2和C3不是普通的commit對象,都是merge生成的commit對象。如下圖,如果需要通過git revert回滾M3,那么此時會在M3后面生成一個新的commit節點R,那么這個新節點R是屬于M分支(M1->M2->M3->R)還是D分支(D1->D2->D3->R)呢?此時可以通過“-m” 來指定,如果是1,表示的是當前所在的分支,如果是2表示的是另外的分支。
對于上面的問題,由于我們當前分支是master,我們希望revert之后生成的commit也在master這條分支上,所以指定“-m 1”。
這里需要注意的是,如果只是普通的commit 對象,不是merge類型commit對象(由merge產生commit對象),就不需要”-m 1″了
3 問題總結
后續再遇到代碼回滾,通過哪些步驟來做呢?這里總結了一些步驟。
1、假設在master上C0后面有C1、C2、C3三次代碼提交,此時需要回滾到C0。
2、回滾步驟如下
(1)第一步切到master代碼,使用git log,如下圖,獲取到每一個commit對象對應的commit-id和commit對象類型(是普通類型還是merge類型)。
commit ee1389bba4bfcaa0ddb850c6e58d1e982fdfcb4d
Merge: 8397201 7dc873c
Author: jie01
Date: Thu Oct 12 20:27:33 2017 +0800
Merge branch 'fweb_1-0-806_BRANCH' into master
commit 2f315650dff28e94d654309ed3230c34d32f1000
Author: shan03
Date: Tue Oct 17 14:33:16 2017 +0800
commit 7dc873cd34b8bba1fab68635ddf8331ab2babc74
Merge: cbaf7d9 d24f133
Author: xu01
Date: Thu Oct 12 15:59:13 2017 +0800
Merge branch 'web_1-0-790_BRANCH' into financeweb_1-0-806_BRANCH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
commitee1389bba4bfcaa0ddb850c6e58d1e982fdfcb4d
Merge:83972017dc873c
Author:jie01
Date:ThuOct1220:27:332017+0800
Mergebranch'fweb_1-0-806_BRANCH'intomaster
commit2f315650dff28e94d654309ed3230c34d32f1000
Author:shan03
Date:TueOct1714:33:162017+0800
commit7dc873cd34b8bba1fab68635ddf8331ab2babc74
Merge:cbaf7d9d24f133
Author:xu01
Date:ThuOct1215:59:132017+0800
Mergebranch'web_1-0-790_BRANCH'intofinanceweb_1-0-806_BRANCH
(2) 第二步按時間倒序,依次執行”git revert”回滾每一個commit對象
對于 merge類型的commit對象,需要“-m”參數
git revert -m 1? commit-id
1
gitrevert-m1?commit-id
對于普通的commtit對象
git revert commit-id
1
gitrevertcommit-id
所以回滾命令如下
# 回滾C3,merge類型commit對象,需要-m
git revert? -m 1 ? ee1389bba4bfcaa0ddb850c6e58d1e982fdfcb4d
# 回滾C2,普通commit對象
git revert? 2f315650dff28e94d654309ed3230c34d32f1000
# 回滾C1,merge類型commit對象,需要-m
git revert -m 1? 7dc873cd34b8bba1fab68635ddf8331ab2babc74
1
2
3
4
5
6
7
8
# 回滾C3,merge類型commit對象,需要-m
gitrevert?-m1?ee1389bba4bfcaa0ddb850c6e58d1e982fdfcb4d
# 回滾C2,普通commit對象
gitrevert?2f315650dff28e94d654309ed3230c34d32f1000
# 回滾C1,merge類型commit對象,需要-m
gitrevert-m1?7dc873cd34b8bba1fab68635ddf8331ab2babc74
后續問題
比如說當M3執行了git revet生成RM3,此時在master上又有其他人提交了M4,我們還需要在dev上進行開發D4和D5,如下圖
此時怎么合并D5到master的M4
(1)第一步? master合并到D5
因為master執行了git revert撤銷操作,所以此時D1和D2的代碼會被刪除?
在master上執行git revert撤銷 RM3
將master合并到dev的D5
(2)第二步 將dev的合并到master
附1 其他方法-通過覆蓋方法來實現回滾主干
步驟如下:
第一步 分別拉兩份代碼。第一份代碼上面基于master新建一個分支F1,作為發布分支;第二份代碼可以通過git checkout切到自己想要回滾的那個版本上(切到某個commit對象上)。
第二步 刪除分支F1對應的代碼,把第二份代碼拷貝到F1上面,即使用第二份代碼覆蓋F1的代碼。。
第三步提交F1代碼,并合并到master。
附2 git revert和git reset區別
1、git revert 。只是撤銷某一次commit的操作,并沒有刪除commit對象;并且會生成一個新的commit對象。
假設分支為m1->m2->m3。當我們”git revet m2″生成m4,此時在m4里面只是把m2的操作撤銷了而已,并沒有撤銷m2和m3對象。此時分支為“m1->m2->m3->m4”
2、git reset。刪除某一個commit之后所有commit提交對象;不會產生新的commit對象。
假設m1->m2->m3,當我們git reset m2,此時并沒有生成新的commit對象,并且刪除了m2和m3兩個commit對象,此時分分支為”m1->m2″。
附3 參考
(全文完)
總結
以上是生活随笔為你收集整理的回滚master代码_Git之master主干代码回滚的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xhr如何发送post请求_js实现aj
- 下一篇: strtus2改成springboot_