2012-09-27 61 views
50

所以我做了無數櫻桃採摘之前,似乎我必須在現在這個生活中失敗,我想櫻桃選擇從一個分支到另一個應該很容易,如何有沒有我得到一個關於它是一個合併的錯誤,但沒有-m被給出?Git櫻桃選擇語法和合並分支

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given. 
fatal: cherry-pick failed 

這看起來錯了.......應該是:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 

從什麼時候開始我需要提供一個-m功能?

回答

64

如果提交是合併提交,即提交了多個父代,那麼您必須提供-m

通常情況下,有什麼git cherry-pick REV也可以描述爲:

  1. 就拿變化之間修訂版及其母公司。

  2. 將這些更改應用到當前HEAD並提交結果rev的提交消息。

合併提交合並兩行開發。例如,一行實現小部件,另一行消除混亂。合併爲您提供了小部件的代碼,避免了混亂。

現在考慮櫻桃挑選過程的第1步:git無法猜測您是要移除混亂還是實現小部件。你也不能這樣做,因爲關於如何執行這兩個操作的信息不包含在單個合併提交中,只有合成樹合併的內容是。

-m選項允許您告訴git如何繼續。例如,如果在master上發生了雜亂清除並且使用git merge WIDGET創建了合併提交,那麼git cherry-pick -m 1 merged-commit將挑選新的小部件,因爲合併樹與父代1(最後一個除雜提交)之間的差異將完全是小部件添加。另一方面,git cherry-pick -m 2 merge-commit將刪除雜亂,因爲父節點2(最後一個控件添加提交)與合併提交之間的差異恰恰是從小部件分支中缺少的混亂刪除。

+2

要驗證'git cherry-pick'是否做到了你的意思,請運行'git在推之前顯示';這會告訴你即將推出的東西的差異。 – Jimothy

+1

對於什麼是值得的,恢復合併提交具有完全相同的注意事項和命令行參數才能成功。 – ErikE

+2

如果我想讓widget-addition和clutter-deletion都在?那就是挑選合併提交權的重點?其他方面,我會櫻桃挑選最後一次提交的部件添加或最後一次提交的混亂刪除,而不是 – Zennichimaro

2

從該名男子頁的語法如下:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>... 

父數是指:

-m母公司數,--mainline母公司數,通常你不能櫻桃選擇一個合併,因爲你不知道合併的哪一邊應該被認爲是主線。此選項指定主線路的父代號碼(從1開始),並允許櫻桃選擇重播相對於指定的父代的更改。

所以我會仔細檢查以確保你有正確的提交散列。這可能是因爲你想要一個不是來自合併而是提交之前的提交。否則,您需要使用此標誌並指向合併的正確一側以消除您的請求的歧義。

3

個人我通常做的是,因爲合併組合2提交,例如,如果我合併提交C由2父母組成,例如提交A在主和從其他分支合併提交B,如果我需要櫻桃選擇合併我不會打擾櫻桃選擇合併提交本身的混亂命令,而是我將櫻桃每個單獨的父母A和B,這也是有用的情況下,你只想櫻桃採摘只有在主人的提交A已經被挑選到分支的情況下才提交B,一個是在合併發生之前櫻桃採摘。

0

嘗試合併結果:

git cherry-pick .... 
git mergetool 
git cherry-pick --continue 
14

的Git是要求你指定的父數量(-m),因爲您的合併提交有兩個家長和git不知道該合併方應考慮主線。因此,使用此選項,您可以指定主線和櫻桃選中的父代號(從1開始),以便重播相對於指定的父代的更改。

要找出你犯的父母,嘗試兩種:

git show --pretty=raw <merge_commit> 

或:

git cat-file -p <merge_commit> 

甚至更​​好的圖形用戶界面的可視性,嘗試:

gitk <merge_commit> 

至於結果,你應該得到像這樣的東西:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821 
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit> 
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit> 

然後,通過檢查你的每個父細節:

git show <parent1_or_2_commit> 

添加--stat看到修改的文件列表。

或者使用下面的命令來比較的變化(基於上述父):

git diff <parent1_or_2_commit>..<commit> 

添加--stat看到修改的文件列表。

或使用組合DIFF由兩個父母比較:

git diff --cc <parent1_commit> 
git diff --cc <parent2_commit> 

然後指定從1開始爲你摘櫻桃,例如母公司數

​​

然後運行git status以查看發生了什麼。如果您不想提交更改,請添加-n選項以查看會發生什麼情況。然後當你不開心時,重置爲HEAD(git reset HEAD --hard)。如果你得到git衝突,你可能需要手動解決或指定合併策略(-X),請參閱:How to resolve merge conflicts in Git?