Git - 获取已合并的分支中更改的文件列表

时间:2016-06-17 14:03:20

标签: git

想象一下,我像这样从大师创建一个分支:

git checkout -b changes

现在我做了一些改变:

touch filea && git add filea && git commit -m "added file a"
touch fileb && git add fileb && git commit -m "added file b"

现在我可以通过多种方式获取该分支中更改的文件列表,例如:

git log master..changes --name-only --pretty=format: --

到目前为止一切都很好,但是当我合并更改时:

git checkout master && git merge changes

上面的日志命令不再有效。如果我拥有的唯一信息是分支名称,有没有办法以自动方式获取已更改文件的列表?

编辑:我想我应该通过“自动化方式”解释我的意思:我运行一个脚本,该脚本获取一个分支名称作为参数而没有别的。我不知道分支是否已经合并到主人。我不知道它是否是快进的 - 所有这些都是可能的,并且该方法应该适用于所有这些情况。它应该获取分支的名称并输出该分支中更改的所有文件。不必是oneliner,但越简单越好。

2 个答案:

答案 0 :(得分:1)

如果您记录了合并,或者在过去一个月内在您的回购中完成了合并,则很容易。

对于记录(非“快进”)合并,

git rev-list --first-parent --merges --ancestry-path branch..master | tail -1

将从该分支提示中获取合并,所以

mastermerge=`git rev-list --first-parent --merges --ancestry-path branch..master|tail -1` \
&& git diff $mastermerge^1..$mastermerge^2

在那里工作。

如果你在本地仓库中进行了快进合并,则reflog会向你显示,执行git reflog master,找到merge branch: Fast-forward条目,并指定该合并的前后提交为“父母”。

答案 1 :(得分:0)

master..changes等修订范围意味着可以从changes到达的所有提交,但不包括master可以访问的提交。将changes合并到master后,现在也可以从changes访问从master可以访问的所有提交。所以现在git log master..changes没有输出任何东西。

在您的情况下,您可以在合并后运行git log master^..changes以获得您想要的内容。到目前为止这种方法还可以,但由于我不知道你接下来会做什么,所以我不能再作为通用解决方案提出建议。

更新:你想知道更改的文件,因为什么时候?如果它始终是您最后一次运行脚本,则每次运行脚本时都可以添加一个轻量级标记。也许你可以添加另一个参数来告诉这次是否要添加一个标签。此参数可能有助于测试目的。git describe --tags changes可以找到changes的最新标记。如果可以找到标记,则可以运行git log <tag>..changes以查找自上次运行以来的所有更改。然后,您可以在changes的头部添加新标签,以便下次从此处开始。但这仍然不是一般解决方案,因为您的需求不够明确。