# Merge/Rebase Examples

#### <span style="color: rgb(53, 152, 219);">Исходный вариант</span>

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

```ruby
* 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
```


<details id="bkmrk-code.txt-01_main02_m"><summary>code.txt \[Main ver.\]</summary>

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

</details><details id="bkmrk-code-dev.txt-01_deve"><summary>code.txt \[Develop ver.\]</summary>

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

</details>#### <span style="color: rgb(53, 152, 219);">Git Merge</span>

##### Вариант 1. Автообновление Main

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

<p class="callout info">Ветка develop вливается в ветку main. Файлы объединяются построчно  
В конфликтных местах (строки 04-06) побеждает версия из main  
Не конфликтующие строки (07-09 из develop) добавляются в результирующий файл<span style="background-color: rgb(255, 255, 255);">  
</span></p>

```ruby
*   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
```


<details id="bkmrk-code.txt-%5Bmain-ver.%5D"><summary>code.txt \[Merge\]</summary>

01\_main  
02\_main  
03\_main  
04\_main  
05\_main  
06\_main  
<span style="color: rgb(224, 62, 45);">04\_develop</span>  
<span style="color: rgb(224, 62, 45);">05\_develop</span>  
<span style="color: rgb(224, 62, 45);">06\_develop</span>

</details>##### Вариант 2. Автообновление Develop

```ruby
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
```

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

```ruby
*   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
```


<details id="bkmrk-code.txt-%5Bdev-ver.%5D-"><summary>code.txt \[Dev ver.\]</summary>

01\_main  
02\_main  
03\_main  
<span style="color: rgb(224, 62, 45);">04\_develop</span>  
<span style="color: rgb(224, 62, 45);">05\_develop</span>  
<span style="color: rgb(224, 62, 45);">06\_develop</span>

</details>#### <span style="color: rgb(53, 152, 219);">Git Rebase</span>

##### Вариант 1. Обновление Main

```ruby
git checkout develop
git rebase main
```

<div class="Fsg96" data-complete="true" data-copy-service-computed-style="font-family: "Google Sans", Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px none rgb(10, 10, 10);" data-processed="true" data-sfc-cb="" data-sfc-cp="" data-sfc-inited="2" data-sfc-root="ep" id="bkmrk--2" jsaction="rcuQ6b:&ORd4Ub_37|npT2md" jscontroller="KHhJQ#U8DOt" jsuid="ORd4Ub_37"></div><p class="callout info">**Суть:** Коммиты из ветки develop переносятся в конец ветки main и пересоздаются с новыми hash  
**Файлы:** При перебазировании каждый коммит из develop по очереди применяется поверх текущего состояния main  
**Хронология:** Ветка develop перестраивается поверх main, её коммиты получают новые hash  
Конфликты разрешаются в пользу ветки develop  
</p>

<p class="callout success">Rebase main (+develop) — подобен процессу, когда вы синхронизируете свою инфраструктуру (main)  
с последними изменениями с тестового стенда (develop), перестраивая историю develop поверх main,  
но сохраняя все свои экспериментальные наработки (develop) в конфликтных местах  
Вы поднимаете main на новый уровень, содержащий все изменения develop  
и история main становится линейным продолжением истории develop  
</p>

```ruby
* 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
```

<details id="bkmrk-code.txt-%5Brebase%5D-01-1"><summary>code.txt \[Rebase\]</summary>

01\_main  
02\_main  
03\_main  
<span style="color: rgb(224, 62, 45);">04\_develop</span>  
<span style="color: rgb(224, 62, 45);">05\_develop</span>  
<span style="color: rgb(224, 62, 45);">06\_develop</span>

</details>##### Вариант 2. Обновление Develop

```ruby
git checkout main
git rebase develop
```

<p class="callout info">**Суть:** Commits из ветки main переносятся в конец ветки develop и пересоздаются с новыми hash  
**Файлы:** При перебазировании каждый commit из main по очереди применяется поверх текущего состояния develop  
**Хронология:** Ветка main перестраивается поверх develop, её коммиты получают новые hash  
Конфликты разрешаются в пользу ветки main  
</p>

<p class="callout success">Rebase develop (+main) - подобен процессу, когда вы обновляете свой тестовый стенд(develop),  
пересобирая его на основе последней версии инфраструктуры (main), но с сохранением всех кастомных доработок.  
Теперь develop базируется на свежей стабильной версии, а его история является логичным продолжением истории main.</p>

```ruby
* 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
```

<details id="bkmrk-code.txt-%5Brebase%5D-01"><summary>code.txt \[Rebase\]</summary>

01\_main  
02\_main  
03\_main  
<span style="color: rgb(224, 62, 45);">04\_main</span>  
<span style="color: rgb(224, 62, 45);">05\_main</span>  
<span style="color: rgb(224, 62, 45);">06\_main</span>

</details>
##### Правила REBASE

<p class="callout warning">Если в develop больше строк, (например 07-09) и они не конфликтуют с main, то они сохраняются и после rebase  
Конфликт возникает только там, где строки пересекаются (04-06)</p>

<p class="callout danger">ЗАПРЕЩЕНО производить git rebase с ветками которые вы уже отправили в общий репозиторий !  
</p>