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

Find files that changed specifically in a branch

我有一个 git 存储库,我通常在其中工作两个分支,一个 public 分支和一个 private 分支,后者紧随 public分支,但有一些额外的添加。

有没有办法找到自给定提交以来特定于私有分支的更改?

我能想到的最接近的做法是:

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'。我想避免这种情况,并且在任意数量的合并中都有一些健壮的东西。

因为git diff

is about comparing two endpoints, not ranges

这可能是不可能的(git diff 不会检测到这些更改来自何处)。

您可以尝试使用


选项 A

$ git log -p --no-merges --first-parent D'..M
  • -p 为列出的提交提供差异(补丁)
  • --no-merges 将从列表中排除合并
  • --first-parent 只会跟随第一个 parent(您合并到的那个 private
  • D'..Mgit revisision 中所述

    Include commits that are reachable from <rev2> but exclude those that are reachable from <rev1>


选项 B

一种不同的方法是遵循 @torek 的 建议并创建一个临时分支,cherry-pick 所有提交到它上面,然后查看该分支的差异.

因为 AFAIK git cherry-pick 在指定提交范围时无法跳过提交,您首先需要为 cherry-picking 获取 提交列表 (此处选项 A 有用)

$ git log --no-merges --first-parent D'..M --pretty=format:%H
  • --pretty=format:%H 将以长格式打印所有提交哈希值

创建时间分支(需要有正确的起点)

$ git checkout -b temp D'

然后 cherry-pick 那些手动提交 尝试使用此命令 (交换为 @torek 建议的更好的命令)

$ git cherry-pick $(git rev-list --reverse --topo-order --no-merges --first-parent D'..M)
  • --reverse 用于反转打印的提交顺序(从旧到新而不是相反)
  • --topo-order 这将避免具有奇怪或错误时间戳的提交问题
  • --no-merges 跳过 合并 提交
  • --first-parent 遵循 主线 分支(例如,合并的分支 合并到

如果提交基于合并到

中的更改,则此方法可能会失败