Git – schowek i konfilkty

Wyobraźcie sobie taką sytuację: macie swój projekt – np. ten utworzony w poprzedniej części (no dobra, projektem tego na razie nazwać nie można) – pracujecie nad nowym ficzerem i w połowie prac zdajecie sobie sprawę, że macie poważnego buga i to nie nowym kodzie ale tym starszym, który już opublikowaliście. Co możecie zrobić?

 

Żeby za bardzo nie utrudniać popracujemy z naszym poprzednim repozytorium.Dla naszych celów załóżmy, że repozytorium umieściliście np. na GitHubie. Teraz chcielibyście do niego dodać kilka nowych linijek tekstu. Zdążyliście dodać (w dowolnym edytorze) tylko dwie linijki tekstu i cały plik wygląda tak:

 

Nagle okazuje się, że pierwsza linijka miała wyglądać tak:

i dlatego teraz wszystko się „sypie”. Musicie na szybko wprowadzić poprawkę tylko co teraz? Możecie dalej pracować nad projektem (plikiem) i nanieść poprawkę i dopiero na końcu wrzucić całość na GitHuba. W naszym przypadku jest to możliwe, w końcu ile może trwać dodanie kilku kolejnych linijek i poprawka pierwszej? Niestety w projektach bardzo często jest to nie możliwe – wykryty bug może być zbyt poważny by mógł czekać albo dodanie nowych rzeczy trwa dłużej.

 

Schowek

Pierwszym ratunkiem jest schowek. Jak to działa? Pracujecie sobie nad naszym plikiem (macie już wprowadzone zmiany) i możecie wprowadzone zmiany przenieść do schowka, nanieść poprawki w pierwszej linijce, zrobić commita i wrzucić zmiany na Githuba a następnie pobrać ze schowka poprzednie zmiany (te z nowymi liniami) i pracować dalej. Jak to się robi?

Nasze repozytorium wygląda tak:

 

Przenieść do schowka możemy za pomocą polecenia:

i otrzymamy:

Mamy tutaj informację, że nasze repozytorium zostało przywrócone do commita „Pierwszy commit” i wprowadzonych zmian już nie ma:

 

Teraz sobie zmieniamy naszą pierwszą linię:

a następnie wykonujemy

i commitujemy:

 

Upewniliśmy się, że teraz jest już wszystko dobrze, więc możemy przywrócić zawartość schowka:

i wrócilibyśmy do dalszej pracy na nową zawartością ale tutaj pojawia się mały problem.

 

Konfikty

W naszym przypadku dostaliśmy komunikat:

Oznacza to, że Git nie mógł połączyć zawartości schowka z naszymi zmianami.

Git jest na tyle „mądry”, że w większości przypadków sam potrafi łączyć zmiany. Niestety zdarza się tak, że musimy mu pomóc, np. w sytuacji gdzie dwie wersje mają zmienioną tą samą linijkę i wtedy Git nie wie, która jest ta „właściwa”. Problem możemy rozwiązać korzystając z różnych narzędzi (np. vimdiff) lub po prostu edytując plik. Żeby nie utrudniać to dzisiaj zrobimy to sami.

Nasz plik w tej chwili wygląda tak:

Od linii 1 do 3 znajduje się zawartość naszego commita a od 3 do 8 zawartość schowka. Linie 1, 3 i 8 są dla nas informacją skąd pochodzą zmiany i co nie zostało połączone. Co musimy zrobić? W naszym przypadku wystarczy usunąć linie 1, 3 i 8, bo tych informacji już nie potrzebujemy oraz linię 4, która jest sprzed aktualizacji. Po zmianach plik wygląda tak:

 

Na koniec możemy sobie dodać resztę zmian:

i oczywiście:

oraz

 


Post 2 z 5 z serii Git