Як об'єднати кілька комітів в один
Є гілка, в якій послідовно лежить 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. -
У наступному "діалозі" вам запропонують вказати заголовок для отриманого коміту.