Git Разница между текущей веткой и ведущим, но не включая неигровые мастер-фиксации

Я хочу разброс всех изменений в ветке, которая еще не объединена с мастером.

Я пробовал:

git diff master
git diff branch..master
git diff branch...master

Однако в каждом из этих случаев diff содержит содержимое в master, которое еще не было объединено в моей ветке.

Есть ли способ сделать разницу между моей веткой и мастером, которая исключает изменения в мастере, которые еще не были объединены в мою ветку?

Ответ 1

git diff `git merge-base master branch`..branch

Объединить базу - это точка, в которой branch отклоняется от master.

Git diff поддерживает специальный синтаксис для этого:

git diff master...branch

Вы не должны менять стороны, потому что тогда вы получите другую ветку. Вы хотите знать, что изменилось в branch, так как оно отклонилось от master, а не наоборот.

Непосредственно:


Обратите внимание, что синтаксис .. и ... не имеет той же семантики, что и в других инструментах Git. Он отличается от значения, указанного в man gitrevisions.

Цитата man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Это просмотр изменений между двумя произвольными <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    Это синоним предыдущей формы. Если <commit> с одной стороны опущено, это будет иметь тот же эффект, что и при использовании HEAD.

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    Эта форма предназначена для просмотра изменений в ветке, содержащей и до второго <commit>, начиная с общего предка обоих <commit>. "git diff A...B" эквивалентен "git diff $(git-merge-base A B) B". Вы можете опустить любой из <commit>, который имеет тот же эффект, что и при использовании HEAD.

На всякий случай, если вы делаете что-то экзотическое, следует отметить, что все <commit> в приведенном выше описании, за исключением двух последних форм, которые используют обозначения "..", могут быть любыми <tree>.

Более подробный список способов написания <commit> см. в разделе "УКАЗАНИЕ РЕВИЗИОНОВ" в разделе gitrevisions[7]. Однако "diff" - это сравнение двух конечных точек, а не диапазонов, а обозначения диапазона ( "<commit>..<commit>" и "<commit>...<commit>" ) не означают диапазон, определенный в разделе "УКАЗАНИЕ ДИАПАЗОНОВ" в разделе gitrevisions[7].