我有一个 git 存储库,我通常在两个分支上工作,一个 public
分支和一个 private
分支,后者紧随公共(public)分支,但带有一些额外的补充。
有没有办法找到自给定提交以来特定于私有(private)分支的更改?
我能想到的最接近的是做一些事情:
git diff base..public > pub.diff
git diff base..private > private.diff
interdiff pub.diff private.diff
这可行,但不是那么健壮,我确信可以用 git
以更好的方式做到这一点。
这本质上就是分支的外观(有更多 merge ):
...A---B---C---D---E---F---G---H public
\ \ \
A'--I---J---D'--K---L---G'--M private
例如,我们假设上面的base
在此方案中是D
。刚刚运行
git diff D'..M
还将给出 merge 提交G'
的结果。我想避免这种情况,并在任意数量的 merge 中拥有健壮的东西。
最佳答案
因为 git diff
is about comparing two endpoints, not ranges
这可能是不可能的( git diff
将无法检测这些更改的来源)。
你可以尝试使用
选项A
$ git log -p --no-merges --first-parent D'..M
-
-p
为您提供列出的提交的差异(补丁) -
--no-merges
将从列表中排除 merge -
--first-parent
只会跟随第一个父级(您 merge 到的父级,例如private
) -
D'..M
如 git revisision 中所述将要Include commits that are reachable from
<rev2>
but exclude those that are reachable from<rev1>
选项B
另一种方法是遵循@torek的建议并创建一个临时分支 cherry-pick
所有提交到它,然后查看该分支的差异。
因为据我所知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
跳过 merge 提交 -
--first-parent
遵循主线分支(例如 merge 到的分支)
如果提交基于 merge 的更改,则此方法可能会失败
关于git - 查找在分支中专门更改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38738312/