git commit --amend -m "New commit message"Эта команда позволяет изменить сообщение последнего коммита на "New commit message".
🧹 Перезапись хеша: Поскольку содержание коммита изменяется (хотя бы сообщение), хеш коммита тоже изменится. Это, в свою очередь, приведёт к изменению хешей всех последующих коммитов, если таковые имеются.
- Осторожно с "публичными" ветками: Если ты уже запушил коммит, а потом решил его "исправить" и снова запушить,
тебе придётся использовать
git push --forceдля перезаписи истории на удалённом репозитории. Это может создать проблемы для других разработчиков, которые уже вытащили обновления.
git add fixed-file.ts
git commit --fixup <SHA-of-commit-to-fix>После создания одного или нескольких fixup коммитов, вы можете выполнить интерактивный rebase с опцией --autosquash, которая автоматически упорядочит и объединит fixup коммиты с их родительскими коммитами:
git rebase -i --autosquash <base-commit>~1Параметр
~1означает, что rebase начнется с коммита, предшествующего указанному .
🧹 Перезапись хеша
-
Выбор базового коммита: Определи хеш коммита, начиная с которого ты хочешь провести rebase (назовем его
<base-commit>). Этот коммит будет тем, на котором будут "основаны" твои измененные коммиты.git log
-
Запуск интерактивного rebase:
git rebase -i <base-commit>~1
Параметр
~1означает, что rebase начнется с коммита, предшествующего указанному -
Выбор действий: После запуска команды вы увидите текстовый редактор с перечнем коммитов. Здесь ты можешь выбрать, что именно хочешь сделать с каждым коммитом:
pick,reword,edit,squash,fixup, и т.д. -
Применение изменений: После сохранения и закрытия редактора, Git начнет применять изменения. Если возникнут конфликты, их нужно будет решить вручную.
-
Завершение rebase:
git rebase --continue
git rerere (REuse REcorded REsolution) — это утилита в Git, которая помогает автоматизировать процесс решения
конфликтов при слиянии или ребейзе. В основном, это полезно, когда ты часто сталкиваешься с одними и теми же конфликтами
и не хочешь решать их вручную каждый раз.
Вкратце, работает это так:
- При включении
git rerereдля локального репозитория:или глобально:git config rerere.enabled trueGit начинает запоминать, какие конфликты возникают и как ты их разрешаешь.git config --global rerere.enabled true - При следующем возникновении аналогичного конфликта Git автоматически применяет те же изменения, чтобы разрешить конфликт.
Выключить rerere можно так:
git config --unset rerere.enabled
Основные команды:
git rerere— повторно применяет предыдущие решения по конфликтам, если таковые имеются.git rerere remaining— показывает файлы, которые ожидают решения.git rerere diff— показывает различия между сохраненным решением и текущим состоянием.git rerere forget <path>— "забывает" решение конфликта для указанного файла.
Часто это применяется в больших командах или при работе с несколькими ветками, чтобы сократить время на разрешение конфликтов.
-
Q: Как обновить
yarn.lockв для отдельного коммита? -
A:
- Для последнего коммита:
git add yarn.lock && git commit --amend --no-edit - Interactive Rebase → Amend Commit
- Для последнего коммита:
-
Q: Как разделить коммит на несколько?
-
A: Interactive Rebase +
git reset HEAD~Splitting a commit into multiple commits -
Q: Зачем нужен делать отдельные коммиты для отдельных групп изменений?
-
A:
- Чтобы можно было откатить только часть изменений, а не все.
- Чтобы можно было отбросить часть изменений, а не все (например, обновление файлов переводов).
- Чтобы можно было откатить изменения, которые не должны были попасть в коммит (например, отладочный вывод).
- Чтобы сделать cherry-pick только нужных изменений и создать отдельный MR в будущем
-
Q: Зачем разделять MR на несколько?
-
A:
- Проще объяснить суть изменений/рефакторинга в отдельном MR, если они не связаны с решением задачи.
- Чтобы можно было откатить только часть изменений, а не все решение задачи, и наоборот.