Git diff ветвь против рабочего дерева, не включая слияния

Я пытаюсь найти разницу между текущим рабочим деревом и другой ветвью (например, master), не считая коммита.

. --a--> . --b--> . (master)
 \       \
  c       \ (merge)
   \       \
    . ----- . --d--> . (current) --e--> (working tree)

Теперь git diff master показывает изменения рабочего дерева, однако он также показывает изменения в master не в текущих (-b, c, d, e). Я хочу видеть эти изменения не в главном, то есть, я хочу видеть c, d и e.

Я пробовал использовать тройную точку или используя git журнал, но эти сравнить с концом (последнее совершение):

git diff master...
git diff master...current_branch

git log -p --no-merges current..master

возвращает c и d, то есть они не включают e: рабочее дерево.

Как я могу заставить этот diff включить рабочее дерево?

Ответ 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.

Держу пари, вы чувствуете себя глупым, чтобы расспрашивать сейчас!