Влияет ли сдвиг коммитов на слияние?

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

  • С помощью большого количества небольших коммитов инструменты слияния могут легче определить, как вещи объединяются, и конфликты слияния менее вероятны. "Конфликт слияния" может быть "разрешен" на более мелкие единицы, которые не конфликтуют, если рассматривать их по одному.
  • Имея множество небольших коммитов, инструменты слияния могут считать промежуточный коммит уже недоступным, даже если последующий коммит это исправит. (Чувствует себя немного странно.)
  • Технически это не имеет никакого значения, потому что инструменты слияния все равно смотрят только на последний коммит.

Что из этого верно, или вещь еще сложнее? (Как, в зависимости от вида изменений?)

2 ответа

Решение

Если ваша забота о беге git merge, Быть в курсе, что git merge находит три коммитов:

  • ваш текущий коммит, который всегда можно найти по имени HEAD;
  • ваша цель слияния --theirs / other / "Удаленный" коммит, который вы называете при запуске git merge otherbranch; а также
  • база слияния, которую Git находит, используя граф фиксации.

Мне нравится называть эти три коммита L (для Left / Local /--ours), R (для правого / удаленного /--theiRs); и B (для базы).

Если вы нажимаете "разумно" (извините, это плохо определено!), Это не повлияет на поиск базы слияния. L и B будут одинаковыми. Единственный эффект состоит в том, что R будет иметь другой идентификатор хэша. Дерево (сохраненный исходный снимок) для R будет одинаковым независимо от того, были ли вы раздавлены или нет.

git merge эффективно делает:

git diff --find-renames B L > /tmp/ours.patch
git diff --find-renames B R > /tmp/theirs.patch

и затем объединяет патчи, чтобы применить комбинированный набор к дереву в коммите B. Поскольку три дерева не будут изменены, сквош не будет влиять на слияние.

Я могу вспомнить хотя бы один случай, когда сжатый коммит с меньшей вероятностью приведет к конфликту:

Скажем, у вас есть три двух коммита в вашей ветке, A а также B, A быть предком B,

С A, он меняет пять строк в верхней части файла и пять строк в нижней части. B делает противоположность первого куска A, вернув этот раздел файла обратно к тому, в котором он был A~1,

Общее изменение A + B это пять измененных строк в нижней части файла.

Если кто-то что-то изменит в пяти строках вверху файла, при объединении возникнет конфликт ветки.

Если вы вместе A а также B в новый коммит C, не было бы никакого конфликта.

Другие вопросы по тегам