Я вижу, что иногда мой вопрос все еще получает одобрение. Позвольте мне объяснить для тех, кто не понимает выбранный в настоящее время ответ, потому что я, конечно, не понимал, когда читал его в первый раз.
Допустим, у вас есть ветка master
с коммитами A
, B
и C
.
Затем из фиксации C
вы создаете новую ветку mybranch
. Вы делаете коммит, и вы получаете коммиты D
и E
.
Тем временем кто-то еще фиксирует F
и G
на мастере.
master
тогда выглядит так: A B C F G
, а mybranch
выглядит так: A B C D E
.
Теперь у вас есть две стратегии слияния:
Объединить
Находясь на mybranch
, вы набираете git merge master
. Он принимает все коммиты от master
, которых у вас нет на mybranch
- F
и G
. Сначала он объединяет F
поверх вашего E
(последняя фиксация mybranch
), а затем объединяет G
поверх F
.
Конечный результат: A B C D E F G
. Несмотря на то, что эти буквы находятся в одном порядке, фиксации не были выполнены (или, возможно, не были выполнены) в хронологическом порядке, потому что на самом деле F
и G
были (или могли быть) выполнены до D
и E
. В этом случае вы также увидите фиксацию слияния.
Rebase
Находясь на mybranch
, вы набираете git rebase master
. Он берет все коммиты из master
, которых у вас нет в mybranch
- F
и G
, и помещает их поверх текущей ветки, приводя ее в состояние, в котором сейчас находится master
(потому что вы разветвились от master
и теперь получаете все коммиты, которые были выполнены на master
с тех пор, как вы разветвились). Затем он берет вашу первую фиксацию - D
- и объединяет ее поверх G
(последняя фиксация, сделанная master
). Затем он берет E
и кладет его поверх D
.
Конечный результат: A B C F G D E
. Похоже, что ни одна ветка никогда не отделялась master
, и если мастер - это одна непрерывная работа, потому что вы как бы сказали: «Я хочу, чтобы моя ветка выглядела так, как если бы она была просто отделена от мастера, а затем моя работа была помещена поверх нее. ". Это эквивалент проверки master
(сейчас A B C F G
), создания новой ветки mybranch
и последующего добавления ваших коммитов (A B C F G D E
).
Почему перебазирование может привести к конфликту, а слияние - нет.
Не вдаваясь в подробности, давайте просто скажем, что слияние master
F
поверх mybranch
E
может не привести к конфликту, но слияние mybranch
D
поверх master
F
может. Это просто действительно зависит от того, какой код был изменен, и совместимо ли это изменение с предыдущей фиксацией. В обоих случаях могут возникнуть конфликты слияния.
person
minitauros
schedule
08.07.2019