Как слить две ветки через консоль в Git?

Ответ

Чтобы слить изменения из одной ветки в другую через командную строку Git, я выполняю следующие шаги:

  1. Убедиться в актуальности целевой ветки. Переключаюсь на ветку, В КОТОРУЮ нужно внести изменения (например, main или develop), и подтягиваю последние изменения с удаленного репозитория.

    git checkout main
    git pull origin main
  2. Выполнить слияние. Запускаю команду merge, указав ветку-источник изменений.

    git merge feature/new-authentication
    • Если слияние проходит без конфликтов (fast-forward или автоматическое разрешение), Git создаст новый коммит слияния (или переместит указатель ветки).
    • Чтобы всегда создавался коммит слияния, даже при возможности fast-forward, использую флаг --no-ff:
      git merge --no-ff feature/new-authentication
  3. Разрешение конфликтов (если возникли). Если Git сообщает о конфликтах:

    • Открываю файлы, помеченные как конфликтные (в них будут блоки <<<<<<<, =======, >>>>>>>).
    • Вручную редактирую их, оставляя нужный код, и удаляю маркеры конфликта.
    • Добавляю исправленные файлы в индекс и завершаю слияние коммитом.
      git add <конфликтный_файл>
      git commit -m "Merge branch 'feature/new-authentication' into main"
    • Если нужно прервать слияние и вернуть все как было, использую:
      git merge --abort
  4. Отправка результата на удаленный репозиторий.

    git push origin main

Ответ 18+ 🔞

А, гит, ёпта! Ну, слушай, история про слияние веток — это как в семье, когда теща приезжает и начинает переставлять мебель. Надо всё сделать аккуратно, а то будет хиросима и нигерсраки.

Вот, смотри, как я обычно действую, чтобы не накосячить.

Шаг первый: убедиться, что всё свеженькое.
Первым делом я перескакиваю в ту ветку, куда буду тащить изменения — допустим, в main. И сразу же подтягиваю всё с сервера, чтобы не было сюрпризов. Иначе можно влететь в конфликты из-за какой-нибудь старой херни, которую уже кто-то залил.

git checkout main
git pull origin main

Если тут всё прошло гладко — отлично. Если нет — ну, терпения ноль ебать, начинаем разгребать.

Шаг второй: само слияние.
Теперь командуем гиту взять изменения из другой ветки (например, из feature/new-authentication) и впихнуть их к нам.

git merge feature/new-authentication

Тут два варианта:

  1. Всё прошло как по маслу (fast-forward) — гит просто перемотал историю, и ты даже коммита слияния не увидишь. Если хочешь, чтобы был полноценный коммит-узелок в истории (для порядка, чтоб видно было), юзай флаг --no-ff:
    git merge --no-ff feature/new-authentication
  2. А вот тут начинается пиздец. Гит пишет CONFLICT. Это значит, вы с коллегой в одном и том же месте кода написали разную хуйню, и он в ахуе, какую версию оставить.

Шаг третий: разбор полётов, если накосячили.
Если конфликт случился — волнение ебать, но паниковать не надо. Открываешь файлы, которые гит пометил. Там будут эти уродливые блоки с <<<<<<<, ======= и >>>>>>>. Между ними — две версии кода: твоя и та, что приехала из ветки.
Твоя задача — э бошка думай, решить, какой код оставить. Удалишь маркеры, сохранишь файл, добавишь его обратно в индекс и закоммитишь результат.

git add <конфликтный_файл>
git commit -m "Merge branch 'feature/new-authentication' into main"

Если всё пошло по пизде и ты сам от себя охуел от того, что натворил, всегда можно откатиться командой git merge --abort и начать заново, как будто ничего не было.

Шаг четвёртый: отправить результат на всеобщее обозрение.
Когда локально всё слилось и ты доволен — пушим.

git push origin main

Если в этот момент кто-то уже успел что-то залить в main пока ты тут вротберунчик с конфликтами разбирался, придётся опять пуллить и решать проблемы. Но это уже, как говорится, хуй с горы — обычная рутина.

Вот и вся магия. Главное — не бздеть и делать всё по шагам. А если что-то пошло не так, всегда можно погуглить или спросить у того пидараса шерстяного, который последним в этом ковырялся.