Dwa release-y na raz, czyli tanie wino jest dobre bo jest dobre i tanie

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.

3 myśli na temat “Dwa release-y na raz, czyli tanie wino jest dobre bo jest dobre i tanie

  1. Czesc,

    post jak zwykle utrzymany po ciemnej stronie mocy (za to je lubie :)).

    Niemniej, myślę, że warto użyć innego słownictwa niż „przenosimy commit Y”. One nigdzie nie sa przeniesione. Robimy nowe commity. Chyba najlepiej jakbys na koncu posta narysował finalne „drzewko”, podobne do tego, które widzieliśmy na początku, wtedy każdy zrobi sobie mentalnie diff’a.

    +10 za wisienke mazowiecką 🙂

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax