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 merge
i rebase
któ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 hash
jest 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~2
feature~2
jest 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. L
Zawiera 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.
rebase
Trwa 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-pick
robi.
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-pick
tobą 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-pick
zachowuje 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-pick
funkcji.
Wykonaj swoją pracę cherry-pick
w gałęzi deweloperskiej, a następnie merge
w gałęzi wydania. Podobnie, wykonaj cherry-pick
od 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.