想象一下,我像这样从大师创建一个分支:
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,但越简单越好。
答案 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
的头部添加新标签,以便下次从此处开始。但这仍然不是一般解决方案,因为您的需求不够明确。