Объединенные ветки git, которые должны быть одинаковыми, на самом деле имеют много различий - PullRequest
1 голос
/ 07 марта 2019

Я унаследовал проект от предыдущего разработчика в моей компании. Есть ветка master и, скажем, ветка foo. Гитк показывает, что последний коммит был слиянием foo с master, поэтому они должны быть равны. На самом деле, если я попытаюсь снова выполнить такое слияние, выполнив:

git merge foo

в ветке master будет сказано, что master "уже обновлен", как и следовало ожидать.

Тем не менее, если я сделаю различие между ними, как:

git diff foo

от мастера, я получил десятки изменений в десятках файлов. И, на самом деле, если я проверяю ту или иную ветку, они разные.

Так ... почему у меня такая кажущаяся беспорядочная ситуация? как я могу решить это?

Заранее большое спасибо!

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Ветвь Git - это указатель на коммит.Когда вы объединяете две ветви (фактически вы объединяете две фиксации), создается новая фиксация, и текущая ветка перемещается в новую фиксацию.Объединенная ветвь не изменяется.

Вот пример.
Текущей ветвью является A, и есть другая ветвь B, которая в прошлом отклонилась от A.

HEAD -> A -> o    o <- B
             |    |
             o    o
             |   /
             o  o
             | /
             o
             |

После git merge B создается новый коммит (у него есть два родителя, потому что это коммит слияния), и ветвь A перемещается, чтобы указать на вновь созданный коммит.B сохраняет свою прежнюю позицию.

HEAD -> A -> o
             |  \
             o    o <- B
             |    |
             o    o
             |   /
             o  o
             | /
             o
             |

После git merge B, git diff B отображает изменения, которые находятся в ветви A, но отсутствуют в ветви B.Это изменения, выполняемые в левой ветви графика, в коммитах, которые недоступны из B commit.

HEAD -> A -> o
             |  \
         /-> o    o <- B
  in A   |   |    |
 but not |-> o    o
  in B   |   |   /
         \-> o  o
             | /
             o
             |
2 голосов
/ 07 марта 2019

master получил все foo коммитов, но обратное неверно, поэтому вы можете (и, очевидно, имеете) различия, а именно вещи в master, которые не в foo.

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

...