回滚master代码_Git之master主干代码回滚
本節(jié)概覽:通過git revert來實(shí)現(xiàn)線主干代碼的回滾。如下命令
對于 merge類型的commit對象,還需要“-m”參數(shù)
git revert -m 1? commit-id
1
gitrevert-m1?commit-id
對于普通的commtit對象
git revert commit-id
1
gitrevertcommit-id
1 問題描述
一個同事不小把自己代碼合并 到了master生成C2。但是在該同事還沒有回滾之前,又有其他同事合并到master生成了C3。現(xiàn)在問題是我們想要回滾到C1應(yīng)該怎么做?
2 解決問題
1、選擇git revert還是git reset?
git revert是生成新的commit對象,而git reset是刪除commit對象,為了保留記錄,使用git revert命令。
2、解決
按時間順序,依次回滾每一個commit對象,直到自己想要的那個commit對象為準(zhǔn)。如下:
# 回滾C3 ,c3-id是C3對應(yīng)的那個commit-id
git revert -m? 1? c3-id
# 回滾C2。其中c2-id是C2對應(yīng)的那個commit-id
git? revert? -m? 1? c2-id
1
2
3
4
5
# 回滾C3 ,c3-id是C3對應(yīng)的那個commit-id
gitrevert-m?1?c3-id
# 回滾C2。其中c2-id是C2對應(yīng)的那個commit-id
git?revert?-m?1?c2-id
3、上面的命令為什么有“-m 1”?
這是因?yàn)樯厦娴腃2和C3不是普通的commit對象,都是merge生成的commit對象。如下圖,如果需要通過git revert回滾M3,那么此時會在M3后面生成一個新的commit節(jié)點(diǎn)R,那么這個新節(jié)點(diǎn)R是屬于M分支(M1->M2->M3->R)還是D分支(D1->D2->D3->R)呢?此時可以通過“-m” 來指定,如果是1,表示的是當(dāng)前所在的分支,如果是2表示的是另外的分支。
對于上面的問題,由于我們當(dāng)前分支是master,我們希望revert之后生成的commit也在master這條分支上,所以指定“-m 1”。
這里需要注意的是,如果只是普通的commit 對象,不是merge類型commit對象(由merge產(chǎn)生commit對象),就不需要”-m 1″了
3 問題總結(jié)
后續(xù)再遇到代碼回滾,通過哪些步驟來做呢?這里總結(jié)了一些步驟。
1、假設(shè)在master上C0后面有C1、C2、C3三次代碼提交,此時需要回滾到C0。
2、回滾步驟如下
(1)第一步切到master代碼,使用git log,如下圖,獲取到每一個commit對象對應(yīng)的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) 第二步按時間倒序,依次執(zhí)行”git revert”回滾每一個commit對象
對于 merge類型的commit對象,需要“-m”參數(shù)
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
后續(xù)問題
比如說當(dāng)M3執(zhí)行了git revet生成RM3,此時在master上又有其他人提交了M4,我們還需要在dev上進(jìn)行開發(fā)D4和D5,如下圖
此時怎么合并D5到master的M4
(1)第一步? master合并到D5
因?yàn)閙aster執(zhí)行了git revert撤銷操作,所以此時D1和D2的代碼會被刪除?
在master上執(zhí)行g(shù)it revert撤銷 RM3
將master合并到dev的D5
(2)第二步 將dev的合并到master
附1 其他方法-通過覆蓋方法來實(shí)現(xiàn)回滾主干
步驟如下:
第一步 分別拉兩份代碼。第一份代碼上面基于master新建一個分支F1,作為發(fā)布分支;第二份代碼可以通過git checkout切到自己想要回滾的那個版本上(切到某個commit對象上)。
第二步 刪除分支F1對應(yīng)的代碼,把第二份代碼拷貝到F1上面,即使用第二份代碼覆蓋F1的代碼。。
第三步提交F1代碼,并合并到master。
附2 git revert和git reset區(qū)別
1、git revert 。只是撤銷某一次commit的操作,并沒有刪除commit對象;并且會生成一個新的commit對象。
假設(shè)分支為m1->m2->m3。當(dāng)我們”git revet m2″生成m4,此時在m4里面只是把m2的操作撤銷了而已,并沒有撤銷m2和m3對象。此時分支為“m1->m2->m3->m4”
2、git reset。刪除某一個commit之后所有commit提交對象;不會產(chǎn)生新的commit對象。
假設(shè)m1->m2->m3,當(dāng)我們git reset m2,此時并沒有生成新的commit對象,并且刪除了m2和m3兩個commit對象,此時分分支為”m1->m2″。
附3 參考
(全文完)
總結(jié)
以上是生活随笔為你收集整理的回滚master代码_Git之master主干代码回滚的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xhr如何发送post请求_js实现aj
- 下一篇: strtus2改成springboot_