Примеры 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
Версии файла code.txt обоих веток склеены по приоритету ветки main (-Xours)
К последней строке файла code.txt ветки main "приклеены" уникальные строки из файла code.txt ветки 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
Версии файла code.txt обоих веток склеены по приоритету ветки develop (-Xours)
К последней строке файла code.txt ветки develop "приклеены" уникальные строки из файла code.txt ветки 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 develop
echo "code.txt merge=union" > .gitattributes
git rebase -Xtheirs main
rm .gitattributes
Суть: Commits develop переносятся в конец ветки main
Файлы: Благодаря merge=union строки develop дописываются в конец файла code.txt вслед за строками main
Хронология: Ветка develop получает линейную историю, её commits пересоздаются поверх main с новыми hash
* 414d527 - (2026-06-25 15:05:17 +0300) v6: develop - shion (HEAD -> develop)
* 03866c4 - (2026-06-25 15:05:17 +0300) v5: develop - shion
* 4ba3409 - (2026-06-25 15:05:17 +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_main
05_main
06_main
04_develop
05_develop
06_develop
Вариант 2. Приоритет Develop
git checkout develop
echo "code.txt merge=union" > .gitattributes
git rebase -Xours main
rm .gitattributes
ПеребазируемСуть: Commits develop переносятся в конец ветки main
Файлы: Благодаря флагу (-Xtheirs) в конфликтных местах строки main полностью заменяются строками develop
Хронология: Ветка develop получает линейную историю, её commits ветки main на ветку developВетка develop "втискивается" между 3им и 4ым commit ветки main согласно дате созданияВетка main "выталкивается"пересоздаются поверх последнего commit ветки develop.Commits ветки main пересоздаются с новыми hash и date от последнего commit ветки developХронология ветки main обновлена
xeon@srv-wiki:~/repo01$ git log0
* bd67ed5e4db323 - (2026-06-2325 22:25:1515:30:41 +0300) 06:v6: maindevelop - shion (HEAD -> main)develop)
* 081c08199f785a - (2026-06-2325 22:25:1515:30:41 +0300) 05:v5: develop - shion
* 971ac78 - (2026-06-25 15:30:41 +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
* 99388ca3725452 - (2026-06-2325 22:25:1513:32:08 +0300) 04:v4: main - shion
* 636966d6dca252 - (2026-06-2325 22:21:0913:32:08 +0300) 03: develop - shion (develop)
* f14df09 - (2026-06-23 22:21:09 +0300) 02: develop - shion
* 1d50cc3 - (2026-06-23 22:21:09 +0300) 01: develop - shion
* b67be77 - (2026-06-23 22:20:17 +0300) 03:v3: main - shion
* 3e405706630ea4 - (2026-06-2325 22:20:1713:32:08 +0300) 02:v2: main - shion
* 96cfdef6b1466c - (2026-06-2325 22:20:1713:32:08 +0300) 01:v1: main - shion
code.txt [Rebase]
01_main
02_main
03_main
04_develop
05_develop
06_develop
Основное требование при использовании git rebase:
ЗАПРЕЩЕНО производить git rebase с ветками которые вы уже отправили в общий репозиторий!01_main