GIT實(shí)操手冊(cè) —— 所以到現(xiàn)在合并分支你只會(huì)用 git merge 嗎

目錄

  • 實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)
    • git merge 合并代碼
      • 創(chuàng)建分支和提交記錄
      • 進(jìn)行合并
      • 解決沖突
      • 回滾代碼
      • 補(bǔ)充操作
    • 再來(lái)看看使用 git rebase 合并分支
      • 創(chuàng)建分支和提交記錄
      • 進(jìn)行合并
      • 處理沖突
      • 版本回滾
    • git rebase 還有什么優(yōu)化的空間嗎?
      • 為什么要對(duì)版本進(jìn)行合并?
      • 如何對(duì)代碼進(jìn)行合并呢?
  • git merge VS. git rebase 總結(jié)
    • 相同的地方
    • 不同的地方
  • 為什么要推薦使用 git rebase 呢?
  • 這里還有幾點(diǎn)重要的說(shuō)明

我們現(xiàn)在分支合并想到最多的就是git merge肴敛,還有一個(gè)合并代碼的命令git rebase挑童,而這個(gè)命令在工作中優(yōu)先被推薦使用,下面先通過(guò)兩個(gè)例子體會(huì)一下兩個(gè)命令合并代碼的差別:

實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)

git merge 合并分支

創(chuàng)建分支和提交記錄

  1. master分支創(chuàng)建一個(gè)merge1分支品腹,進(jìn)行第一次提交
git checkout master
git checkout -b merge1
git add .
git commit -m 'merge1'
  1. master分支創(chuàng)建一個(gè)merge2分支冷溶,修改代碼,進(jìn)行第一次提交
git checkout master
git checkout -b merge2
git add .
git commit -m 'merge2'
  1. 切換到merge1分支,修改代碼彪置,進(jìn)行第二次提交
git checkout merge1
git add .
git commit -m 'merge1-2'
  1. 切換到merge2分支,修改代碼蝇恶,進(jìn)行第二次提交
git checkout merge2
git add .
git commit -m 'merge2-2'

進(jìn)行合并

5.將merge2分支mergemerge1分支中拳魁,解決沖突之后會(huì)有一個(gè)新的 mergecommit 分支。

git checkout merge1
git merge merge2
image
image
  1. 如果想取消合并撮弧,直接使用git merge --abort
git merge --abort

解決沖突

  1. 解決沖突之后(這里選擇保留雙方更改)潘懊,這里選擇直接提交代碼
git add .
git commit -m 'merge1 merge merge2'
image

回滾代碼

  1. 如果想要回到merge1-2,執(zhí)行操作git reset
image

補(bǔ)充操作

  1. 在第7步的時(shí)候贿衍,如果直接使用git merge --continue會(huì)進(jìn)入面板授舟,可以修改提交分支的信息
git merge --continue
image

這個(gè)時(shí)候i插入,修改merge1 merge merge2 continue之后按ESC鍵贸辈,然后按:wq保存释树,可以看出,這邊還是會(huì)新保留一個(gè)commit

image
  1. 9步之后想要回到merge1-2擎淤,操作git reset
git reset <commitID>
image

再來(lái)看看使用 git rebase 合并分支

創(chuàng)建分支和提交記錄

  1. master分支創(chuàng)建一個(gè)merge1分支奢啥,進(jìn)行第一次提交
git checkout master
git checkout -b merge1
git add .
git commit -m 'merge1'
  1. master分支創(chuàng)建一個(gè)merge2分支,修改代碼嘴拢,進(jìn)行第一次提交
git checkout master
git checkout -b merge2
git add .
git commit -m 'merge2'
  1. 切換到merge1分支桩盲,修改代碼,進(jìn)行第二次提交
git checkout merge1
git add .
git commit -m 'merge1-2'
  1. 切換到merge2分支席吴,修改代碼赌结,進(jìn)行第二次提交
git checkout merge2
git add .
git commit -m 'merge2-2'

進(jìn)行合并

  1. 切換到merge1分支,進(jìn)行rebase操作git rebse merge2
git checkout merge1
git rebase merge2

首先這里可以看到要和兩個(gè)提交進(jìn)行rebase抢腐,

image
  1. 此時(shí)想要退出合并姑曙,寫(xiě)git rebase --abort
git rebase --abort

處理沖突

  1. 我們要手動(dòng)修改第一個(gè)提交,因?yàn)檫@個(gè)提交不是最后一個(gè)提交迈倍,所以?xún)?nèi)容可以不保留伤靠,選擇采用當(dāng)前更改
image
  1. 然后提交修改,這里先使用git add .啼染,然后使用git rebase --continue時(shí)說(shuō)沒(méi)有修改宴合,是否強(qiáng)制使用git rebase --skip跳過(guò)
git add .
git rebase --skip
image
  1. 這個(gè)成功之后進(jìn)入下一個(gè)提交,這里可以看到迹鹅,這里與merge的當(dāng)前更改和傳入更改的位置是有改變的卦洽,傳入的更改反而是merge1,這個(gè)時(shí)候選擇保留雙方更改斜棚。
image
  1. 然后提交修改
git add .
git rebase --continue
image
  1. 此時(shí)查看git log阀蒂,發(fā)現(xiàn)合并后的log展示
  • 并沒(méi)有再生成新的提交記錄
  • 這里的log順序和merge不同
  • 因?yàn)閯偛盼覀兪褂?code>skip跳過(guò)了一個(gè)commit该窗,所以這里并沒(méi)有merge1
image

版本回滾

  1. 此時(shí)要回滾到merge1-2的時(shí)候蚤霞,即沒(méi)有rebase之前酗失,是無(wú)法回退的,因?yàn)槲覀兊陌姹緲?shù)里面昧绣,已經(jīng)找不到合并之前的兩次提交了规肴,這個(gè)時(shí)候需要使用git reflog操作日志進(jìn)行回滾,這里使用第幾步可以回滾的更好夜畴。
image

git rebase 還有什么優(yōu)化的空間嗎?

一般使用git rebase的時(shí)候拖刃,都會(huì)將當(dāng)前的版本進(jìn)行commit合并。

為什么要對(duì)版本進(jìn)行合并?

剛才實(shí)驗(yàn)的時(shí)候贪绘,其實(shí)我們已經(jīng)看到了兑牡,git rebase的流程是,將merge2的代碼拉到merge1中兔簇,然后和merge1中提交的代碼一次一次進(jìn)行diff发绢,但是一般情況下,我們一般會(huì)將merge1中最后一次提交的代碼視為最終代碼垄琐,并不需要再和之前的代碼進(jìn)行diff边酒,這個(gè)時(shí)候就需要先將之前的版本合并,然后再與merge2進(jìn)行diff狸窘,此時(shí)只需要diff一次即可墩朦。

如何對(duì)代碼進(jìn)行合并呢?

請(qǐng)看這篇博客:方法二:合并需要的commit

git merge VS. git rebase 總結(jié)

相同的地方

對(duì)git版本進(jìn)行管理,功能是合并代碼翻擒,都需要手動(dòng)解決沖突氓涣。

不同的地方

比較 git merge git rebase
原理 git merge是兩個(gè)分支最新commit進(jìn)行diff比較,解決沖突之后生成一個(gè)新的commit記錄 git rebase是將目標(biāo)分支拉取陋气,并與當(dāng)前分支的每一個(gè)提交逐一進(jìn)行diff劳吠,將當(dāng)前分支合并到目標(biāo)分支代碼的后面,解決沖突之后更新commitID巩趁,當(dāng)前分支原來(lái)的commitID不保留在log記錄中
查看log commit記錄按照版本提交時(shí)間進(jìn)行排列痒玩,并不是版本的真實(shí)順序。
image
按照合并順序進(jìn)行排列议慰,實(shí)際版本的真實(shí)順序
image
原理圖 這個(gè)是分支存在的真實(shí)結(jié)構(gòu)圖
image
這個(gè)圖描述了蠢古,merge1的rebase操作,是將merge2代碼拉過(guò)來(lái)之后將自己合并到其后面
image

為什么要推薦使用 git rebase 呢?

  1. 避免在總分支上手動(dòng)處理沖突的危險(xiǎn)操作
    我們實(shí)際開(kāi)發(fā)的時(shí)候别凹,都會(huì)有一個(gè)總的dev分支草讶,和一個(gè)自己的分支work,正確的操作是我們應(yīng)該先將dev的分支拉過(guò)來(lái)炉菲,然后將我們的代碼合并上去堕战,首先在我們自己的work代碼中坤溃,有一個(gè)處理完沖突的最新代碼,其次再去dev分支merge我們的work分支践啄,這樣浇雹,就不會(huì)出現(xiàn)在dev分支上手動(dòng)處理沖突的危險(xiǎn)操作。
# 在work分支
git rebase dev
# 處理完分支屿讽,切換到dev分支
git checkout dev
# 合并work分支的代碼
git merge work
  1. 得到一個(gè)干凈整潔的版本樹(shù)
    通過(guò)上面的原理圖我們可以看到,在分支存儲(chǔ)的時(shí)候吠裆,兩個(gè)分支的內(nèi)容還是實(shí)際還是分開(kāi)的伐谈,而rebase之后的版本樹(shù),是一條真實(shí)干凈的版本樹(shù)试疙。這個(gè)對(duì)以后正式版本的維護(hù)是很可的一件事诵棵,也是推薦大家用的。

這里還有幾點(diǎn)重要的說(shuō)明

  1. 千萬(wàn)不要用dev分支去rebase我們自己的分支祝旷。

  2. rebase dev的時(shí)候履澳,盡量先將自己所有的commit合并成1個(gè),然后再進(jìn)行rebase操作怀跛。

  3. 對(duì)于dev分支來(lái)說(shuō)距贷,使用rebase更好一些。如果進(jìn)行回滾操作了吻谋,那么當(dāng)前分支修改之后還需要再次與dev 進(jìn)行一次merge操作忠蝗。如果是rebase,直接可以在最新的代碼中進(jìn)行修改漓拾。

  4. 重重重要的說(shuō)明! 重重重要的說(shuō)明! 重重重要的說(shuō)明!有些人會(huì)說(shuō)rebase的操作復(fù)雜阁最,而且回滾操作很不方便,我們都知道合并是一件很慎重的事情骇两,所以我們?cè)谶M(jìn)行合并操作的時(shí)候速种,也要進(jìn)行慎重思考。之前也有遇到過(guò)低千,有同時(shí)濫用merge將別人代碼沖掉的情況配阵,所以對(duì)于開(kāi)發(fā)來(lái)說(shuō),上線(xiàn)的東西質(zhì)量保證是很重要的栋操。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闸餐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子矾芙,更是在濱河造成了極大的恐慌舍沙,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剔宪,死亡現(xiàn)場(chǎng)離奇詭異拂铡,居然都是意外死亡壹无,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)感帅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斗锭,“玉大人,你說(shuō)我怎么就攤上這事失球♂牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵实苞,是天一觀的道長(zhǎng)豺撑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)黔牵,這世上最難降的妖魔是什么聪轿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮猾浦,結(jié)果婚禮上陆错,老公的妹妹穿的比我還像新娘。我一直安慰自己金赦,他們只是感情好音瓷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著素邪,像睡著了一般外莲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兔朦,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天偷线,我揣著相機(jī)與錄音,去河邊找鬼沽甥。 笑死声邦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摆舟。 我是一名探鬼主播亥曹,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼恨诱!你這毒婦竟也來(lái)了媳瞪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤照宝,失蹤者是張志新(化名)和其女友劉穎蛇受,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厕鹃,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兢仰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年乍丈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片把将。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轻专,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出察蹲,到底是詐尸還是另有隱情请垛,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布洽议,位于F島的核電站叼屠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绞铃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一嫂侍、第九天 我趴在偏房一處隱蔽的房頂上張望儿捧。 院中可真熱鬧,春花似錦挑宠、人聲如沸菲盾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懒鉴。三九已至,卻和暖如春碎浇,著一層夾襖步出監(jiān)牢的瞬間临谱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工奴璃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悉默,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓苟穆,卻偏偏與公主長(zhǎng)得像抄课,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雳旅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容