2011-12-27 193 views
234

是否有可能做一個「混帳合併」,但沒有提交?沒有自動提交的git合併

「人混帳合併」這樣說:

With --no-commit perform the merge but pretend the merge failed and do not autocommit, 
to give the user a chance to inspect and further tweak the merge result before 
committing. 

但是,當我嘗試使用git與合併仍然--no提交它的自動提交。下面是我所做的:

$> ~/git/testrepo$ git checkout master 
Switched to branch 'master' 

$> ~/git/testrepo$ git branch 
* master 
    v1.0 

$> ~/git/testrepo$ git merge --no-commit v1.0 
Updating c0c9fd2..18fa02c 
Fast-forward 
file1 | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

$> ~/git/testrepo$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

隨後的「混帳日誌」顯示所有從1.0分支提交合併成高手。

回答

385

注意,在做合併的輸出 - 跟它Fast Forward

在這種情況下,你想做的事:

git merge v1.0 --no-commit --no-ff 
+3

如果有任何疑問,該怎麼辦? – Michelle 2015-01-03 05:06:42

+14

@PineappleUndertheSea快進不會導致衝突。如果「真正」合併而沒有快速轉發,'--no-commit'開關僅在沒有衝突發生時纔有效,如果發生衝突,git將永遠不會自動提交。 – gronostaj 2015-01-05 19:20:21

+17

供參考:如果您想要合併更改,然後提交_as,如果您手動鍵入了所有in_合併的更改(與傳統合並相反),則需要運行'rm。git/MERGE_HEAD',這會迫使git忘記合併發生了。 – Jonn 2016-02-27 00:23:23

32

您誤解了合併的含義,--no-commit會阻止MERGE COMMIT的發生,並且只會在合併兩個發散分支歷史記錄時發生;在你的例子中,情況並非如此,因爲git表明它是一個「快進」合併,然後git只按順序應用已經存在於分支上的提交。

+10

這不會(imo)一定清除混亂;我認爲這是一個(相對較少)的時間,文檔實際上很清楚:'git help merge' =>使用'--no-commit'執行合併,但假裝合併失敗並且不自動提交,爲用戶提供在提交之前有機會檢查並進一步調整合並結果。「關鍵當然是將它與'--no-ff' – michael 2013-02-12 00:58:57

+3

一起使用...也許從嚴格的術語中突破並且用這種方式來描述它會更少混淆:一個快速前進的「混帳合併」沒有合併提交,因爲根本沒有合併。這實際上是理想的情況:快進是一件好事,並沒有這個額外的「合併承諾」變得有意義。這是很好的默認行爲,不應該被禁用。 (用適當的話來說,快進是一種合併,但它不是「真正的合併」。) – michael 2013-03-27 08:32:08

+3

它與項目的策略有關,在某些情況下,有必要/強制這些額外的「合併提交「,即使它是一個ff,因爲你需要標記該特徵包含在主分支中。 – 2013-06-22 01:28:19

12

如果你只想要一個承諾彷彿要提交所有更改自己輸入,--squash會做太多

$ git merge --squash v1.0 
$ git commit 
+0

這是否與'git merge v1.0 --no-commit --no-ff'相同[ – jpierson 2017-08-18 13:30:48

+0

]不,效果不同。 Squash用新的散列創建一個新的提交。它將分支中的所有提交合併爲一個提交。 – 2018-01-17 22:49:19

7

我更喜歡這種方式,所以我不需要記住任何罕見的參數。

git merge branch_name 

然後,它會說你的分支是領先對手#承諾,你現在可以彈出這些承諾關閉並投入工作的變化有以下:

git reset @~# 

例如,如果合併後它是1提前使用,使用:

git reset @~1