關(guān)于多個parent commit的場景以及cherry-pick -m的使用

git里面的每一個commit都有一個parent commit脊框,所有的commit構(gòu)成一個commit樹(tree)

  1. 對于multiple parent commit的場景

普通commit只有一個parent commit浇雹,而merge commit會有多個parent commit屿讽,取決于從多少個分支進(jìn)行merge昭灵,如果從兩個分支merge則有兩個parent commit,如果從三個分支merge則有三個parent commit诵棵,抠蚣。。履澳。

舉例來說:

  1. 主干分支master有A嘶窄,B,C三個commit
  2. 拉出一個開發(fā)分支developer距贷,并且在開發(fā)分支上產(chǎn)生D柄冲,E兩個commit。
  3. 同時主干分支上又有了F忠蝗,G现横,H三個commit。
image.png

此時我們要把開發(fā)分支developer合并回主干master分支:

  1. 產(chǎn)生一個新的merge commit: M
  2. M包含兩個parent commit阁最,即E长赞,和H
image.png

很多人會有疑問,為什么要生成merge commit闽撤,它其實沒有任何實效的代碼變化得哆,為什么不把分支developer和master拉直,比如:


image.png

或者


image.png

這樣做是需要更改歷史commit的哟旗,或者把commit D的parent commit的改掉贩据,或者把commit F的parent commit改掉栋操,這都是不被允許的,即修改歷史信息饱亮。所以只能添加一個新的commit M矾芙,它包含兩個parent commit分別指向E和H,那么以后的commit也只需要一個parent commit即M就可以了近上。

git cherry-pick -m的使用

還是從前面的例子繼續(xù)來說剔宪。
假設(shè)之前還有一個分支feature從G拉出,并且已經(jīng)生成提交G1壹无,G2兩次提交:


image.png

此時發(fā)現(xiàn)需要把分支developer的改動(D和E)合并進(jìn)來葱绒,怎么辦呢:

  1. 分支developer已經(jīng)刪除了。
  2. 不能從master分支merge斗锭,因為不要commit H地淀。

可以把commit D和E一個一個cherry-pick進(jìn)來;但是如果developer上的commit數(shù)目很多岖是,就會很麻煩帮毁,那么能不能通過把commit M合并進(jìn)來了,是可以的豺撑,但是必須指定-m <parent>選項烈疚。

查看master分支的提交歷史:

$ git checkout master
$ git log --oneline
<hash M> Merge pull request # in <repo> from developer to master
<hash E> Comment of commit E
<hash D> Comment of commit D
<hash H> Comment of commit H
...

再查看merge commit M的信息:

$ git cat-file -p <hash M>
tree <hash tree>
parent <hash E>
parent <hash H>
author ...
committer ..

Merge pull request #4 in <repo> from <developer> to <master>

* commit '<hash E>':
  ...

或者使用git show

$ git show <hash M>
commit <hash M>
Merge: <hash E> <hash H>
author ...
committer ..

Merge pull request #4 in <repo> from <developer> to <master>

* commit '<hash E>':
  ...

很清楚的看到commit M有兩個parent commit,即H和E聪轿,(是誰排先誰排后胞得,還不清除呢,待研究)

此時使用使用git cherry-pick -m 1 <hash M>就會把commit D和E的內(nèi)容復(fù)制到分支feature上面來屹电。(注意parent 的序號從1開始)

另外需要特別說明的是阶剑,用這種產(chǎn)出的commit會抹去之前的提交歷史,我們看命令輸出:

$ git checkout feature
$ git log --oneline
dc54985 Merge pull request #4 in <repo> from <developer> to <master>
...
$ git cat-file -p dc54985
tree <hash>
parent <hash G2>
author ...
committer ...

Merge pull request #4 in <repo> from <developer> to <master>

* commit 'Hash E':
  ...
image.png

也就是說cherry-pick之后生成了一個新的commit N ‘hash=dc54985’危号,這個新的commit包含之前D和E的改動牧愁,但是D和E的提交歷史并沒有帶進(jìn)分支feature,用git log并不能看到D和E的提交過程外莲,而且新commit E并不是作為一個merge commit而存在猪半,它只有parent commit G2,只是左右一個普通commit存在偷线。

總結(jié)一下:

  1. cherry-pickup如果指定的是一個merge commit磨确,那么必須指定-m用來標(biāo)識哪一個parent commit.
  2. 之后會把parent commit這條線上的所有commits都merge過來。
    2.1 這里要注意是merge commit提到的所有commits声邦,和此merge commit無關(guān)的commit不會被merge進(jìn)來乏奥,例如。


    image.png
  • 假設(shè) B5是 branchC到branchB的一個merge commit
  • 此時在分支A上的C點做從merge commit B5的cherry-pickup操作:
    • git cherry-pickup -m 1 <hashB5>:則包括B2, B3和B4
    • git cherry-pickup -m 2 <hashB5>:則包括C1和C2
  • 注意不管’-m 1‘還是’-m 2‘亥曹,commit B1都不會被merge進(jìn)來邓了,因為B1不在B5的范圍內(nèi)恨诱。
  1. 這些所有的commits會被squash成一個commit提交,也就是之前的commits history無法查找了骗炉。
  2. 最后照宝,不建議使用cherry-pickup一個merge commit。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末句葵,一起剝皮案震驚了整個濱河市厕鹃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乍丈,老刑警劉巖剂碴,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诗赌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秸弛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門铭若,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人递览,你說我怎么就攤上這事叼屠。” “怎么了绞铃?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵镜雨,是天一觀的道長。 經(jīng)常有香客問我儿捧,道長荚坞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任菲盾,我火速辦了婚禮颓影,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懒鉴。我一直安慰自己诡挂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布临谱。 她就那樣靜靜地躺著璃俗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悉默。 梳的紋絲不亂的頭發(fā)上城豁,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音抄课,去河邊找鬼钮蛛。 笑死鞭缭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魏颓。 我是一名探鬼主播岭辣,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甸饱!你這毒婦竟也來了沦童?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤叹话,失蹤者是張志新(化名)和其女友劉穎偷遗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驼壶,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡氏豌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了热凹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泵喘。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖般妙,靈堂內(nèi)的尸體忽然破棺而出纪铺,到底是詐尸還是另有隱情,我是刑警寧澤碟渺,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布鲜锚,位于F島的核電站,受9級特大地震影響苫拍,放射性物質(zhì)發(fā)生泄漏芜繁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一绒极、第九天 我趴在偏房一處隱蔽的房頂上張望浆洗。 院中可真熱鬧,春花似錦集峦、人聲如沸伏社。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摘昌。三九已至,卻和暖如春高蜂,著一層夾襖步出監(jiān)牢的瞬間聪黎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工备恤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留稿饰,地道東北人锦秒。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像喉镰,于是被迫代替她去往敵國和親旅择。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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