Merge

Введение

В этой статье вы можете изучить пример слияния веток без конфликтов. Разбор конфликтов вы можете изучить здесь

Чтобы подготовить проект создайте директорию merge_demo инициалзируйте репозиторий и создайте файлы partners.txt и sites.md со следюущим содержимым:

## partners.txt aviasales.com beget.com ostrovok.ru

## sites.md andreyolegovich.ru www.aredel.com

mkdir merge_demo cd merge_demo git init git branch -M main touch partners.txt sites.md vi partners.txt vi sites.md git add -A git commit -m "Initial commit"

merge_demo/ ├── partners.txt └── sites.md

Пример

git status

On branch main nothing to commit, working tree clean

git branch feature
git branch

feature * main

git checkout feature

Switched to branch 'feature'

git branch

* feature main

Добавим строку в файл partners.txt

## partners.txt aviasales.com beget.com ostrovok.ru hotellook.com

git add partners.txt
git commit -m "Adds hotellook.com to partners.txt"

Добавим строку в файл sites.md

## sites.md andreyolegovich.ru www.aredel.com testsetup.site

git add sites.md
git commit -m "Adds testsetup.site to sites.md"

git status

On branch feature nothing to commit, working tree clean

git checkout main

touch heihei.ru.sitemap.xml
git status

On branch main Untracked files: (use "git add <file>..." to include in what will be committed) heihei.ru.sitemap.xml nothing added to commit but untracked files present (use "git add" to track)

git add heihei.ru.sitemap.xml
git commit -m "Adds heihei.ru sitemap"

[main 578a2ed] Adds heihei.ru sitemap 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 heihei.ru.sitemap.xml

git status

On branch main nothing to commit, working tree clean

alt
Ветки main и feature
Визуализация коммитов

На диаграмме визуализирована наша текущая ситуация: с момента выделения ветки feature из ветки main ветка feature получила два коммита а ветка main один коммит.

Существует множесто инструментов, которые позволяют визуализировать ветки. В PyCharm это выглядит следующим образом:

alt
Ветки main и feature
Визуализация в PyCharm

С помощью merge ветка feature должна влиться обратно в main

git merge feature -m "Merge feature branch into main"

Merge made by the 'ort' strategy. partners.txt | 1 + sites.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)

Слияние произошло без конфликтов , поэтому дополнительных действий не требуется.

Слияние веток обычно иллюстрируют следующим оригинальным образом:

alt
merged main и feature
Визуализация в gitnuro
alt
merged main и feature
Визуализация в PyCharm

Историю коммитов можно изучить командой git log

git log

commit 8c55e995da65c00012d20136f9fe206b7e628b15 (HEAD -> main) Merge: 578a2ed 26b1495 Author: Olegovich, Andrei <andrei@aredel.com> Date: Tue Aug 19 12:36:04 2025 +0300 Merge feature branch into main commit 578a2ed7854259a00e3ea28b8330be314a9bbf81 Author: Olegovich, Andrei <andrei@aredel.com> Date: Mon Aug 18 17:08:19 2025 +0300 Adds heihei.ru sitemap commit 26b1495969c3b7eb12afe7a81146ed14b7c178eb (feature) Author: Olegovich, Andrei <andrei@aredel.com> Date: Mon Aug 18 16:54:11 2025 +0300 Adds testsetup.site to sites.md commit b32b5a32456cdaccab89b4556286173608cc0c34 Author: Olegovich, Andrei <andrei@aredel.com> Date: Mon Aug 18 16:50:46 2025 +0300 Adds hotellook.com to partners.txt commit 6622332c6759e883e20a294d867c07665bae74a0 Author: Olegovich, Andrei <andrei@aredel.com> Date: Mon Aug 18 16:37:39 2025 +0300 me

Обратите внимание на строку

commit 26b1495969c3b7eb12afe7a81146ed14b7c178eb (feature)

Здесь видно какой коммит был последним в ветке feature.

После того как был сделан merge ветка feature продолжила существовать в том виде в котором мы оставили её после добавления строки testsetup.site в файл sites.md.

Содержимое ветки feature было добавлено в ветку main но не наоборот.

В сокращённом виде можно изучить эту информацию с помощью опции --oneline

git log --oneline

8c55e99 (HEAD -> main) Merge feature branch into main 578a2ed Adds heihei.ru sitemap 26b1495 (feature) Adds testsetup.site to sites.md b32b5a3 Adds hotellook.com to partners.txt 6622332 me

Чтобы получить визуализацию веток используют опцию --graph

git log --oneline --graph

* 8c55e99 (HEAD -> main) Merge feature branch into main |\ | * 26b1495 (feature) Adds testsetup.site to sites.md | * b32b5a3 Adds hotellook.com to partners.txt * | 578a2ed Adds heihei.ru sitemap |/ * 6622332 me

Как уже было сказано выше, ветка feature по-прежнему существует. Так как в ней уже нет никакого уникального содержимого, ветку можно спокойно удалить.

git branch -d feature

Deleted branch feature (was 26b1495).

git log --oneline --graph

* 8c55e99 (HEAD -> main) Merge feature branch into main |\ | * 26b1495 Adds testsetup.site to sites.md | * b32b5a3 Adds hotellook.com to partners.txt * | 578a2ed Adds heihei.ru sitemap |/ * 6622332 me

git branch -a

* main

alt
merged main и feature
Визуализация в PyCharm
alt
merged main и feature
Визуализация в PyCharm

Теперь нужно присоединить этот удалённый репозиторий к локальному.

Часто встречаю такую инструкцию:

git remote add origin https://github.com/AndreiOlegovich/merge_demo.git
git remote -v

origin https://github.com/AndreiOlegovich/merge_demo.git (fetch) origin https://github.com/AndreiOlegovich/merge_demo.git (push)

Не очень понимаю, почему её преподносят как дефолтную, ведь ещё в 2021-м году обычную аутентификацию по паролю запретили.

Этот способ подойдёт тем, кто аутентифицируется по SSO через браузер, то есть, скорее пользователям корпоративных сетей.

Мне нужно проделать стандартный набор действий для подключения с помощью SSH ключа.

С чистого листа:

git remote add origin git@github.com:AndreiOlegovich/merge_demo.git

Либо, если уже была привязка по HTTPS

git remote set-url origin git@github.com:AndreiOlegovich/merge_demo.git

git remote -v

origin git@github.com:AndreiOlegovich/merge_demo.git (fetch) origin git@github.com:AndreiOlegovich/merge_demo.git (push)

Нужно подготовить SSH ключ

cd ~/.ssh ssh-keygen -t ed25519 -C "username@email.ru" eval `ssh-agent -s` ssh-add ~/.ssh/id_ed25519 cat ~/.ssh/id_ed25519.pub

Теперь в браузере нужно открыть

https://github.com/settings/keys

И сохранить туда вывод последней команды (cat) как New SSH key

Теперь можно выполнить первый push.

Самый первый push нужно делать с опцией -u

git push -u origin main

Warning: Permanently added 'github.com' (ED25519) to the list of known hosts. Enumerating objects: 15, done. Counting objects: 100% (15/15), done. Delta compression using up to 24 threads Compressing objects: 100% (13/13), done. Writing objects: 100% (15/15), 1.49 KiB | 1.49 MiB/s, done. Total 15 (delta 3), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (3/3), done. To github.com:AndreiOlegovich/merge_demo.git * [new branch] main -> main Branch 'main' set up to track remote branch 'main' from 'origin'.

После этого на GitHub появляется содержимое моего локального репозитория.

alt
merged main и feature
Визуализация в PyCharm

Автор статьи: Андрей Олегович