24
Oct

git commit –fixup

Co jakiś czas odkrywam w Gicie perełkę, która czyni moją codzienną pracę jeszcze przyjemniejszą. Niedawno takim ficzerem okazał się tryb “fixup” komendy “commit“.

Do czegóż to służy? Jest to po prostu szybszy sposób na poprawienie commita z przeszłości.

Załóżmy, że do klasy User dodałem właśnie property age, tyle że przez pomyłkę nazwałem je z małej litery i… nie zauważyłem. Pracuję, pracuję i dopiero po dwóch kolejnych commitach zobaczyłem, że coś jest nie tak. Git log pokaże mi identyfikator commita, który chciałbym naprawić:

$ git log -n3 --oneline
758c0e4 and even more work....
8d27a7a some more work....
b92f2f0 added age property to User

Jak widać, jest to commit b92f2f0.

I teraz mam do wyboru parę dróg (o które zahaczyłem w poście sprzed ponad trzech lat

Modyfikacja historii w Gicie“). Wszystkie opierają się na “interactive rebase” (chociaż opcji, jak to z Gitem bywa, jest prawdopodobnie więcej).

Po pierwsze, mogę zedytować commita z przeszłości poprzez wywołanie git rebase -i b92f2f0^ i zmianę “pick” na “edit” przy interesującej mnie wrzutce:

edit b92f2f0 added age property to User
pick 8d27a7a some more work...
pick 758c0e4 and even more work...

Wtedy Git zatrzyma się na moim commicie i będę mógł dorzucić do niego zmiany poprzez git commit –amend i kontynuować procedurę rebase: git rebase –continue. Ten sposób wymaga jednak przerwania aktualnej pracy i grzebania się w bzdurach, co skutecznie może wytrącić mnie z kontekstu aktualnego zadania.

Po drugie, mogę zrobić poprawkę i wrzucić ją teraz jako kolejny commit. Potem, za jakiś czas, będę mógł ponownie w (tak samo wywołanym) git rebase poczynić pewien misz-masz i osiągnąć to co chcę poprzez zmianę tego:

pick b92f2f0 added age property to User
pick 8d27a7a some more work...
pick 758c0e4 and even more work...
pick 826dff0 fixed User.Age property casing

na to:

pick b92f2f0 added age property to User
squash 826dff0 fixed User.Age property casing
pick 8d27a7a some more work...
pick 758c0e4 and even more work...

Po kontynuacji rebase commity zostaną “zlepione” w jeden. Muszę jednak babrać się z commit msg, ponieważ wiadomości z dwóch łączonych commitów również zostaną połączone. Napisanie czegoś takiego spowoduje zignorowanie commit msg z drugiego, nowszego commita:

fixup 826dff0 fixed User.Age property casing

I to jest właśnie to co lubię. A co lepsze: Git może mi automatycznie taką procedurę rebase wygenerować! Wystarczy dorzucić go do historii w taki sposób:

git commit --fixup=b92f2f0

Teraz w rebase widzę coś takiego:

pick b92f2f0 added age property to User
fixup eca96eb fixup! added age property to User
pick 8d27a7a some more work...
pick 758c0e4 and even more work...

Wystarczy zaakceptować domyślną propozycję i commity zlepią mi się same, jak Bozia przykazała. I to jest fajne. Trzeba tylko pamiętać, że to zachowanie musi być włączone w konfiguracji:>/p>

git config rebase.autosquash true
Autor

Maciej Aniserowicz

Maciej Aniserowicz
"Procent"
developer / architect

MVP
MCP

Search
Facebook
Twitter
Archiwum
Kategorie
© Copyright 2008-2014 Maciej Aniserowicz. All rights reserved. Running on WordPress.