2017-02-15 143 views
2

我讀過關於git merge --no-ff的文檔。git合併後的git log --no-ff顯示合併的其他分支提交的所有提交

我試過,結果是:

Mini-de-MiniMac:ZtestGit minimac$ git branch 
    feature 
* master 

Mini-de-MiniMac:ZtestGit minimac$ git log --pretty=oneline 
82307080064b764c28622351a4c28abb4f9302b8 Merge branch 'feature' with --no-ff option 
50d9f108d70798a13cc25fb7321d57ad5ba61854 three 
d7163bc5320162689544293be1ac2228c6e3dc34 two 
a7ba4c797d49d940a7d64a8ddaba787eb013622a one 
cc3e4abf5dfad7779de3837a6c4e6e29e3ca87b2 start 

Mini-de-MiniMac:ZtestGit minimac$ git log --pretty=oneline --graph 
* 82307080064b764c28622351a4c28abb4f9302b8 Merge branch 'feature' with --no-ff option 
|\ 
| * 50d9f108d70798a13cc25fb7321d57ad5ba61854 three 
| * d7163bc5320162689544293be1ac2228c6e3dc34 two 
| * a7ba4c797d49d940a7d64a8ddaba787eb013622a one 
|/ 
* cc3e4abf5dfad7779de3837a6c4e6e29e3ca87b2 start  

我很驚訝有關,我不明白:在主分支展會git的日誌中的所有的提交(一,二,三),但這些提交在功能分支上,而不是主人。

我知道主分支上的最後一個提交是功能分支上前一個提交鏈的後代。我期望在master分支上有一個rebase,並且只能看到master上的第一個和最後一個commit。你能向我解釋爲什麼它不同嗎?

因此,做git合併--no-ff的興趣是使用git log --graph而不是git log只有?我添加了一個更奇怪的現象:當我刪除功能分支時,git說分支被刪除了,但是git log和git log --graph給出和以前完全一樣的結果:提交和功能分支仍然出現。
你有解釋嗎?

Mini-de-MiniMac:ZtestGit minimac$ git branch 
    feature 
* master 

Mini-de-MiniMac:ZtestGit minimac$ git log --pretty=oneline 
82307080064b764c28622351a4c28abb4f9302b8 Merge branch 'feature' with --no-ff option 
50d9f108d70798a13cc25fb7321d57ad5ba61854 three 
d7163bc5320162689544293be1ac2228c6e3dc34 two 
a7ba4c797d49d940a7d64a8ddaba787eb013622a one 
cc3e4abf5dfad7779de3837a6c4e6e29e3ca87b2 start 
Mini-de-MiniMac:ZtestGit minimac$ git log --pretty=oneline --graph 
* 82307080064b764c28622351a4c28abb4f9302b8 Merge branch 'feature' with --no-ff option 
|\ 
| * 50d9f108d70798a13cc25fb7321d57ad5ba61854 three 
| * d7163bc5320162689544293be1ac2228c6e3dc34 two 
| * a7ba4c797d49d940a7d64a8ddaba787eb013622a one 
|/ 
* cc3e4abf5dfad7779de3837a6c4e6e29e3ca87b2 start 
Mini-de-MiniMac:ZtestGit minimac$ git branch 
    feature 
* master 


Mini-de-MiniMac:ZtestGit minimac$ git branch -d feature 
Deleted branch feature (was 50d9f10). 

Mini-de-MiniMac:ZtestGit minimac$ git branch 
* master 

Mini-de-MiniMac:ZtestGit minimac$ git log --pretty=oneline 
82307080064b764c28622351a4c28abb4f9302b8 Merge branch 'feature' with --no-ff option 
50d9f108d70798a13cc25fb7321d57ad5ba61854 three 
d7163bc5320162689544293be1ac2228c6e3dc34 two 
a7ba4c797d49d940a7d64a8ddaba787eb013622a one 
cc3e4abf5dfad7779de3837a6c4e6e29e3ca87b2 start 

Mini-de-MiniMac:ZtestGit minimac$ git log --pretty=oneline --graph 
* 82307080064b764c28622351a4c28abb4f9302b8 Merge branch 'feature' with --no-ff option 
|\ 
| * 50d9f108d70798a13cc25fb7321d57ad5ba61854 three 
| * d7163bc5320162689544293be1ac2228c6e3dc34 two 
| * a7ba4c797d49d940a7d64a8ddaba787eb013622a one 
|/ 
* cc3e4abf5dfad7779de3837a6c4e6e29e3ca87b2 start 

謝謝。

+0

'git log --graph --decorate --all'可能會顯示更清晰的圖片。 –

+1

'git merge --no-ff'強制創建合併提交,因此您將始終在其他分支上看到提交,因爲它們是已創建提交的祖先。其他分支是否存在並不重要 - 提交在那裏,因爲它們是可訪問的。 –

+1

如果你只想要第一個父親的歷史,比如說'--first-parent' – jthill

回答

3

Git日誌顯示所有提交,這是您指定ref的祖先。其他分支的存在與否不起作用。它走了提交圖。

這些提交都在特性分支,不掌握git的

承諾不「開」的任何分支。分支是一個可移動的指針,用於命名一個提交(以及擴展名,該提交的所有祖先)。

通過合併您的功能分支到主 - 無論是通過快進或合併 - 您將主分支指針移動到某個提交新的分支。該提交具有先前作爲祖先的提交的提交。

因此,做git合併--no-ff的興趣是使用git log --graph而不是git log嗎?

專門創建合併提交的值是記錄什麼是合併,何時以及由誰。 git倉庫在提交圖中只存儲歷史,分支是短暫的。

+1

我認爲,最好說Git提交是「在」(或「包含在」)*任意數量的分支。然而,從哲學的角度來看,這相當於說他們不在某個特定的分支上(除非分支的數量當然是1)。無論如何,這是正確的答案,只是一個輕微的字眼說服。 :-) – torek

+0

「一個分支是一個命名提交的可移動指針」 - 非常非常。分支通常不過是'.git/refs/heads /'中的純文本文件。文件的名稱是分支的名稱,唯一的內容是它指向的提交的*(即單數)校驗和。有時在'.git/config'中會有更多與分支相關的數據,但這只是分支描述(如果有的話)以及它被設置爲跟蹤的任何遠程分支。 – 8bittree