Jak scalić określone zatwierdzenie z jednej gałęzi do innej w Git?

159

Mam przed sobą BranchA113 zatwierdzeń BranchB.

Ale chcę, aby tylko ostatnie 10 zatwierdzeń zostało BranchAscalonych z BranchB.

Czy jest na to sposób?

NullVoxPopuli
źródło
6
możliwy duplikat How to merge a specific commit in git
chharvey

Odpowiedzi:

233

git cherry-pick <commit>Komenda pozwala wziąć jeden commit (niezależnie od branży) i zasadniczo zmieniają bazę go w swoim oddziale roboczej.

Rozdział 5 książki Pro Git wyjaśnia to lepiej niż ja , wraz z diagramami i tym podobne. ( Rozdział o Rebasing jest również dobrą lekturą).

Na koniec jest kilka dobrych komentarzy na temat wybierania wiśniowego vs łączenia vs ponownego bazowania w innym pytaniu SO .

ewall
źródło
1
Pytanie: słownie commit Ajest rozgałęziony off masteri popracować na nim, tworząc zobowiązuje potomnych Bprzez E. Powiedz, Eże dodano tylko 1 linię z D. Jeśli git cherry-pick Esię master, to zastosować wszystkie zmiany z Apośrednictwem Ew masterbranży, czy też tylko zastosować zmianę od Dcelu E, a mianowicie, że to dodaje tylko 1 wiersz master? Jeśli jest to pierwsza sprawa, jak mogę osiągnąć drugą? (oprócz ręcznego kopiowania i wklejania)
chharvey
7
git cherry-pick -n <commit> Jeśli nie chcesz automatycznie zatwierdzać cherry-pick.
Ben Flynn
6

Jeśli BranchA nie został wypchnięty do zdalnego, możesz zmienić kolejność zatwierdzeń za pomocą, rebasea następnie po prostu merge. Lepiej jest używać mergeover, rebasegdy jest to możliwe, ponieważ nie tworzy duplikatów zatwierdzeń.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
Seth Reno
źródło
2

ŹRÓDŁO: https://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

Innym sposobem na przeniesienie wprowadzonej pracy z jednej gałęzi do drugiej jest jej wybranie. Najlepszy wybór w Git jest jak rebase dla pojedynczego zatwierdzenia. Pobiera łatkę wprowadzoną w zatwierdzeniu i próbuje ponownie zastosować ją w gałęzi, z której aktualnie korzystasz. Jest to przydatne, jeśli masz kilka zatwierdzeń w gałęzi tematycznej i chcesz zintegrować tylko jedną z nich, lub jeśli masz tylko jedną zmianę w gałęzi tematycznej i wolisz ją wybrać, zamiast uruchamiać rebase. Na przykład załóżmy, że masz projekt, który wygląda następująco:

wprowadź opis obrazu tutaj

Jeśli chcesz pobrać commit e43a6 do swojej gałęzi master, możesz uruchomić

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

To pociąga za sobą tę samą zmianę wprowadzoną w e43a6, ale otrzymujesz nową wartość SHA-1 zatwierdzenia, ponieważ zastosowana data jest inna. Teraz twoja historia wygląda tak:

wprowadź opis obrazu tutaj

Teraz możesz usunąć gałąź tematyczną i porzucić zmiany, których nie chcesz pobierać.

artamonovdev
źródło