Ответ
Чтобы слить изменения из одной ветки в другую через командную строку Git, я выполняю следующие шаги:
-
Убедиться в актуальности целевой ветки. Переключаюсь на ветку, В КОТОРУЮ нужно внести изменения (например,
mainилиdevelop), и подтягиваю последние изменения с удаленного репозитория.git checkout main git pull origin main -
Выполнить слияние. Запускаю команду
merge, указав ветку-источник изменений.git merge feature/new-authentication- Если слияние проходит без конфликтов (fast-forward или автоматическое разрешение), Git создаст новый коммит слияния (или переместит указатель ветки).
- Чтобы всегда создавался коммит слияния, даже при возможности fast-forward, использую флаг
--no-ff:git merge --no-ff feature/new-authentication
-
Разрешение конфликтов (если возникли). Если Git сообщает о конфликтах:
- Открываю файлы, помеченные как конфликтные (в них будут блоки
<<<<<<<,=======,>>>>>>>). - Вручную редактирую их, оставляя нужный код, и удаляю маркеры конфликта.
- Добавляю исправленные файлы в индекс и завершаю слияние коммитом.
git add <конфликтный_файл> git commit -m "Merge branch 'feature/new-authentication' into main" - Если нужно прервать слияние и вернуть все как было, использую:
git merge --abort
- Открываю файлы, помеченные как конфликтные (в них будут блоки
-
Отправка результата на удаленный репозиторий.
git push origin main
Ответ 18+ 🔞
А, гит, ёпта! Ну, слушай, история про слияние веток — это как в семье, когда теща приезжает и начинает переставлять мебель. Надо всё сделать аккуратно, а то будет хиросима и нигерсраки.
Вот, смотри, как я обычно действую, чтобы не накосячить.
Шаг первый: убедиться, что всё свеженькое.
Первым делом я перескакиваю в ту ветку, куда буду тащить изменения — допустим, в main. И сразу же подтягиваю всё с сервера, чтобы не было сюрпризов. Иначе можно влететь в конфликты из-за какой-нибудь старой херни, которую уже кто-то залил.
git checkout main
git pull origin main
Если тут всё прошло гладко — отлично. Если нет — ну, терпения ноль ебать, начинаем разгребать.
Шаг второй: само слияние.
Теперь командуем гиту взять изменения из другой ветки (например, из feature/new-authentication) и впихнуть их к нам.
git merge feature/new-authentication
Тут два варианта:
- Всё прошло как по маслу (fast-forward) — гит просто перемотал историю, и ты даже коммита слияния не увидишь. Если хочешь, чтобы был полноценный коммит-узелок в истории (для порядка, чтоб видно было), юзай флаг
--no-ff:git merge --no-ff feature/new-authentication - А вот тут начинается пиздец. Гит пишет
CONFLICT. Это значит, вы с коллегой в одном и том же месте кода написали разную хуйню, и он в ахуе, какую версию оставить.
Шаг третий: разбор полётов, если накосячили.
Если конфликт случился — волнение ебать, но паниковать не надо. Открываешь файлы, которые гит пометил. Там будут эти уродливые блоки с <<<<<<<, ======= и >>>>>>>. Между ними — две версии кода: твоя и та, что приехала из ветки.
Твоя задача — э бошка думай, решить, какой код оставить. Удалишь маркеры, сохранишь файл, добавишь его обратно в индекс и закоммитишь результат.
git add <конфликтный_файл>
git commit -m "Merge branch 'feature/new-authentication' into main"
Если всё пошло по пизде и ты сам от себя охуел от того, что натворил, всегда можно откатиться командой git merge --abort и начать заново, как будто ничего не было.
Шаг четвёртый: отправить результат на всеобщее обозрение.
Когда локально всё слилось и ты доволен — пушим.
git push origin main
Если в этот момент кто-то уже успел что-то залить в main пока ты тут вротберунчик с конфликтами разбирался, придётся опять пуллить и решать проблемы. Но это уже, как говорится, хуй с горы — обычная рутина.
Вот и вся магия. Главное — не бздеть и делать всё по шагам. А если что-то пошло не так, всегда можно погуглить или спросить у того пидараса шерстяного, который последним в этом ковырялся.