Skip to main content

Примеры Merge и Rebase

                                                                                                                                                                  

Исходный вариант

Схема коммитов до объединения веток

* efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion (develop)
* c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
* e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
| * 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion (HEAD -> main)
| * ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
| * 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
|/
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
code.txt [Main ver.]

01_main
02_main
03_main
04_main
05_main
06_main

code.txt [Develop ver.]

04_develop
05_develop
06_develop

Git Merge

Вариант 1. Приоритет Main
git checkout main
# Включаем режим union-слияния для файла code.txt
echo "code.txt merge=union" > .gitattributes
# Слияние ветки develop с приоритетом изменений main
git merge -Xours develop -m "Merge branch 'develop'"
rm .gitattributes

Ветка develop вливается в ветку main. Файлы объединяются построчно.построчно
В конфликтных местах (строки 04-06) побеждает версия из main
Не конфликтующие строки (07-09 из develop) добавляются в результирующий файл

*   6a3d02b - (2026-06-25 13:34:55 +0300) Merge branch 'develop' - shion (HEAD -> main)
|\
| * efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion (develop)
| * c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
| * e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
* | 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion
* | ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
* | 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
|/
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion

code.txt [Merge]

01_main
02_main
03_main
04_main
05_main
06_main
04_develop
05_develop
06_develop

Вариант 2. Приоритет Develop
git checkout develop
# Включаем режим union-слияния для объединения строк файла code.txt
echo "code.txt merge=union" > .gitattributes
# Слияние ветки main с приоритетом изменений develop
git merge -Xtheirs main -m "Merge branch 'main' into develop"
rm .gitattributes

Ветка main вливается в ветку develop. Файлы объединяются построчно
В конфликтных местах (строки 04-06) побеждает версия из develop (-Xours)
Не конфликтующие строки (04-06 из main) добавляются в результирующий файл

*   47739bd - (2026-06-25 13:39:07 +0300) Merge branch 'main' into develop - shion (HEAD -> develop)
|\
| * 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion (main)
| * ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
| * 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
* | efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion
* | c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
* | e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
|/
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion

code.txt [Dev ver.]

01_main
02_main
03_main
04_develop
05_develop
06_develop
04_main
05_main
06_main

Git Rebase

Вариант 1. Приоритет Main
git checkout main
git rebase -Xtheirs develop

Суть: Commits main переносятся в конец ветки develop
Файлы: Благодаря флагу (-Xtheirs) в конфликтных местах строки develop полностью заменяются строками main
Хронология: Ветка main получает линейную историю, её commits пересоздаются поверх develop с новыми hash

* 94f8376 - (2026-06-25 16:12:33 +0300) v6: main - shion (HEAD -> main)
* daea4c3 - (2026-06-25 16:12:33 +0300) v5: main - shion
* 98ceae4 - (2026-06-25 16:12:33 +0300) v4: main - shion
* efa552b - (2026-06-25 13:32:25 +0300) v6: develop - shion (develop)
* c828a46 - (2026-06-25 13:32:25 +0300) v5: develop - shion
* e17a9c1 - (2026-06-25 13:32:25 +0300) v4: develop - shion
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
code.txt [Rebase]

01_main
02_main
03_main
04_main
05_main
06_main

Вариант 2. Приоритет Develop
git checkout develop
git rebase -Xtheirs main

Суть: Commits develop переносятся в конец ветки main
Файлы: Благодаря флагу (-Xtheirs) в конфликтных местах строки main полностью заменяются строками develop
Хронология: Ветка develop получает линейную историю, её commits пересоздаются поверх main с новыми hash

* f7f88b7 - (2026-06-25 15:53:56 +0300) v6: develop - shion (HEAD -> develop)
* d5f3c38 - (2026-06-25 15:53:56 +0300) v5: develop - shion
* ce362ac - (2026-06-25 15:53:56 +0300) v4: develop - shion
* 10834a6 - (2026-06-25 13:32:08 +0300) v6: main - shion (main)
* ecb682a - (2026-06-25 13:32:08 +0300) v5: main - shion
* 3725452 - (2026-06-25 13:32:08 +0300) v4: main - shion
* 6dca252 - (2026-06-25 13:32:08 +0300) v3: main - shion
* 6630ea4 - (2026-06-25 13:32:08 +0300) v2: main - shion
* 6b1466c - (2026-06-25 13:32:08 +0300) v1: main - shion
code.txt [Rebase]

01_main
02_main
03_main
04_develop
05_develop
06_develop

Правила REBASE

Commits— это полные снимки файлов, поэтому уникальные строки из базовой ветки НЕ сохраняются,
если их нет в перебазируемых коммитах

ЗАПРЕЩЕНО производить git rebase с ветками которые вы уже отправили в общий репозиторий!