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

标签 git git-diff

我有一个 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'..Mgit 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/

相关文章:

git - 使用BFG时可以指定多个文件吗?

git - 在暂存区显示文件的 git diff

git - 让 Git GUI 忽略差异 View 中的空间变化

git - 在提交 git checkout 文件后,git diff 显示没有变化?

git - 如何解决git的 "not something we can merge"错误

git - 是否可以创建一个项目作为现有项目的前身?某种预 fork 项目?

git - 将存储库 merge 到经过修改的克隆中

linux - Git - 自动 pull 入服务器

git - "insertions and deletions"是什么意思以及数字是如何计算的

git-diff - 如何 git-apply git word diff