## Удаление через Fork App
> У данного способа есть нюанс: Одна из двух дат коммитов сбрасывается на текущую дату, поэтому я использовал способ, когда удаляешь коммит через терминал.
Убедись, что **нет незакоммиченных изменений** (Выдаст ошибку)
Выделяешь коммит, который хочешь удалить (нажимаешь на него правой кнопкой мыши) → **Interactive Rebase** → **Drop…**
Когда будешь делать push на удаленный сервер, то нужен будет force push, потому что история переписана (SHA у коммитов поменялись).
Коммит должен пропасть из истории.
![[Снимок экрана 2025-12-14 в 09.10.22 (4).png]]
##### Что конкретно происходит
- Git берёт **родителя** этого коммита.
- Затем **пропускает** (не применяет) изменения из коммита, помеченного как _drop_.
- После этого **заново применяет все коммиты, которые идут после него**, как будто “удалённого” коммита никогда не было.
- В результате переписывается история: у всех последующих коммитов меняются SHA (хэши), потому что меняется их база.
##### Что будет с датами перезаписанных коммитов
Зависит от того, **какую “дату” ты имеешь в виду** — в Git их обычно две:
- **Author Date** (дата автора) — когда изменения _изначально_ были закоммичены автором.
- **Committer Date** (дата коммитера) — когда коммит _в текущем виде_ был создан в истории (например, после rebase).
Что будет при `Drop` (через interactive rebase):
- Сам **удаляемый коммит исчезнет**.
- **Все коммиты ПОСЛЕ него** будут “пересозданы” (перезаписаны), т.к. меняется их базовый предок.
- У них **поменяются SHA**.
- **Committer Date почти всегда станет “время rebase”** (то есть “сегодня/сейчас”).
- **Author Date обычно останется прежней** (как было до rebase).
- Коммиты **до** удаляемого коммита обычно **не меняются** (и даты у них тоже).
## Удаление через терминал
В терминале перейдите в директорию вашего репозитория.
---
Убедись, что нет незакоммиченных изменений (иначе выдаст ошибку):
```bash
git status
```
---
Интерактивный rebase начиная с коммита ДО того, который хочешь удалить
```bash
git rebase -i --committer-date-is-author-date <hash_коммита_ДО_удаляемого>
```
Нужно указать коммит-родитель (parent) — то есть коммит, который стоит прямо ПЕРЕД тем коммитом, который ты хочешь удалить.
Как понять “какой именно”
В твоём случае:
- есть коммит **A** (предыдущий),
- потом идёт “плохой” коммит **B** (тот, который хочешь удалить),
- потом идут **C, D, …**
Тебе нужен **A**.
Как взять его хэш (проще всего)
В Fork
1. В истории кликни по коммиту перед удаляемым (A).
2. Скопируй его SHA (обычно: правый клик → Copy → SHA / Copy Commit Hash).
После того как получил хэш **A**:
```bash
git rebase -i --committer-date-is-author-date <hash_A>
```
---
После запуска откроется список коммитов, начиная **со следующего после A** — то есть там будет **B**, **C**, **D**…
И вот там напротив **B** ставишь `drop`, сохраняешь.
- Как именно это сделать (если открылся редактор Vim)
- стрелками ставишь курсор на коммит B и нажимаешь клавишу `D`
- Нужно быть очень внимательным, нажмешь клавишу `D` два раза и удалишь сразу два коммита.
- Нажми `Esc` (чтобы выйти в “обычный режим”).
- Введи `:wq` и нажми `Enter`.
- Это сохранит файл и закроет редактор, и rebase продолжится.
- Если после `:wq` появятся конфликты — напиши ChatGPT.
---
##### Если случайно удалил неправильно, то как откатиться
Вариант 1 (самый безопасный): отменить rebase и вернуться как было:
- Нажми `Esc` (на всякий случай).
- Введи `:q!` и нажми Enter.
- (это выйдет из vim **без сохранения**)
- В терминале (в папке репозитория) выполни: `git rebase --abort`
- Если после ввода команды, выдает ошибку (например, `fatal: No rebase in progress?`) и отката НЕ произошло
- Тогда попробуй команду `git reset --hard ORIG_HEAD` (мне помогло)
- Если не помогло, то попробуй reflog (это 100% спасалка - со слов ChatGPT)
- После этого ты вернёшься к исходной истории.
---
##### reflog (это 100% спасалка)
`git reflog -n 30` показывает **последние 30 перемещений HEAD** (куда “прыгал” твой репозиторий). Это реально “спасалка”, потому что даже если ты переписал историю rebase/reset’ом и “коммиты пропали” из `git log`, их можно найти в reflog и откатиться назад.
Как это обычно используется
1. Посмотреть историю перемещений:
```bash
git reflog -n 30
```
2. Найти строку, где было нормальное состояние (например, _before rebase_ / _rebase (start)_ / просто нужный коммит).
Пример (условно):
```
a1b2c3d HEAD@{0}: rebase finished: ...
9f8e7d6 HEAD@{1}: rebase (start): ...
1122334 HEAD@{2}: commit: ...
```
3. Откатиться в нужную точку:
```bash
git reset --hard HEAD@{2}
```
или по конкретному хэшу из reflog:
```bash
git reset --hard 1122334
```