我有一个git存储库,我通常在两个分支上工作,一个public
分支和一个private
分支,后者紧跟公共分支,但还有一些额外的添加。 / p>
有没有办法找到特定于专用分支的给定提交后的更改?
我能想到的最接近的是:
git diff base..public > pub.diff
git diff base..private > private.diff
interdiff pub.diff private.diff
这很有效,但它并不那么健壮,而且我确信可以通过git
以更好的方式做到这一点。
这实际上是分支的外观(有更多的合并):
...A---B---C---D---E---F---G---H public
\ \ \
A'--I---J---D'--K---L---G'--M private
例如,我们假设此方案中base
以上D
为git diff D'..M
。刚刚运行
G'
还会给我合并提交master
的结果。我想避免这种情况,并且在任何数量的合并中都有一些强大的功能。
答案 0 :(得分:3)
因为git diff
是关于比较两个端点,而不是范围
这可能无法实现(git diff
无法检测到这些更改来自)。
您可以尝试使用
$ git log -p --no-merges --first-parent D'..M
-p
为您列出的提交提供了差异(补丁)--no-merges
将从列表中排除合并--first-parent
只会跟随第一个父级(您合并的父级,例如private
)D'..M
正如git revisision中所解释的那样
包含可从
访问的提交<rev2>
访问的提交,但不包括可从<rev1>
另一种方法是遵循 @ torek 建议并创建一个临时分支,cherry-pick
将所有提交到其上,然后查看此分支的差异。
因为AFAIK git cherry-pick
在指定提交范围时无法跳过提交,所以首先需要获取提交列表以进行挑选(此处选项A 很有用)
$ git log --no-merges --first-parent D'..M --pretty=format:%H
--pretty=format:%H
将以长格式打印所有提交哈希值创建时间分支(需要有正确的起点)
$ git checkout -b temp D'
然后手动挑选这些提交或尝试使用此命令(交换为@torek建议的更好的命令)
$ git cherry-pick $(git rev-list --reverse --topo-order --no-merges --first-parent D'..M)
--reverse
用于反转打印提交的顺序(从最旧到最新而不是相反)--topo-order
这将避免出现奇怪或错误时间戳的提交问题--no-merges
跳过合并提交--first-parent
关注主干分支(例如合并的分支合并到)如果提交基于中合并的更改,则此方法可能会失败