Poradniki Programowanie

git: squash commitów bez rebase

Google+ Pinterest LinkedIn Tumblr

W życiu programisty są takie momenty podczas developmentu, gdzie na feature branchu pojawia się mnóstwo commitów. Same commity to jeszcze pół biedy. Poprzeczka się podnosi, gdy pojawiają się merdże z innych branchy. W tym wpisie pokażę jak zrobić porządek z commitami – czyli jak zrobić squash, ale bez użycia rebase.

Przez jakiś czas byłem fanem robienia squash’y commitów za pomocą komendy:

git rebase -i HEAD~X

gdzie X był liczbą commitów jakieś chciałem połączyć w jeden. W praktyce wyglądało to git rebase -i HEAD~5, czyli łączyłem ostatnie 5 commitów w branchu w jeden. Wszystko działało fajnie jeśli one były moje. Ciekawiej robiło się gdy na liście commitów pojawiały się merge. Wtedy szansa na konflikty stawała się bardzo prawdopodobna.

Squash bez rebase

Od niedawno ten problem rozwiązuje w znacznie prostszy i szybszy sposób. Na potrzeby przykładu przyjmijmy, że:

  • new_feature, to branch na którym mam bałagan z commitami,
  • development, to branch do którego będzie wystawiony pull request, czyli new_feature -> development

Krok po kroku wygląda, to tak:

  1. Tworzymy, nowy, tymczasowy branch z brancha do którego będziemy merdżować (w naszym przypadku będzie to development) czyli:
    git checkout -b new_feature_temp
  2. Następnie merdżujemy new_feature do new_feature_temp komendą
    git merge --squash new_feature

    Ta komenda przeniesie wszystkie zmiany z new_feature ale nie zrobi żadnego commita. Można powiedzieć, że efekt jest podobny do komendy git stash pop. Teraz możemy wprowadzić commit message:

    git commit -m "feat: my awesome feature"
  3. Kolejny krok to przejście na nasz oryginalny branch (new_feature) i zresetowanie go do zmian z tymczasowego brancha.
    git checkout new_feature
    git reset --hard new_feature_temp
  4. Ostatni krok to wypchnięcie nowych zmian i wyczyszczenie tymczasowanego brancha
    git push -f
    git banch -D new_feature_temp

Może to się wydawać trochę skomplikowane na początku, ale uwierzcie, że tak nie jest. Wszystko działa jak należy. Ten sposób na pewno będzie przydatny na feature branchach, który były wyrównywane z branchami docelowymi, bo trzeba było rozwiązać konflikty. W takim przypadku interaktywny rebase nie sprawdzi się.

Uwielbiam nowe technologie oraz wszelkiego rodzaju gadżety (ale tylko te użyteczne). Pochłaniam nowości i ciekawostki związane z technologią. Uważam, że technologia może nam bardzo pomóc (o ile będzie używana z rozwagą). Z zawodu jestem programistą JavaScript.

Skomentuj