Dawno nie pisałem, ale po pierwsze nie mam weny, po drugie mam lenia, po trzecie trochę nie mam czasu. To znaczy mam czas, ale jakoś on tak przez palce przelatuje, że napisanie nie starcza.

W projekcie, w którym obecnie grzebię mamy etap zmiany wielkości wdrożenia. Zamiast dużych wdrożeń co 6 tygodni (3 sprinty) robimy mniejsze co 4 tygodnie (2 sprinty). Klient to korpo musiał dojrzeć do tego typu procesu. W związku z tym obecnie musimy ogarnąć dwa wdrożenia. Pierwsze „małe” na koniec tego sprintu i drugie ostatnie „duże”. Duża część tego ogarniania polega na przenoszeniu funkcjonalności zaimplementowanych w dużym do małego. Przy czym, żeby było śmieszniej branch małego został odbity z ostatniego wdrożenia produkcyjnego zatem przed branchem dużego.

Listing 1. Wytłumaczenie obrazkowe

       /D---A--B--C--Y--Z--====
---p---==========
    \m---a--b--c=====     

legenda:
p – produkcja
D – duży release (wielkie literki w nazwach commitów)
m – mały release (małe literki w nazwach commitów)
== – dalsze commity, które nas nie interesują

D i m to nazwy branchy, a nie commitów.

Tanie wino jest dobre…

I teraz mamy zadanie przenieść Y i Z do małego brancha. Pytanie jak? Propozycja interna – no trzeba ręcznie skopiować zmiany… w 20 plikach.

Ok. Można coś takiego zrobić w przypadku pojedynczego pliku i zmiany w jednej linijce. Będzie szybciej, bo metoda Copiego-Pasty zadziała.

…bo jest dobre i tanie

Jeżeli jednak mamy gita to można spokojnie wykorzystać cherry-pick do skopiowania zawartości konkretnych commitów. Poniżej instrukcja krok po kroku

Listing 2. Przenoszenie commitów krok po kroku

$ git checkout D
$ git pull 
$ git checkout m
$ git checkout -b feature/clone-of-YZ
$ git cherry-pick Y
$ git cherry-pick Z
$ git push -u origin feature/clone-of-YZ

Teraz po kolei co robimy

  • Przesiadka na brancha D
  • Pobieramy wszystkie zmiany z serwera tak by było aktualne. Mamy pewność, że lokalnie istnieją commity Y i Z
  • Przesiadka na m
  • Tworzymy nowy lokalny branch, który jest odbity z m i będzie klonem zadania zawierającego Y i Z
  • Przenosimy commit Y. Można użyć notacji zakresowej jeżeli przenosimy kilka kolejnych commitów
  • Przenosimy commit Z
  • Wypychamy naszego nowego brancha na serwer

Merge będzie już się dział na serwerze (używamy stasha).

I by utrzymać klimat lekko Woodstock-owy
wisienka-mazowiecka-887

ps. na specjalne życzenie Pawła finalne drzewko

Listing 3. Finalne drzewko

       /D---A--B--C--Y--Z--====
---p---==========
    \m---a--b--c=====y--z     

Commity y i z są co do zawartości identyczne z Y i Z, ale mają inne hashe.

No i jeszcze jebłembyłem litrówkę w pierwotnym tytule… potrzebuję odpoczynku.