查找在分支中专门更改的文件
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'..M
如 git 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
遵循 主线 分支(例如,合并的分支 合并到 )
如果提交基于合并到
中的更改,则此方法可能会失败
我有一个 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'..M
如 git 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
遵循 主线 分支(例如,合并的分支 合并到 )
如果提交基于合并到
中的更改,则此方法可能会失败