Короткий ответ таков: git merge
- в частности, комбинация изменений для слияния, так как база слияния - работает на линейно-ориентированных различиях и недостаточно умна, чтобы понять, что что-то нужно импортировать только один раз , Без -X theirs
или --strategy-option theirs
, если наборы изменений не совпадают хорошо, вы получите конфликт слияния. Использование theirs
заставляет Git слепо предполагать, что в случае конфликта он должен использовать «свою» версию, но влияет только на конфликты . Даже без theirs
это может дать сбой. Например, предположим, что вы добавили импорт раньше:
[your changes near the top of the file]
some context here
+import { CommentsModule } from '../comments/comments.module';
Предположим, они решили включить этот модуль много строк спустя:
different context here
+import { CommentsModule } from '../comments/comments.module';
Git теперь видит инструкции по добавлению этой же строки дважды в разных местах, поэтому он делает это.
Обычное слияние и сквош-слияние выполняют операцию для слияния . Разница между ними заключается в конце, когда вы или Git делаете окончательный коммит. При обычном слиянии новый коммит имеет двух родительских коммитов: ваш текущий коммит, а другой коммит вы, чей ID вы передали git merge
:
...--o--*--o--o--...--o <-- yourbranch (HEAD)
\
o--o---...---o <-- theirbranch
становится:
...--o--*--o--o--...--o--M <-- yourbranch (HEAD)
\ /
o--o---...---o <-- theirbranch
Без --squash
вместо этого получается:
...--o--*--o--o--...--o--S <-- yourbranch (HEAD)
\
o--o---...---o <-- theirbranch
Обратите внимание, что коммит "сквош-слияние" - это обычный коммит (без слияния): это вовсе не слияние! Обычный коммит слияния является коммитом слияния. (Это немного круговая логика: коммит слияния - это просто коммит по крайней мере с двумя родителями. Тем не менее, это ключевое отличие здесь. Кроме этого, git merge --squash
- это обычное слияние, хотя оно также вызывает --no-ff
и --no-commit
.)