2013-02-12 62 views
11

在開發過程中,我經常需要提交和推送「中間」提交,即提交的代碼不可編譯或者在更改某些內容等時發生。我不想做這樣的提交,但是這是爲了讓我的工作從辦公室到家庭繼續工作所必需的,有時候讓其他開發人員可以讓他們開始工作。Git合併時不包含從一個分支到另一個分支的提交

我想我已經找到了這個問題的解決方案:

  1. 我創建一個單獨的「開發」分支,讓所有中間的提交。

  2. 一旦代碼處於良好狀態,請合併爲主。所以主人不會包含「中間」提交,而只包含「正常」提交。

  3. 刪除所有中間提交的「dev」分支。

但這不起作用。當我進行合併時,不僅合併提交包含在master中,而且還包括來自「dev」分支的所有「中間」提交。因此,刪除「dev」分支不會產生任何效果,其「中間」提交將保留在那裏。

所以問題是:是否有可能以主要包含自己的提交+合併提交的方式進行合併,而不包括第二個分支的提交?如果這是不可能的,你能告訴我如何實現我的目標 - 有能力暫時保存中間結果,但也可以在以後無縫地刪除它們?

回答

16

當你合併你的「開發」分支成主,儘量

git checkout master 
git merge --squash dev 
git commit -m "Add new feature." 

--squash選項將所有的中間變化擠進了一個大的變化。

如果您需要更多有限控制(例如,reordering commits並執行多個小南瓜),您也可以使用git rebase --interactiveThis answer解釋git merge --squashgit rebase --interactive之間的差異。

+0

考慮到他與其他開發人員共享這些提交,是不是一個好主意? – jszakmeister 2013-02-12 09:49:24

+1

+1提及'git rebase -i'。然後人們真的不知道本地開發分支。 – 2013-02-12 14:34:43

+1

@jszakmeister,因爲他正在將本地開發分支的更改合併到當地的主人結帳中,所以沒關係。當他推動他的改變時,對其他開發者來說,就好像他的改變是一個巨大的提交。換句話說,擠壓可以讓你有一個承諾說,「添加新功能」,而不是多個「Oops。Fix typo」承諾。 – 2013-02-12 14:44:58

-1

在合併期間,您無法刪除提交。你可以壓縮中間提交,但這是一個壞主意,這可能不會在你發佈它們時起作用。您也可以將它們擠壓到主分支而不進行合併(git merge --squash,然後git commit),然後將主分支合併到開發分支中。

+0

請解釋您的downvote。 – wRAR 2013-02-12 03:50:35

2

你想要的是一個「西葫蘆」合併:

git checkout master 
git merge --squash dev 
git commit -m 'current stable work from dev branch' 

這樣做是建立在你的工作樹作爲一個經常合併相同的狀態,但不創建一個合併所有的中間提交提交作爲祖先。中間提交不會成爲master分支歷史記錄的一部分。從git merge手冊頁此選項的文件說:

生產工作樹和索引狀態,就像一個真正的合併發生 (除了合併信息),但實際上並沒有作出承諾 或移動HEAD,也不記錄$GIT_DIR/MERGE_HEAD導致下一個git commit命令創建合併提交。這允許您在當前分支上創建一個 單個提交,其效果與合併另一個分支的 相同(或者在章魚的情況下更多)。

0

添加另一個名爲RC(分發候選)的分支。該分支只會合併完成的功能分支。你可以讓開發者一起嘗試未完成的分支。您只能集成到主要發佈候選版本,其中不包含任何內容,但合併完成的功能。

相關問題