当我有两个已合并的分支,并且在每个分支中独立进行相同的更改时,该文件的git日志仅显示其中一个实例,而整个repo的git日志显示两者。那是为什么?
这是我创建更改的地方:
example:/test # git branch
* master
example:/test # cat > testfile
aoeu
example:/test # git add -u; git commit -m "Add aoeu"
[master 34513b3] Add aoeu
1 file changed, 1 insertion(+)
然后我在备用分支上添加了相同的更改:
example:/test # git checkout -b alternate HEAD^
Switched to a new branch 'alternate'
example:/test # git cherry-pick -n master
example:/test # git commit
[alternate 52efabd] Add aoeu
1 file changed, 1 insertion(+)
现在我合并了两个分支,并查看结果。为什么我在第一个“git log”的输出中看不到提交34513b3?
example:/test # git merge master
Merge made by the 'recursive' strategy.
example:/test # git log --oneline --graph testfile
* 52efabd Add aoeu
* d7a9a91 Initial commit
example:/test # git log --oneline --graph
* 838c5fd Merge branch 'master' into alternate
|\
| * 34513b3 Add aoeu
* | 52efabd Add aoeu
|/
* d7a9a91 Initial commit
当然,我所在的分支并不重要:
example:/test # git checkout master
Switched to branch 'master'
example:/test # git merge alternate
Updating 34513b3..838c5fd
Fast-forward
example:/test # git log --oneline --graph testfile
* 52efabd Add aoeu
* d7a9a91 Initial commit
git如何决定哪些提交是官方提交?为什么我们要查看文件范围还是完整的回购范围呢?如何获得我期望的行为,即显示所有HEAD的祖先提交以及哪些提交正在触及受影响的文件?
答案 0 :(得分:1)
答案隐藏在git rev-list
documentation中(同样的文字包含在git log
documentation中,但由于几乎所有内容都使用rev-list
,我认为它是正确的记忆地点作为一般查找位置):
历史简化
例如,有时您只对历史的某些部分感兴趣 提交修改特定的< path>。但是有两个部分 历史简化,一部分是选择提交,另一部分 是如何做到的,因为有各种策略可以简化 历史。以下选项选择要显示的提交:
- <路径>
- 提交修改给定的<路径>被选中。
[剪断]
以下选项会影响简化的执行方式:
- 默认模式
- 将历史简化为解释决赛的最简单历史 树的状态。最简单的,因为如果修剪一些侧枝 最终结果是相同的(即合并具有相同的分支) 含量)
--full-history
- 与默认模式相同,但不修剪某些历史记录
当您(可能)想要--full-history
模式时,您正在使用默认模式。请注意,当您使用< paths>时,会激活历史记录简化功能。引入历史选择的符号:这就是为什么你不需要--full-history
没有它。