在当前项目中,我们维护多个远程分支。例如:
[me@server]$ git branch -a
master
* featureX
remotes/origin/HEAD -> origin/master
remotes/origin/featureX
remotes/origin/featureY
现在让我们说以下事件发生:
此时,是否可以显示myfile.php的日志,该日志显示文件被主动更改或引入的远程分支?例如:
myfile.php Changelog:
2014-06-05 :: DeveloperZ :: remotes/origin/featureZ (updated)
2014-06-04 :: DeveloperMe :: remotes/origin/master (merged)
2014-06-03 :: DeveloperMe :: remotes/origin/featureX (created)
我一直在努力阅读类似的请求,但我有点失落。听起来像快进(在我们的项目中使用)会导致一些问题。
答案 0 :(得分:2)
您当然可以找到引入该文件的提交,但提交和分支之间没有永久关系。如果你单独留下功能分支,那么你可以找出关系:
master
*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*
\ / \ /
X---*---*---*-- *---*---*---*--
featureX featureZ
假设提交'X'引入了有问题的文件。提交'X'将被列为分支主机,featureX和featureZ。提交结构很明显,该文件是在featureX中引入的。你可以写一个脚本来弄清楚提交'X'的分支是哪个'最接近'。
如果您删除了分支,那么您仍然可以看到与其相关的功能分支提交结构,但git中没有任何关于功能分支的指示。大概提交消息或源代码注释会告诉您正在处理的功能是什么。
要使用git branch --contains
计算出来,您可以执行以下操作:
> git branch --contains X
master
featureZ
featureX
> git branch --contains master
master
> git branch --contains featureZ
master
featureZ
> git branch --contains featureX
master
featureZ
featureX
由于分支featureX由提交X包含在同一组分支中,因此这是引入X的功能分支。
答案 1 :(得分:1)
编辑: @Cupcake促使我提供了一个更完整的答案,一个处理你提到的快进 1 的答案。
对文件历史的一个非常好的整体调查是
git log --graph --decorate --oneline \2 --branches \ --simplify-by-decoration -- path/to/file
要查找内容的介绍提交,
git blame file
查找引入路径的最旧提交:
git log --oneline --
file
| tail -n1
要查找从提交到当前结帐的合并历史记录,无论您是否仍在跟踪该分支:
git log --ancestry-path --merges --oneline commit..@
但这会错过快进。您可以添加--simplify-by-decoration
以查看其中的任何仍然有效的引用。
...取决于您的项目如何使用标签,其中一些可能产生足够的噪音令人讨厌。您可以使用这个小怪物删除单标记提交:
# eliminate single-tag-commit clutter from the above output: git log --color=always --rest-of-args \ | grep -v '([^:,]*tag:[^,]*)' \ | less -r
1 快速前进建立干净的可发布树枝,但是你发现并没有那么多地整合那些树枝的拉力。
2 我发现git alias lgdo '!git log --graph --decorate --oneline ${@---all}'
非常有用。