2010-12-02 94 views
3

我想要rebase的目的。對於我,這說得通。基本上,我有一個功能分支,我正在處理,並且已準備好將其放入主分支中,我將進行重新分配以將所有提交操作壓縮到一個乾淨的分支中,以便它可以輕鬆集成到主分區中,而不會混亂歷史。對?如何管理git中的合併和重新綁定?

以下是我們一直在做的事情。

  1. 創建一個特性分支
  2. 添加了一堆提交的爲我們所建立的功能
  3. 主分支定期合併到功能分支(爲了避免痛苦的合併的道路)
  4. 當一切完成後,合併特性分支成主

我看到的問題是,定期合併主到功能分支基礎重建的時候,因爲我現在有一堆馬斯特會導致問題r分支checkins混入我的特色簽入。

什麼是正確的工作流程?在哪裏以下commads開始發揮作用:

  • git的變基-i頭^#
  • git的重訂主
  • 混帳合併主
  • 混帳rerere
  • 的git的復位 - 硬頭^

回答

5

在分支的生命週期結束時,您應該只合並一次/從主人。特徵/主題分支的想法是它只包含與特徵相關的更改;當你重複在主人合併時,你會失去這一點。 (你可以閱讀什麼Junio Hamano, the git maintainer, says about branches。)

你可以做一個「練習」合併,你會扔掉,並使用git-rerere讓Git自動記錄你的合併決議,以便他們可以重新使用,當你真的準備合併。有關背景和教程,請參閱http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html。這非常酷,因爲它可以讓你完成合並工作,而無需明確地提交它,然後當你準備好創建合併時,「神奇地」恢復工作。所以,在最後,你可以做一堆更小,希望更簡單,中間的「練習」合併,而不是一個最大的痛苦合併。粗略地說:

# Enable rerere 
git config --global rerere.enabled 1 
# Start a feature branch 
git checkout -b feature 
# Hack hack hack 
git commit 
git commit 
# Practice merge 
git merge master 
# ...then throw the merge commit away, the work is saved by rerere 
git reset --hard HEAD^ 
# Hack hack hack 
git commit 
# Really merge to master, reusing any saved work from rerere 
git checkout master 
git merge feature 
git branch -d feature 

另請參閱http://progit.org/2010/03/08/rerere.html另一個教程。

您還可以定期重新綁定主分支上的主題分支,然後在最後進行合併。

爲了處理一個像你目前所在的情況,與一個主要分支(稱爲feature),有一系列合併主要與各種正在進行的提交混合,最簡單的方法是做壓縮合併產生一個「合併」工作樹,然後創建一個新的提交(或一系列提交)到main。例如:

git checkout master 
git merge --squash feature 
git commit 

這將產生一個單一提交表示所述樹中的特徵的頭部的狀態下,合併到主站。

當然,您也可以對此更改定期合併爲master,留下當前feature的混亂歷史,並且在將來更加乾淨地工作。例如,只需要

git checkout master 
git merge feature 

然後繼續。

+0

現在我更加困惑。我從來沒有聽說過git-rerere。我閱讀手冊頁,它有道理,但我失去了如何工作。所以重新綁定不僅可以壓縮提交,還可以將原始分支向前移動?我很困惑。我應該在這裏採用什麼樣的實際流程?尤其對於長時間運行的分支 – Micah 2010-12-02 16:59:06

0

如果你打算重建分支,只要你想「合併」更改就可以重新綁定。你不需要重新綁定+壓扁,直到你準備好「合併」爲止在分支到主人。

+0

所描述的,可以有很多工作沒有rerere – 2010-12-02 20:35:29

+0

@adymitruk:那麼,你所要做的就是啓用rerere,然後。 – mipadi 2010-12-02 20:40:22

3

如果你打算重設(我建議你這樣做),那麼永遠不要和主人合併。基礎工作流程基於這樣的想法,即主題分支包含從主要到新功能的路徑,而不包含其他任何內容。隨着主人向前邁進,那麼您的更改將會隨着新功能一起移動。

當你終於準備把變成師傅,你有兩個主要選擇:

  1. 對衍合高手最後一次,然後做基本上把所有正常的快進合併你的分支一個接一個地進入主控。這保留了更細粒度的歷史,但是如果中間提交破壞了構建,那麼您可能更喜歡壓縮它們。交互式rebase(-i)可以幫助安排這些提交。

  2. 使用merge --squash在master中進行一次包含所有分支更改的提交。

0

我認爲簡單的答案是:

使用git merge --squash如果:

,如果你有一個特性分支,並正在從另一個分支揪成,你的工作分支,比如你切換定期運行git merge master以在主分支中合併。或者你正在把這個分支拉到別人或者像github這樣的中央倉庫。

使用git rebase如果:

,如果你有一個特性分支,你不推或拉別人,你不合並其他分支到定期,上述