Влияет ли сдвиг коммитов на слияние?
Я читаю о плюсах и минусах коммитов сквоша в 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
, не было бы никакого конфликта.