Mam dwie gałęzie. Popełnić a
jest szef jednego, a druga ma b
, c
, d
, e
i f
na górze a
. Chcę przenieść c
, d
, e
a f
do pierwszego oddziału bez popełnienia b
. Korzystanie wiśnia odebrać to jest proste: Zamówienie pierwszy oddział cherry-pick jeden po drugim c
do f
i rebase drugą gałąź na początku. Ale czy jest jakiś sposób, aby wybrać wszystko c
- f
jednym poleceniem?
Oto wizualny opis scenariusza (dzięki JJD ):
b
oprzeć sięf
później, ale to nie ma nic wspólnego z wybieraniem czereśni).Odpowiedzi:
Git 1.7.2 wprowadził możliwość wybrania szeregu zatwierdzeń. Z informacji o wersji :
Aby wybrać wszystkie zatwierdzenia od zatwierdzenia
A
do zatwierdzeniaB
(gdzieA
jest starsze niżB
), uruchom:Jeśli chcesz zignorować samą A, uruchom:
(Podziękowania w komentarzach dla Damiana, JB Rainsbergera i sschaefa)
źródło
git cherry-pick A^..B
git cherry-pick f~3
następniegit cherry-pick f~2
itd. Aż dogit cherry-pick f
(naciśnięcie strzałki w górę powoduje pobranie poprzedniego polecenia, dzięki czemu mogę szybko zmienić numer i uruchomić powinien być podobny w większości konsol).git cherry-pick master..somebranch
wybierze wszystkie zatwierdzenia w somebranch od czasu master (zakładając, że jest już oparte na master) i zastosuje je do twojej aktualnej gałęzi.Najprostszym sposobem na to jest
onto
opcjarebase
. Załóżmy, że oddział, który kończy się w bieżącea
nazywa mybranch i jest to oddział, który chcesz przenieśćc
-f
na.źródło
git checkout secondbranch && git rebase mybranch
pełną odpowiedźrebase
trybu interaktywnego. Dzięki, @Charles!--interactive
do usunięcia niektórych zatwierdzeń z sekwencji lub zmiany ich kolejności przed „wybraniem czereśni”. +1b
w tym przykładzie), ale tak, to zadziałało dla mnie.Lub żądany liniowiec:
źródło
Możesz użyć szeregowej kombinacji
git rebase
i,git branch
aby zastosować grupę zatwierdzeń do innego oddziału. Jak już napisano przez wolfc, pierwsze polecenie faktycznie kopiuje zatwierdzenia. Jednak zmiana nie jest widoczna, dopóki nie dodasz nazwy gałęzi do najwyższego zatwierdzenia grupy.Otwórz zdjęcie w nowej karcie ...
Aby podsumować polecenia w formie tekstowej:
gitk --all &
.git rebase --onto a b f
.HEAD
jest zaznaczone.git branch selection
To powinno wyjaśnić rzeczy:
a
jest nowym miejscem docelowym grupy.b
to zatwierdzenie przed pierwszym zatwierdzeniem w grupie (wyłączne).f
jest ostatnim zatwierdzeniem grupy (włącznie).Następnie można użyć
git checkout feature && git reset --hard b
do usunięcia zatwierdzeńc
dof
zfeature
oddziału.Oprócz tej odpowiedzi napisałem post na blogu, który opisuje polecenia w innym scenariuszu, które powinny pomóc w ogólnym użyciu.
źródło
git rebase --onto a b mybranch
i btw - do jakiego programu te fajne zdjęcia git?Aby zastosować komentarze JB Rainsbergera i sschaefa, aby udzielić konkretnej odpowiedzi na pytanie ... Aby użyć zakresu wybierania wiśni w tym przykładzie:
lub
źródło
git 2.7.0.windows.1
i zauważyłem, że kiedy próbuję wybrać zakres zatwierdzeń z wiśniowego wyboru, wszystko jest w porządku, ale git nie mówi ci nigdzie, co musisz zrobić,git cherry-pick --continue | --abort | --quit
zanim spróbujesz ponownie zatwierdzić / cherry-pick. Jeśli więc wybierzesz zakres zatwierdzeń, będziesz musiał uruchamiać się zagit cherry-pick --continue
każdym razem, gdy będziesz gotowy (rozwiązywać konflikty itp.) Z zatwierdzeniem z danego zakresu.^
Po c rzeczywiście oznacza „popełnienia przed c”, który jest w tym przypadku b. Dlategoc^..f
jest synonimemb..f
. Spróbuj zrobićgit log c^..f
i powinieneś zobaczyć zatwierdzenia od c do f, dokładnie tak, jakbyś to zrobiłgit log b..f
Jeśli masz wybiórcze wersje do scalenia, powiedz A, C, F, J z A, B, C, D, E, F, G, H, I, J zatwierdza, po prostu użyj poniższego polecenia:
źródło
źródło
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
Aby wybrać Cherry od identyfikatora zatwierdzenia do końca gałęzi, możesz użyć:
git cherry-pick commit_id^..branch_name
źródło
Innym wariantem wartym wspomnienia jest to, że jeśli chcesz ostatnich
n
zatwierdzeń z gałęzi,~
składnia może być przydatna:W takim przypadku powyższe polecenie wybrałoby 4 ostatnie zatwierdzenia z gałęzi o nazwie
some-branch
(chociaż można również użyć skrótu zatwierdzenia zamiast nazwy gałęzi)źródło
W rzeczywistości najprostszym sposobem na to może być:
MERGE_BASE=$(git merge-base branch-a branch-b)
przekształć wynikową gałąź w siebie, zaczynając od podstawy scalania od kroku 1 i ręcznie usuń niepotrzebne zatwierdzenia:
Alternatywnie, jeśli jest tylko kilka nowych zatwierdzeń, pomiń krok 1 i po prostu użyj
w pierwszym kroku, używając wystarczającej ilości,
^
aby przejść obok bazy scalania.Zobaczysz coś takiego w interaktywnej bazie danych:
Następnie usuń wiersze b (i dowolne inne)
źródło
źródło
Oto skrypt, który pozwoli ci wybrać wiele zatwierdzeń z rzędu, po prostu mówiąc skryptowi, które źródła i gałęzie docelowe dla wyborów cherry i liczbę zatwierdzeń:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
Aby wybrać z gałęzi do mistrza (używa bieżącej gałęzi jako źródła):
Aby wybrać 5 ostatnich zatwierdzeń z oddziału 6.19.x do opanowania:
źródło