$ curl /git-squash-commitow-bez-rebase_

git: squash commitów bez rebase

Piotr Cichosz @ 12 października 2022 2min

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ę.

$ post meta
categories: ["Poradniki", "Programowanie"]
$ whoami
Piotr Cichosz
Piotr Cichosz
Od ponad 10 lat jestem zaangażowany w świat elektroniki użytkowej, zdobywając szeroką wiedzę i doświadczenie w testowaniu oraz recenzowaniu najnowszych technologii. Moja kariera obejmuje pracę w wiodących firmach technologicznych, gdzie specjalizowałem się w rozwiązywaniu złożonych problemów technicznych oraz doradzaniu w kwestiach wyboru sprzętu. Na moim blogu publikuję dokładne poradniki oraz recenzje urządzeń takich jak smartfony, routery i słuchawki, oferując czytelnikom rzetelne informacje oparte na wieloletnim doświadczeniu i skrupulatnych testach. Moim celem jest dostarczanie treści, które pomagają w podejmowaniu świadomych decyzji zakupowych oraz pełnym wykorzystaniu możliwości nowoczesnej elektroniki.
$ git log --neighbors
[PREV] Recenzja realme C33 – budżetowiec, który robi dobre zdjęcia 12 października 2022 [NEXT] Połączono bez internetu – czyli dlaczego nie ma internetu w telefonie lub laptopie 14 października 2022