2017-08-09 47 views
0

我在Git(版本2.10.1(Apple Git-78))中遇到了一個非常奇怪的問題。Git:設置merge.ff中斷快速向前合併

看來,如果我在本地repo配置中設置了merge.fffalse,那麼這個回購就沒有辦法了。我只是不能解除它。

下面是步驟來重現:

git init 

# Set merge.ff 
git config --add merge.ff false 

# Add some content and commit. 
echo '.' >> file.txt 
git add file.txt 
git commit -am "commit" 

# Create a new branch. 
git branch feature 

git checkout feature 
echo '.' >> file.txt 
git commit -am "commit" 
git checkout master 
git merge feature 

該合併將創建消息提交 - 如預期。

現在我取消了設置,我預計未來的快進提交將不會創建額外的提交。但令人驚訝的是,這並不奏效。

git config --unset-all merge.ff 

git checkout feature 
echo '.' >> file.txt 
git commit -am "commit" 
git checkout master 
git merge feature 

我假設本次合併不應該創建一個承諾,因爲沒有merge.ff設置,所以默認應該適用。但提交被創建。

我想要的是:在我的回購協議中,快進提交再次運行。有沒有辦法得到這個?

回答

1

我會認爲這個合併不應該創建一個提交,因爲沒有merge.ff設置,所以默認應該適用。但提交被創建。

默認是快進如果可能的話,否則進行合併提交。

合併提交是必要的了,因爲圖形看起來像這樣:

* 4667bf7 (feature) commit 
| * 6663675 (HEAD -> master) Merge branch 'feature' 
| |\ 
| |/ 
|/| 
* | c12b7b3 commit 
|/ 
* 3c62604 commit 

masterfeature合併鹼是提交c12b7b3...

$ git merge-base master feature 
c12b7b3f68caf419c3088fae293c57cfed147f34 

feature尖端4667bf7 ,其中master的小費爲6663675。這兩個技巧都不等於合併基礎,因此需要合併。

你的配置是OK:

$ git config --get merge.ff 
$ cat .git/config 
[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
[merge] 

(這是相當討厭,但無害,是git config葉有一個假的空[merge]部分;附加git config merge.<whatever>又增加了一個時,有一個空的。)

+0

感謝您的回覆。但是我不明白:如果我省略'git config --add merge.ff false'和'--unset-all merge.ff',那麼所有這些合併*都是*快進。爲什麼? –

+0

如果第一個op是快進,它不會創建合併提交。看看上面的圖:位於合併基礎「c12b7b3」之前的'master'上的提交本身就是我們在'master'上進行的合併提交。如果我們不在'master'上做一個合併提交(如果我們做一個快進的非合併),名字'master'指向'c12b7b3',並且後面的'git合併特徵'(允許快進而不是合併)會發現'master'的當前提示與'master'和'feature'的合併基礎相同,因此也能夠快進而不是合併。 – torek