Odpowiedzi:
Zbieranie wiśni w Git oznacza wybranie zatwierdzenia z jednej gałęzi i zastosowanie go do innej.
Jest to sprzeczne z innymi sposobami, takimi jak mergei rebasektóre zwykle stosują wiele zatwierdzeń do innej gałęzi.
Upewnij się, że jesteś w gałęzi, do której chcesz zastosować zatwierdzenie.
git checkout master
Wykonaj następujące czynności:
git cherry-pick <commit-hash>
NB:
Jeśli wybierzesz z publicznego oddziału, powinieneś rozważyć użycie
git cherry-pick -x <commit-hash>
Spowoduje to wygenerowanie standardowego komunikatu zatwierdzenia. W ten sposób Ty (i Twoi współpracownicy) nadal możecie śledzić pochodzenie zatwierdzenia i uniknąć konfliktów scalania w przyszłości.
Jeśli masz dołączone notatki do zatwierdzenia, nie są one zgodne z wyborem. Aby je również przynieść, musisz użyć:
git notes copy <from> <to>
Dodatkowe linki:
git cherry-pick -x <commit-hash>. Spowoduje to wygenerowanie standardowego komunikatu zatwierdzenia. W ten sposób Ty (i Twoi współpracownicy) nadal możecie śledzić pochodzenie zatwierdzenia i uniknąć konfliktów scalania w przyszłości.
git notes copy <from> <to>ich również przynieść.
"cherry-pick commit applies the changes introduced by the named commit on the current branch"Większość ppl mają tendencję do myślenia o zatwierdzeniu jako o zmianach (jak svn was iirc), ale nie jest tak, każde zatwierdzenie odnosi się do pełnego działającego drzewa. Chociaż w tym przypadku nie robi to różnicy, może pomóc zrozumieć, dlaczego git działa tak, jak działa.
Ten cytat pochodzi z; Kontrola wersji za pomocą Git (Naprawdę świetna książka, zachęcam do jej zakupu, jeśli jesteś zainteresowany Gitem )
Edycja: Ponieważ ta odpowiedź wciąż robi wrażenie, chciałbym dodać bardzo fajny film instruktażowy na ten temat:
Youtube: Wprowadzenie do Git cherry-pick
Korzystanie z git cherry-pick Polecenie git cherry-pick commit stosuje zmiany wprowadzone przez nazwany commit w bieżącej gałęzi. Wprowadzi nowe, wyraźne zatwierdzenie. Ściśle mówiąc, użycie git cherry-pick nie zmienia istniejącej historii w repozytorium; zamiast tego dodaje się do historii. Podobnie jak w przypadku innych operacji Git, które wprowadzają zmiany w procesie stosowania mechanizmu różnicowego, konieczne może być rozwiązanie konfliktu, aby w pełni zastosować zmiany z podanego zatwierdzenia . Polecenie git cherry-pick jest zwykle używane do wprowadzania określonych zatwierdzeń z jednej gałęzi w repozytorium do innej gałęzi. Powszechnym zastosowaniem jest przekazywanie lub cofanie zmian z gałęzi serwisowej do gałęzi programistycznej.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
przed:

po:

Zbieranie wiśni w Git ma na celu zastosowanie zatwierdzenia z jednej gałęzi do innej gałęzi. Można to zrobić, jeśli np. popełnił błąd i popełnił zmianę w niewłaściwej gałęzi, ale nie chce scalać całej gałęzi. Możesz po prostu np. cofnij zatwierdzenie i wybierz go w innej gałęzi.
Aby go użyć, wystarczy git cherry-pick hash, gdzie hashjest hash zatwierdzenia z innej gałęzi.
Pełna procedura znajduje się na stronie: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Krótki przykład sytuacji, w której potrzebujesz cherry pick
Rozważ następujący scenariusz. Masz dwie gałęzie.
a) release1 - Ta gałąź trafia do twojego klienta, ale wciąż jest kilka błędów do naprawienia .
b) master - Klasyczna gałąź master, w której możesz na przykład dodać funkcjonalność dla release2.
TERAZ : Naprawiasz coś w wersji 1 . Oczywiście potrzebujesz tej poprawki również w trybie głównym . I to jest typowy przypadek użycia do zbierania wiśni. Zatem wybór wiśni w tym scenariuszu oznacza, że pobierasz zatwierdzenie z gałęzi release1 i dołączasz ją do gałęzi master .
cherry-pick to funkcja Git. Jeśli ktoś chce zatwierdzić określone zatwierdzenia w jednej gałęzi do gałęzi docelowej, wówczas używana jest funkcja cherry-pick.
kroki git-pick-cherry są jak poniżej.
git cherry-pick <commit id>
Tutaj ID zatwierdzenia jest identyfikatorem aktywności innej gałęzi.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Przygotowałem ilustracje krok po kroku, co robi cherry-pick - oraz animację tych ilustracji (pod koniec).
git cherry-pick feature~2feature~2jest 2 nd popełnić przed feature, czyli popełnić L):

Uwaga:
Zatwierdzenie L'jest z punktu widzenia użytkownika (zatwierdzenie = migawka) dokładną kopią zatwierdzenia L.
Technicznie (wewnętrznie) jest to nowe, inne zatwierdzenie (ponieważ np. LZawiera wskaźnik do K(jako jego rodzic), podczas gdy L'zawiera wskaźnik do E).
Możesz pomyśleć, czy wybór wiśni jest podobny do rebase, czy raczej jest zarządzany jak rebase. Rozumiem przez to, że pobiera istniejące zatwierdzenie i regeneruje je, przyjmując jako punkt wyjścia szef gałęzi, w której aktualnie się znajdujesz.
rebaseTrwa popełnić że miał dominującą X i regeneruje popełnić tak jakby rzeczywiście miała rodzica Y, i to jest dokładnie to, co cherry-pickrobi.
Cherry pick to więcej o tym, jak wybierasz zatwierdzenia. Z pull(rebase), git niejawnie regeneruje lokalne zatwierdzenia na podstawie tego, co zostało ściągnięte do twojej gałęzi, ale wraz z cherry-picktobą wyraźnie wybierasz niektóre zatwierdzenia i domyślnie regenerujesz je (ich) na bieżącym oddziale.
Więc sposób, w jaki to robisz, różni się, ale pod maską są to bardzo podobne operacje - regeneracja zatwierdzeń.
cherry-pickzachowuje się tak, jak później, gdy gałąź docelowa jest później scalana z powrotem w gałąź źródłową. Dziękuję Panu.
To trochę jak Kopiuj (skądś) i Wklej (gdzieś), ale dla określonych zatwierdzeń.
Jeśli chcesz na przykład wykonać poprawkę, możesz skorzystać z tej cherry-pickfunkcji.
Wykonaj swoją pracę cherry-pickw gałęzi deweloperskiej, a następnie mergew gałęzi wydania. Podobnie, wykonaj cherry-pickod gałęzi wydania do opanowania. Voila
Podczas pracy z zespołem programistów nad projektem zarządzanie zmianami między wieloma gałęziami git może stać się złożonym zadaniem. Czasami nie chcesz scalać całej gałęzi w inną i wystarczy wybrać jeden lub dwa konkretne zatwierdzenia. Ten proces nazywa się „zbieraniem wiśni”.
Znalazłem świetny artykuł na temat zbierania wiśni, sprawdź szczegółowe informacje: https://www.previousnext.com.au/blog/intro-cherry-picking-git
Jeśli chcesz połączyć bez identyfikatorów zatwierdzenia, możesz użyć tego polecenia
git cherry-pick master~2 master~0
Powyższe polecenie połączy trzy ostatnie zatwierdzenia master od 1 do 3
Jeśli chcesz to zrobić dla pojedynczego zatwierdzenia, po prostu usuń ostatnią opcję
git cherry-pick master~2
W ten sposób scalisz 3. zatwierdzenie od końca master.
Zastosuje określone zatwierdzenie do twojego obecnego oddziału.
To znaczy :
Np .: Rozważ zatwierdzenie A.
added newFileA
modified main:
+ import './newFileA'
popełnić B
added newFileB
modified main:
+ import './newFileB'
Jeśli wybierzesz zatwierdzenie B w innym oddziale, skończysz z:
/newFileB
/main :
import './newFileA'
import './newFileB'
ponieważ zatwierdzenie B zawiera newFileB i main , ale nie ma newFileA , co powoduje błąd, więc używaj go ostrożnie.
Fragment oficjalnych dokumentów:
Biorąc pod uwagę jeden lub więcej istniejących zatwierdzeń, zastosuj zmianę, którą każdy wprowadza, rejestrując nowe zatwierdzenie dla każdego. To wymaga, aby twoje drzewo robocze było czyste (bez modyfikacji z zatwierdzenia HEAD).
Gdy nie jest oczywiste, jak zastosować zmianę, dzieje się tak:
Bieżąca gałąź i wskaźnik HEAD pozostają na ostatnim zatwierdzeniu, które zostało pomyślnie wykonane.
Referencja CHERRY_PICK_HEAD jest ustawiona tak, aby wskazywała na zatwierdzenie, które wprowadziło trudną do zastosowania zmianę.
Ścieżki, w których zastosowana zmiana została zaktualizowana, zarówno w pliku indeksu, jak iw drzewie roboczym.
W przypadku sprzecznych ścieżek plik indeksu rejestruje maksymalnie trzy wersje, jak opisano w sekcji „PRAWDA MERGE” git-merge. Pliki drzewa roboczego będą zawierać opis konfliktu w nawiasach zwykłych znaczników konfliktu <<<<<<< i >>>>>>>.
Nie wprowadza się żadnych innych modyfikacji.