2013-11-20 290 views
1

我們的開發環境由dev,demomaster分支組成。我們使用JIRA來跟蹤問題,每次我們開始討論問題時,我們將分支dev,進行必要的更改,最後推出分支。從Git合併分支

爲了測試,我們首先將分支(對應於JIRA問題的名稱)合併到dev中,測試它,然後合併到demo,測試它,然後合併到master

我們遇到的問題是問題似乎在彼此建立。我可以用一個例子來最好地解釋這一點:

比方說,我們有我們的典型環境,devdemomaster。有三個問題,TEST-1,TEST-2TEST-3。這些問題按其創建順序完成,分支爲dev,在分支上工作,然後提交併推送分支。然後我將分支合併到dev中,然後再次分支出下一個問題。

當需要推動這三個分支生存時,我們會產生意想不到的結果。爲了合併這些爲master,我登錄到服務器的命令行1運行命令:

git fetch origin 

這將讓我看到了新的分支機構。假設我們只想推動TEST-3的更改。我們運行命令:

git merge origin/TEST-3 

與僅看到第三個分支合併進來的更改相比,所有更改似乎都被拉了。所以後來,當我們最終在第一和第二期合併時,它給了我們「已經最新」的消息。

這不是我們想要的,就像這種行爲一樣,我們無法退出各個分支。

有什麼我做錯了嗎?我們如何以這樣一種方式來做到這一點,即允許我們爲每個問題創建分支,並將它們合併成一個一個,並在需要時將這些更改拉出來。

回答

1

正如您所描述的那樣,您的工作流程應該按照您的要求工作。我可能會建議的唯一改進是使用git merge --no-ff origin/TEST-3來合併來自特定分支的工作,所以git總是在dev上創建一個合併提交,如果需要,可以稍後恢復,即使合併很簡單。

您是否確定分支TEST-1,TEST-2TEST-3是否正確創建了dev?例如,如果工作在TEST-2上的開發人員錯誤地創建了基於TEST-1的新分支,則合併TEST-2也會合並在分支點之前創建的所有提交TEST-1git checkout -b TEST-2將創建一個名爲TEST-2 的分支,從當前已結算的分支開始,所以很容易意外地分支出您錯誤處理的最後一張票。使用類似git checkout -b TEST-3 origin/dev的內容來指定明確的起點可能會導致更少的問題。

同時,可以診斷你與git log像這樣已經創造了歷史:

# Show an ASCII art graph of all branch heads. Depending on the complexity 
# of your repository, this may or may not be too noisy to be useful. 
git log --oneline --decorate --graph --all 

# Graphing specific branches might be more readable: 
git log --oneline --decorate --graph dev origin/TEST-3 

# Show the commits that are reachable by TEST-3, but not by dev. 
# This tells you exactly what work you're about to merge in 
# If TEST-3 includes TEST-2 or TEST-1 by mistake, you'll see extra commits here. 
git log --oneline origin/TEST-3 ^dev 
# Or equivalently: 
git log --oneline dev..origin/TEST-3 

如果您已經有這是基於錯誤的起點分支的工作,你可以移動提交你想回到devgit rebase --onto

# I like to include the -i to see what commits I'm about to move before 
# the rebase actually happens. 
git rebase -i --onto dev TEST-3 TEST-2 
+0

非常感謝你的詳細回覆。這非常有幫助!也許我的問題是我分支'dev'來創建'TEST-1',然後在分支'TEST-2'之前將'TEST-1'合併回'dev'。我認爲'TEST-2'本質上就是,如你所說,間接地基於'TEST-1'。 –