如何获取在分支上提交的更改,并且仅在 Git 中的那个分支上?

How to get changes that was commited on a branch, and only on that branch in Git?

比方说,我有以下分支

    B---C---D---E---F---G       feature
   /           /         \
--A---F---G---H----I------J     master

有一个特性分支,通过将主分支合并到特性(合并提交 B 和 E)从主分支定期刷新。当功能准备就绪时,它会合并到主控中(合并提交 J),所以此时功能和主控是等价的。

我想查看或记录仅在没有合并提交(B 和 E)的功能分支上更改的内容。那么有什么方法可以让我仅在合并的功能分支上查看更改。

谢谢。

git log --first-parent --no-merges A..feature

任何你想要的细节,也许--oneline --patch

这里没有方便的命令可以找到 A,first-parent 合并基础,两个提示的 first-parent 祖先中的最新提交,但它很容易做到:

merge-base-first-parent() {
        ( git rev-list --first-parent ;
          git rev-list --first-parent 
        ) | awk 'seen[]++{print ;exit}'
}

git log --first-parent --no-merges --oneline --patch \
        $(merge-base-first-parent master feature)..feature

并且在非常长的历史中,您可以使用 rev-list 的 --parents 和对退化情况的特殊处理以使其总是 运行 快速。

要将更改视为单个差异,您必须构建提示在没有合并的情况下的外观。这很容易做到,你可以

git checkout A
git rev-list --reverse --no-merges A..feature | git cherry-pick -n --stdin
git diff @