git合并后使用命令git log --no-ff可以显示来自其他分支合并的所有提交记录。

5

我阅读了有关git merge --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 log显示所有提交(one,two,three),但这些提交位于特性分支而非主分支上。

我知道主分支上的最后一个提交是特性分支上先前提交链的一个子孙。我期望像在主分支上进行rebase一样,只能看到主分支上的第一个和最后一个提交。你能解释一下为什么会有所不同吗?

那么执行git merge --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

谢谢。

git log --graph --decorate --all 可以展示更清晰的图片。 - Josh Lee
1
git merge --no-ff 强制创建一个合并提交,因此您将始终看到另一个分支上的提交,因为它们是创建提交的祖先。无论其他分支是否存在,都没有关系--这些提交都在那里,因为它们是可达的。 - Samir Aguiar
2
如果您只想要第一个父级历史记录,请使用“--first-parent”。 - jthill
2个回答

5

你可以使用

git log --first-parent

查看当前所在分支的提交记录。(我知道提交记录并不是“在”任何分支上,就像之前的回答所说的那样)


这就是我一直在寻找的答案! - romacafe

3
Git日志显示您指定的引用的所有提交的祖先。其他分支的存在或不存在没有影响。它遍历提交图。
这些提交在功能分支上,而不是主分支。
在git中,提交不属于任何分支。分支是一个可移动的指针,它命名一个提交(以及该提交的所有祖先)。
通过将特性分支合并到主分支中 - 无论是通过快进还是合并 - 您将主分支的分支指针移动到某个新的提交。此提交具有以前在主分支上的提交作为祖先。
因此,进行git合并 -no-ff的兴趣在于使用git log --graph而不仅仅是git log?
特别创建合并提交的价值在于记录合并了什么,何时以及由谁合并。Git存储历史记录仅在提交图中,分支是短暂的。

1
我认为更好的说法是Git提交“在”(或“包含在”)“任意数量”的分支中。不过从哲学角度来看,这等价于说它们没有在某个特定的分支上(当然,除非分支数恰好为1)。无论如何,这是正确的答案,只是对措辞有一点小问题。 :-) - torek
“分支是一个可移动的指针,用于命名提交。”非常正确。分支通常只是 .git/refs/heads/ 中的一个纯文本文件。文件名就是分支名称,唯一的内容是它所指向的提交的校验和。有时在 .git/config 中会与分支相关联的一些数据,但这仅仅是分支描述(如果有)以及它设置要跟踪的任何远程分支。 - 8bittree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接