2017-02-15 274 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