@sanok_ps
Веб-разработчик, php-бекенд, Вордпресс

Что происходит при слиянии веток (git merge)?

Работаю локально через GIT GUI или SourceTree. Была изначально ветка master. Я создал ветку development и в ней работаю. Естесствено уже несколько коммитов делал, папки удалял либо в .gitignore заключал их. Сделал потом слияние (merge) development в master. Отправляю на Битбакет, оттуда забираю (git clone) на VPS - то я вижу те папки, которых нет локально в ветке development. Получается, во-первых, git clone взял ветку master, а во-вторых, merge не означает, что полностью ветка становится идентична другой? Объясните, плиз, если в ветках есть в т.ч. и разные файлы, что происходит с ними при merge? И при переключении с одной вертки на другую, если там разные файлы, то и в Проводнике поменяются визуально файлы или как?..
  • Вопрос задан
  • 7221 просмотр
Решения вопроса 1
Decadal
@Decadal
Представьте, что у вас два грузовика. Сначала они были одинаково пусты, потом вы загрузили в один грузовик пару мешков с песком, а в другой - мешок с углем.
Условно первый грузовик - master, второй - dev.
git checkout master
git merge dev


Теперь в master у нас мешки с песком и мешок с углем
А в dev, как и прежде, только мешок с углем.

Так что у вас не только те папки, которые в development, но и те, которые были в master.

Если вы пушили ветку development, то при clone она тоже должна была стянуться, просто на данный момент git смотрит на master. Напишите git status чтобы проверить, в какой вы ветке, и переключитесь на нужную.
Если ветки development нет, сначала вам предстоит её запушить.

В случае, если в двух ветках разные файлы (не противоречащие друг другу), то merge просто размещает их все вместе, как будто вы скопировали файлы из одной ветки в другую.
Но если в двух ветках в файлах с одинаковыми именами разное содержимое, выполняется auto-merging, т.е. попытка автоматически объединить два содержимых в одно. Эта операция успешна, например, если вы в одной из веток просто добавили в конец файла ещё одну строку, а в другой ветке не трогали файл вовсе.
Если содержимое менялось и в той и в другой ветке, происходит конфликт. Git вставляет в место спорного контента что-то вроде
<<<<HEAD 
один контент
<<< commit1111
другой контент 
<<<end

Вам придётся решить, что делать с таким содержимым: что убрать а что оставить.
После того как конфликт разрешен, вы просто коммитите свое решение, как будто бы никогда и не было двух разных версий файлов, а сразу была та версия, которую вы закоммитили в процессе решения конфликта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы