Ответ 1
Ключевым моментом здесь является то, что если обе ветки совместно используют commit X, тогда это ничего не добавляет к diff, то есть вы ничего не видите о фиксации X в diff *.
Поэтому вам нужно только разграничить точку разветвления (которую вы можете найти с помощью merge-base) и сравнить с этим:
git diff $(git merge-base current master)
возвращает c, d и e.
Это также работает, если история для тех, которые кажутся более сложными (с несколькими слияниями):
. --a--> . --b--> . --- . (master)
\ \ /
c \ (merge) / (merge)
\ \ /
. ----- . ----- . --d--> . (current) --e--> (working tree)
возвращает d и e.
* Это объясняет, почему вы не видите a
в git diff master
.
Держу пари, вы чувствуете себя глупым, чтобы расспрашивать сейчас!