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
git commit –fixup | Maciej Aniserowicz o programowaniu…
Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl…