2010-09-21 110 views
26

例如,我有一個dev分支和一個stable分支。合併跟蹤Git櫻桃採摘?

如果我已經挑選了幾個從devstable

有沒有什麼辦法讓Git意識到櫻桃採摘的提交,並避免雙合併它,如果我以後合併,重定位或櫻桃選擇重疊範圍,從dev回到stable? (對於這是一個基本的合併在SVN跟蹤功能)

+0

儘管您可能有充足的理由這樣做,但櫻桃挑選太多提交到分支通常是一個糟糕的主意。 – 2012-05-23 06:38:10

回答

5

實際上有一個名爲的git cherry,打印每一個承諾沒有被兩個分支之間合併的命令。

對於每個打印的提交,「+」號表示可以合併它,「 - 」號表示您已經選擇了該提交。

輸出遠不是很漂亮。

對於那些誰從SVN來了,來svnmerge.py,我做了一個「SVNMERGE無濟於事-l」相當於bash腳本的混帳,我叫gitavail:

#!/bin/bash 

# get current branch 
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) 

# get tracked branch (1st argument), if no arg or arguments are only options, assume master 
if test -z $1 || grep -q '^-' <<< $1; 
then TRACKED_BRANCH=master 
else TRACKED_BRANCH=$1; shift 
fi 

# Log commits available for merge from tracked branch 
LOG_OPTIONS=$* 
for i in $(git cherry $CURRENT_BRANCH $TRACKED_BRANCH | egrep '^\+' | awk '{print $2}'); do git --no-pager log -n1 $i ${LOG_OPTIONS}; echo; done 

假設你是一個分支,並要列出什麼資格從主分支合併,只需要運行:

gitavail --name-status 

你就會有一個輸出非常類似於「SVNMERGE無濟於事-l」。我猜櫻桃挑選提交一定不能手動修改(衝突怎麼樣?),如果patch id發生變化,git cherry將不會意識到提交已經被挑選出來。

+0

雖然我沒有機會嘗試這個,但似乎它確實是我想要的。 :) +1和接受的答案去給你:) – 2013-09-12 06:27:39

9

git cherry-pickgit rebase一個有趣的情況,而不是git merge,因此它實際上重寫提交您精挑細選所以它會應用相同的更改分支的頂部你櫻桃採摘成。由於git的提交標識基於提交的內容,因此新提交具有不同的標識,因此被git視爲完全不同的提交。

git merge另一方面創建合併提交;這是git實現合併跟蹤的手段。合併提交標記了兩個(或更多)發散歷史匯聚的點。可以接受git merge [commit-id]而不是git cherry-pick [commit-id]顯式創建合併提交,但這不僅會引入單個櫻桃提交的提交的影響,還會引起該分支發散歷史記錄中的整組更改。

就這麼說,「雙合併」在git中通常不是問題。如果您嘗試合併包含已存在的變更集的歷史記錄,那麼當歷史記錄粘合在一起時它就會變成不可操作的; git真的只關心每次提交中樹的狀態,而不關心它進入該狀態的變化。

+1

只是爲了得出結論:沒有辦法跟蹤櫻桃採摘的提交。但是,GIT中的雙合併通常不是問題,對嗎?我對後一種說法感到有點不確定。 GIT的設計中沒有什麼特別的東西讓雙合併的麻煩與其他版本控制系統(比如SVN)相似 – 2010-09-29 09:41:14

+0

@Adrian:同意double-mergin。如果兩個(相同的)合併之間的合併目標發生了變化,則存在潛在的問題。 – schoetbi 2011-11-22 06:08:58

12

還值得注意的是cherry-pick-x標誌將原始提交的SHA添加到提交消息的末尾。

我喜歡在提交摘要的末尾添加縮寫的SHA,以便在查看日誌時更容易將櫻桃提取的提交與原始提交相關聯。指示誰做了櫻桃選擇也可以有幫助,-s簽字標誌。

例子:

> git cherry-pick -sex 27d4985

#333: fixes all the things (27d4985) 

- how it fixes all the things 

(cherry picked from commit 27d49855238364d0184ad344884a366b5b16e) 

Signed-off-by: Chuck Norris <[email protected]> 
+1

+1分優秀點。 – 2012-05-23 06:37:33