Як об'єднати кілька комітів в один
Є гілка, в якій послідовно лежить 13 комітів. Є нормальний спосіб їх об'єднати?
А по суті, я можу перейти в основну гілку і перекинути в неї тільки останній з допомогу cherry-pick
, тому що він містить в собі актуальну версію, що і потрібно в результаті. Хоча можу помилятися
Відповіді на питання (1)
Нехай ви хочете склеїти останні три коміти (для 13-ти комітів процес виглядає аналогічно). Для цього є відмінний метод з використанням git rebase
. Ця команда дозволяє змінювати історію комітів. Алгоритм роботи виглядає наступним чином:
- Зробіть резервну копію. Це зовсім не обов'язково, але допоможе зберегти нервові клітини, якщо щось піде не так. варіанти:
- Копія каталогу з файлами в якому розгорнуто git репозиторій.
-
git branch backup
абоgit tag backup
в останньому коміті. - Прочитати довідку по командам
reflog
іreset
і перевірити, що бекапи вже є.
- Позбавтеся від незакомічених змін (
git add
+git commit
абоgit stash
або щось ще). - Виконайте
git rebase -i HEAD~3
. У відповідь на це ви отримаєте "діалог" (вікно редагування файлу) виду:
pick bcdca61 Second commit
pick 4643a5f The third commit with cool stuff
pick e0ca8b9 The last commit
# Rebase 48411de..e0ca8b9 onto 48411de
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
при цьому, коміти вказані в порядку зростання часу створення (найнижчий - найсвіжіший).
- В "діалозі" з вам потрібно замінити
pick
наsquash
для двох найсвіжіших комітів (два нижні рядки). В наведеному вище прикладі, це повинно виглядати ось так:
pick bcdca61 Second commit
squash 4643a5f The third commit with cool stuff
squash e0ca8b9 The last commit
# Rebase 48411de..e0ca8b9 onto 48411de
#
#...
Після цього ви повинні закрити цей "діалог" (зберегти редагований файл). Якщо для роботи з git використовується vi (за замовчуванням), то це робиться послідовним натисканням ESC, введенням :wq
і натисненням Enter.
- У наступному "діалозі" вам запропонують вказати заголовок для отриманого коміту.