'git diff' не показывает достаточно

Я хочу увидеть разницу между ветвью master и моей функциональной веткой. У меня много запросов от мастера к моей ветке функций, и я хочу увидеть изменения, которые будут добавлены, если я объединю свою функцию с мастером.

Это моя ситуация:

-*--*--*-----*<master>
  \     \     \
   1--*--*--*--2--*<feature>

Моя проблема в том, что git diff master feature, кажется, отображает только фиксацию номер 2. Как я могу увидеть разницу, которую покажет запрос на вытягивание GitHub, которая, как мне кажется, полностью соответствует фиксации 1?

Я заметил, что git cherry показывает мне коммиты, для которых я хочу увидеть разницу.


person codr    schedule 10.03.2011    source источник


Ответы (3)


В отношении git diff A B важно понимать, что он всегда показывает разницу между состояниями дерева только между двумя точками в графе фиксации - он не заботится об истории. Обозначения .. и ..., используемые для git diff, имеют следующие значения:

Иллюстрация различных способов указания коммитов для 'git diff'

Поэтому, когда вы запускаете git diff master feature, это не просто показывает вам изменение, внесенное фиксацией, которую вы пометили как 2 - выходные данные должны показывать точные различия между состоянием дерева, зафиксированным в master, и состоянием дерева, зафиксированным в feature. Если он не показывает вам более ранние изменения в вашей функциональной ветке, возможно, вы разрешили конфликты из более ранних слияний из мастера в пользу версии в master?

Как cebewee говорит, возможно, вам нужно git log -p master..feature, поскольку git log действительно заботится об истории. Значение .. и ... для git log различается, поскольку они выбирают диапазон коммитов:

Иллюстрация различных способов указания диапазонов коммитов для журнала git

Между прочим, часто говорят, что слияние из master в ветку темы - неправильный поступок - вместо этого вам следует выполнить перебазирование или объединение ветки темы в master после ее завершения. Это позволяет легко понять смысл тематической ветки. Сопровождающий Git опубликовал в блоге сообщение (довольно трудное для понимания) о философии слияния, в котором обсуждается тот.

person Mark Longair    schedule 10.03.2011
comment
Однако в связанном сообщении блога говорится, что в ситуации, когда ветка функции больше не объединяется чисто в master, один правильный способ действий - объединить master в ветку функции и разрешить конфликты в ветке функции. - person Plasma; 29.07.2015
comment
Спасибо за ссылку на философию слияния. Я читал это и не мог узнать имени автора, просто он майтэйнер. Вы знаете его имя? - Отредактировано: неважно. Его зовут Джунио Си Хамано. Tx - person DrBeco; 25.04.2017
comment
Хороший ответ. Позор за безумный синтаксис! - person lost; 31.05.2019

git diff master feature не показывает никаких коммитов, но текстовую разницу между мастером коммитов и функцией. Похоже, вы хотите увидеть все коммиты из фичи, которых еще нет в главном? В этом случае попробуйте git log master..feature или git log -p master..feature, если вы тоже хотите увидеть различия.

См. Раздел УКАЗАНИЕ ДИАПАЗОНОВ в man git-rev-parse для объяснения синтаксиса 'a..b'.

person Lars Noschinski    schedule 10.03.2011

Я относительно новичок в Git, но если я правильно понимаю ваш вопрос, ваш вопрос связан с неправильным пониманием удаленных и локальных репозиториев и того, как они связаны друг с другом. Помню, как только я это понял, все стало в два раза проще.

Вы думаете, что находитесь в приведенной ниже ситуации, когда у вас всего две ветки:

  • особенность
  • masterBranch

Тем не менее, если вы выполните git branch -a, вы сможете увидеть все свои ветки, как локальные, так и удаленные.

Итак, ваша настоящая ситуация:

  • особенность
  • masterBranch
  • удаленный филиал
  *---* <remote's Master> which is behind your local
      \
      -*--*--*-----*<master> which is ahead of your remote/origin
       \     \     \
        1--*--*--*--2--*<feature>

Чтобы вы могли видеть разницу, аналогичную той, что вы видите в GitHub Pull Request, вы должны diff ее в своей удаленной ветке.

git diff <local branch> <remote>/<remote branch>

См. Как сравнить локальную ветвь Git с ее удаленной веткой.

person Honey    schedule 31.08.2016