rebase與merge的對比及cherry-pick

一、rebase

應(yīng)用場景:合并分支,讓日志顯示更加人性化,方便回滾

一般我們合并分支溯香,會使用merge命令,merge命令的原理如下,會在提交的分支后面再增加一個合并分支:



而如果我們使用rebase命令浓恶,會把公共分支放在當(dāng)前分支之前玫坛。



rebase相對于merge的好處是日志更加清晰了,便于回滾包晰。而壞處在于更容易引起沖突湿镀。
接下來我們做一個栗子,來說明一下情況伐憾。 我們新建一個分支master3勉痴,然后新建一個"readme.md"文件,寫入一行內(nèi)容树肃,并且提交到資源庫蒸矛。
git checkout -b master3
echo readme > readme.md
git commit -am "init data"

使用更新日志如下:



接下來我們創(chuàng)建兩個分支,分別取名 "merge-test"和"rebase-test"

    git branch merge-test
    git branch rebase-test

在master3分支新增三個提交"11","22","33"胸嘴,日志信息與修改的信息相同莉钙。

    echo '11' >> readme.md
    git commit -am "11"
    echo '22' >> readme.md
    git commit -am "22"
    echo '33' >> readme.md
    git commit -am "33"

master3分支的日志如下:



readme.md文件內(nèi)容如下:



現(xiàn)在我們切換到merge-test分支,和master3上做類似的操作筛谚,新增三個提交"aa","bb","cc", 日志信息與修改的信息相同磁玉。 然后合并到 rebase-test 分支。
    git checkout merge-test
    echo 'aa' >> readme.md
    git commit -am "aa"
    echo 'bb' >> readme.md
    git commit -am "bb"
    echo 'cc' >> readme.md
    git commit -am "cc"
    git checkout rebase-test
    git merge/rebase merge-test

merge-test和rebase-test分支日志如下:



readme.md文件內(nèi)容如下:



ps:當(dāng)被合并分支(rebase-test)未做修改驾讲,則rebase和merge分支產(chǎn)生的日志一樣蚊伞。

現(xiàn)在準(zhǔn)備工作已經(jīng)做好了席赂,現(xiàn)在我們分別用merge和rebase的方式把master3分支合并到merge-test和rebase-test中。

merge的栗子

先看merge合并, 會產(chǎn)生沖突时迫。

    git checkout merge-test
    git merge master3

我們解決一下沖突颅停,并查看一下日志:

    git commit -am "merge"
    git log --oneline --graph

我們發(fā)現(xiàn)這個日志文件分叉了,現(xiàn)在我們試著回滾到 "bb", 看會發(fā)生什么掠拳。

    git reset --hard a01f4c27b2
    git log --oneline --graph

日志文件如下:



readme.md文件如下:



我們發(fā)現(xiàn)之前從master3分支合并的代碼沒有了癞揉,需要再合并一次。如果合并的分支越多溺欧,情況很復(fù)雜喊熟,可能就比較難找到到底需要回滾到哪個分支了

rebase的栗子

現(xiàn)在我們來研究一下"rebase"。一樣切換到rebase-test分支, 使用rebase 合并 master3分支姐刁。

    git checkout rebase-test
    git rebase master3

有沖突,我們發(fā)現(xiàn)是“aa”的提交與 master3上的提交相互比較



我們選擇接受全部芥牌,并且把"aa" 放在 "11" 之前, 調(diào)整成如下樣子:



然后我們解決一下沖突聂使。
    git add .
    git rebase --continue

然后因為我們修改完的代碼和 "bb"壁拉、"cc"比較都有沖突,按照上面的方式繼續(xù)解決沖突柏靶,然后提交并繼續(xù)git rebase --continue弃理。最終解決好了之后,我們查看一下日志:



我們發(fā)現(xiàn)日志并沒有分叉∈候眩現(xiàn)在我們試著回退到 "bb"

    git reset --hard 10755375f1

我們發(fā)現(xiàn)master3分支上的內(nèi)容依然保留著痘昌。


小結(jié)

1、rebase 和 merge 都可以用來合并分支
2.1)當(dāng)被合并分支沒有修改時梆靖,rebase和merge效果一樣
2.2)如果兩個分支都有修改,使用merge會在被合并分支后面增加一次提交笔诵, 沖突也只需要解決1次返吻,但日志分叉,不對回滾不友好乎婿。
2.3)如果兩個分支都有修改测僵,使用rebase在把合并分支與被合并分支的提交逐個合并, 沖突有可能需要解決多次谢翎,但日志無分叉捍靠,對回滾友好。
2森逮、rebase 和 merge如何區(qū)分使用
2.1) 上游分支往下游分支更新代碼時使用 "rebase" (master 往 dev合并時)
2.2) 下游往上游更新代碼時使用 "merge" (dev 往 master 合并時)
3榨婆、使用git pull 默認使用merge方式,如果需要使用 rebase 方式褒侧,使用命令 " git pull --rebase"

二良风、cherry-pick

此命令英譯過來是挑櫻桃的意思谊迄,就是在一些櫻桃里面,挑選出好的櫻桃烟央。在git中统诺,就是把A分支中一些需要的提交挑選出來合并到B分支上面。
我們先來用一個栗子疑俭,來看一下這個命令是怎么用的粮呢。

1、基本用法

我們還是用上一個節(jié)提到的master3分支钞艇,先新建兩個分支 cp-master 和 cp-dev, 然后修改cp-dev啄寡,再把cp-dev中的某些修改合并到cp-master上。

git branch cp-master
git checkout -b cp-dev

然后新增三個次提交
1) 最后一行新增 “xyz”
2) 把 "xyz" 改成 "xyzo"
3) 第二行新增 "789"

echo xyz >> readme.md
git add .
git commit -m "xyz"
vi readme.md
## edit start ##
readme
11
22
33
xyzo
## edit end ##
git commit -am "xyz to xyzo"
## edit start ##
readme
789
11
22
33
xaz
## edit end ##
git commit -am "789"

最終的日志為如下



最終的文件內(nèi)容如下:


接下來我們切換到 "cp-master"分支香璃。
1)把第三次提交(789)更新到cp-master上

    git checkout cp-master
    git cherry-pick 6538e91943
    git log --oneline --graph

2)把第二次提交更新到cp-master上

    git cherry-pick 22140132aa 

我們發(fā)現(xiàn)有沖突



解決一下沖突

    git add .
    git cherry-pick --continue
    git log --oneline --graph

最后的文件如下:



我們對比發(fā)現(xiàn)兩個分支的最后的文件基本相同这难,但是提交歷史完全不一樣。

2葡秒、Cherry pick 支持一次轉(zhuǎn)移多個提交姻乓。

git cherry-pick <HashA> <HashB>

上面的命令將 A 和 B 兩個提交應(yīng)用到當(dāng)前分支。這會在當(dāng)前分支生成兩個對應(yīng)的新提交眯牧。

如果想要轉(zhuǎn)移一系列的連續(xù)提交蹋岩,可以使用下面的簡便語法。

git cherry-pick A..B 

上面的命令可以轉(zhuǎn)移從 A 到 B 的所有提交学少。它們必須按照正確的順序放置:提交 A 必須早于提交 B剪个,否則命令將失敗,但不會報錯版确。

注意扣囊,使用上面的命令,提交 A 將不會包含在 Cherry pick 中绒疗。如果要包含提交 A侵歇,可以使用下面的語法。

git cherry-pick A^..B 

3吓蘑、代碼沖突的解決

如果操作過程中發(fā)生代碼沖突惕虑,Cherry pick 會停下來,讓用戶決定如何繼續(xù)操作磨镶。

1)溃蔫、--continue

用戶解決代碼沖突后,第一步將修改的文件重新加入暫存區(qū)(git add .)琳猫,第二步使用下面的命令伟叛,讓 Cherry pick 過程繼續(xù)執(zhí)行。

git cherry-pick --continue
2)脐嫂、--abort

發(fā)生代碼沖突后痪伦,放棄合并侄榴,回到操作前的樣子。

git cherry-pick --abort
3)网沾、--quit

發(fā)生代碼沖突后癞蚕,退出 Cherry pick,但是不回到操作前的樣子辉哥。

git cherry-pick --quit

使用場景

cherry pick 最主要的使用場景大概有:
1桦山、serverB開發(fā)的需求feature1,后來臨時決定要把feature1單獨上serverA醋旦,就可以用cherry pick把feature1的提交單獨摘出來恒水,合并到serverA
2、如果有切錯分支的情況饲齐,比如上游分支原來是master钉凌,不小心切了dev分支,現(xiàn)在要更新到master上面捂人,那只能用cherry-pick把需要提交找出來更新上去御雕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滥搭,隨后出現(xiàn)的幾起案子酸纲,更是在濱河造成了極大的恐慌,老刑警劉巖瑟匆,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闽坡,死亡現(xiàn)場離奇詭異,居然都是意外死亡愁溜,警方通過查閱死者的電腦和手機疾嗅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冕象,“玉大人代承,你說我怎么就攤上這事〗还撸” “怎么了次泽?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵穿仪,是天一觀的道長席爽。 經(jīng)常有香客問我,道長啊片,這世上最難降的妖魔是什么只锻? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮紫谷,結(jié)果婚禮上齐饮,老公的妹妹穿的比我還像新娘捐寥。我一直安慰自己,他們只是感情好祖驱,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布握恳。 她就那樣靜靜地躺著,像睡著了一般捺僻。 火紅的嫁衣襯著肌膚如雪乡洼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天匕坯,我揣著相機與錄音束昵,去河邊找鬼。 笑死葛峻,一個胖子當(dāng)著我的面吹牛锹雏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播术奖,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼礁遵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腰耙?” 一聲冷哼從身側(cè)響起榛丢,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挺庞,沒想到半個月后晰赞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡选侨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年掖鱼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片援制。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡戏挡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晨仑,到底是詐尸還是另有隱情褐墅,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布洪己,位于F島的核電站妥凳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏答捕。R本人自食惡果不足惜逝钥,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拱镐。 院中可真熱鬧艘款,春花似錦持际、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晌柬,卻和暖如春芒填,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背空繁。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工殿衰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盛泡。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓闷祥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親傲诵。 傳聞我的和親對象是個殘疾皇子凯砍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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