查找在分支中专门更改的文件

时间:2016-08-03 08:27:25

标签: git git-diff

我有一个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以上Dgit diff D'..M 。刚刚运行

G'

还会给我合并提交master的结果。我想避免这种情况,并且在任何数量的合并中都有一些强大的功能。

1 个答案:

答案 0 :(得分:3)

因为git diff

  

是关于比较两个端点,而不是范围

这可能无法实现(git diff无法检测到这些更改来自)。

您可以尝试使用

选项A

$ git log -p --no-merges --first-parent D'..M
  • -p为您列出的提交提供了差异(补丁)
  • --no-merges将从列表中排除合并
  • --first-parent只会跟随第一个父级(您合并的父级,例如private
  • {li> D'..M正如git revisision中所解释的那样
      

    包含可从<rev2>访问的提交,但不包括可从<rev1>

    访问的提交

选项B

另一种方法是遵循 @ 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关注主干分支(例如合并的分支合并到

如果提交基于中合并的更改,则此方法可能会失败