2013-04-09 63 views
2

我目前正在使用git的項目。基本上,我的git樹由三個分支:如何使用git處理此修補程序問題?

  • 分公司一個:起源分支,從中派生我的工作。
  • 分行B:分行根據AB包含開發工作(A的新功能)。
  • 分支C:出於時間管理的原因,我也開始爲新功能開發不完整的實驗選項。此實驗代碼直接添加到B。所以C是清理分支B,只保留完全可操作的代碼。

分支關係可以以這種方式來表示:

- > - >提交0 - > - >提交Ñ - >C - >清理承諾

分支B包含所有新功能的代碼,有時與仍在開發中的可選分段混合在一起。 C中的所有提交都是實驗部分的刪除。

分支中的代碼C很乾淨,我想從中僞造一個補丁。該補丁應該包含從上次提交的CA的頭部的所有更改。

如果我這樣做git format-patch master --stdout > my_patch.patch,這會產生一個補丁程序,它將在操作代碼中有效結束。但是這樣做並不好,因爲在補丁中添加了實驗代碼(通過B中的某些提交),然後刪除(清除提交C)。除了不聰明之外,這還包括無用的額外空間(意味着額外的郵件與社區共享補丁)以及應用程序的額外開銷。

我應該如何操作這些分支來生成乾淨的補丁?請注意,我想保留到目前爲止在分支B中所做的實驗性工作,我只是不希望將它包含在補丁中。

+1

有沒有一個特定的原因,你不使用[櫻桃挑](https://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html)? – 2013-04-09 08:49:16

+0

@MohamedTarek你推薦我創建一個派生自__A__的新分支,然後選擇在__B__中應用的更改?我是否正確? – Rerito 2013-04-09 08:56:58

+0

這個答案可能是相關的,http://rckoverflow.com/a/1624723/ – Hasturkun 2013-04-09 09:32:12

回答

1
git checkout C    # alternately, do "git checkout -b C_NEW" for safety 
git rebase --interactive A # Your A branch 

它會帶來一個編輯器。除第一個以外,將所有「選取」文本更改爲「s」。這會將所有提交「壓縮」到一個提交中。你也可以使用cherry-pick(向A中提取一些提交)或git rebase --interactive(並刪除所有B提交以獲得C)。

+0

事實上,我在每個「灰色」提交中都使用了'git rebase -i'和'git reset HEAD ~'的組合來拆分它們,然後使用「squash」技巧。我正在尋找一個答案,可以讓我把手放在垃圾裏,但嘿......如果我搞砸了一些東西,我不會指望他們會自己修復。無論如何,正如你的回答很好地描述了我遵循的程序,我接受了它! – Rerito 2013-04-15 11:15:21