# Разница между merge и rebase в git
**Category:** [Ввод сервиса](https://discuss.rabkesov.ru/c/service/5)
**Created:** 2026-04-24 07:20 UTC
**Views:** 20
**Replies:** 0
**URL:** https://discuss.rabkesov.ru/t/raznicza-mezhdu-merge-i-rebase-v-git/405
---
## Post #1 by @ivan
**Ни rebase, ни merge при `pull` сами по себе не “стирают” наработки** — в обоих случаях ваши коммиты остаются в репозитории (в истории ветки или в виде старых SHAs, пока живёт `reflog`).
- **`pull.rebase false` (merge):** `git pull` сделает **merge commit**, ваши и чужие коммиты **не переписываются**, история ветки просто **срастается** веткой. Визуально “безопаснее” для головы: вы явно видите сходящиеся линии.
- **`pull.rebase true` (rebase):** ваши локальные коммиты **копируются** поверх удалённых (новые хеши). **Содержимое** коммитов обычно то же, но “старые” коммиты после успешного rebase могут остаться только в **`git reflog`** — это нормально, оттуда при необходимости **восстанавливают** (`git reset --hard` к нужному ref из reflog), если вдруг что-то пошло не так.
**Если главное — “не потерять наработки”:**
1. **Перед рискованными шагами** — коммит (или `git stash`) и по желанию **отдельная ветка** (`git branch backup-tgisn-46`) — копия указателя, дешёвый бэкэп.
2. **Не путать с потерями** команды вроде **`git reset --hard`**, **force push** без нужды, **`git clean -fd`**.
3. **После rebase/merge** пару дней **не трогать `git gc` агрессивно** — `reflog` хранит запасной выход.
Практично для “не терять, не усложнять историю сильно”: **`git config pull.rebase false`** — при расхождении вы всегда получите **merge**, без перезаписи локальных коммитов. Если вам **уже** зашёл вариант **rebase** (как в прошлом `pull --rebase`) — можно оставить **`pull.rebase true`**, просто **не `push --force`** на общие ветки без договорённости.
Итог: **потеря наработок от выбора стратегии `pull` не идёт**; риск — в **других** командах и в **force push**; для спокойствия — **коммит + ветка-бэкэп** перед непонятными операциями.
Вот та же ситуация, что у вас была: **один общий коммит C**, дальше на **origin** пять коммитов `r1…r5`, на **локали** — один `L` (мой наработок).
## 1. До `pull` (разошлись)
```mermaid
gitGraph
commit id: "C (общий)"
branch local
checkout local
commit id: "L (мой коммит)"
checkout main
commit id: "r1"
commit id: "r2"
commit id: "r3"
commit id: "r4"
commit id: "r5"
```
Смысл: кончик **local** = `L`, кончик **main** = `r5`, общий предок — `C`. Это **не потеряно** в обоих вариантах — меняется только, **как** сшивается история.
---
## 2. После `git pull` **без** rebase (`pull.rebase false` → **merge**)
```mermaid
gitGraph
commit id: "C"
branch local
checkout local
commit id: "L"
checkout main
commit id: "r1"
commit id: "r2"
commit id: "r3"
commit id: "r4"
commit id: "r5"
checkout local
merge main
commit id: "M (merge commit)"
```
Появляется **merge commit M** с **двумя родителями** (`L` и `r5`). Коммиты `L` и `r1…r5` **как объекты остаются**; история **ветвистая**, переписывания нет.
---
## 3. После `git pull` **с** rebase (`pull.rebase true` → **rebase**)
```mermaid
gitGraph
commit id: "C"
commit id: "r1"
commit id: "r2"
commit id: "r3"
commit id: "r4"
commit id: "r5"
commit id: "L′ (тот же патч, новый hash)"
```
История **линейная**: ваш наработок лежит **сверху** удалённых. У `L` в истории **новый** коммит `L′` (тот же дифф относительно `r5`, другой hash); старый `L` как раз ещё какое-то время виден в **`git reflog`**, пока не уберёте `reflog expire`.
---
**Кратко:** merge — **развилка + merge-узел**; rebase — **одна линия, ваш коммит “переигран”** поверх. Наработок в смысле **изменений в файлах** в обоих нормальных сценариях не исчезает; отличается **форма** истории и **хеши** локального коммита при rebase.
---
**Canonical:** https://discuss.rabkesov.ru/t/raznicza-mezhdu-merge-i-rebase-v-git/405
**Original content:** https://discuss.rabkesov.ru/t/raznicza-mezhdu-merge-i-rebase-v-git/405