仅当<path>被更改时,有和没有<path>的git log之间的区别是什么?

时间:2015-10-29 19:45:38

标签: git

当我有两个已合并的分支,并且在每个分支中独立进行相同的更改时,该文件的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的祖先提交以及哪些提交正在触及受影响的文件?

1 个答案:

答案 0 :(得分:1)

答案隐藏在git rev-list documentation中(同样的文字包含在git log documentation中,但由于几乎所有内容都使用rev-list,我认为它是正确的记忆地点作为一般查找位置):

  

历史简化
  例如,有时您只对历史的某些部分感兴趣    提交修改特定的&lt; path&gt;。但是有两个部分    历史简化,一部分是选择提交,另一部分    是如何做到的,因为有各种策略可以简化    历史。

     

以下选项选择要显示的提交:

     
&LT;路径&GT;
  
提交修改给定的&lt;路径&gt;被选中。

[剪断]

  

以下选项会影响简化的执行方式:

     
默认模式
  
将历史简化为解释决赛的最简单历史    树的状态。最简单的,因为如果修剪一些侧枝    最终结果是相同的(即合并具有相同的分支)    含量)
     

--full-history
   
与默认模式相同,但不修剪某些历史记录

当您(可能)想要--full-history模式时,您正在使用默认模式。请注意,当您使用&lt; paths&gt;时,会激活历史记录简化功能。引入历史选择的符号:这就是为什么你需要--full-history没有它。