Jeśli chodzi o zakres zobowiązań, wybieranie jest nie było praktyczne.
Jak wspomniano poniżej przez Keitha Kim , Git 1.7.2+ wprowadził możliwość wybrania szeregu zatwierdzeń (ale wciąż musisz być świadomy konsekwencji wybierania wiśni dla przyszłego scalenia )
git cherry-pick ”nauczył się wybierać zakres zatwierdzeń
(np.„ cherry-pick A..B”i„ cherry-pick --stdin”), podobnie jak„ git revert”, jednak nie obsługują one lepszej kontroli sekwencjonowania„ rebase [-i]”.
Damian komentuje i ostrzega:
W formularzu „ cherry-pick A..B” Apowinien być starszy niżB .
Jeśli są w niewłaściwej kolejności, polecenie po cichu się nie powiedzie .
Jeśli chcesz, aby wybrać zakres Bpoprzez D(włącznie) , że byłoby B^..D.
Zobacz „ Git utworzyć gałąź z zakresu poprzednich zatwierdzeń? ” Jako ilustrację.
Jak wspomina Jubobs w komentarzach :
Zakłada się, że Bnie jest to główny zatwierdzenie; w przeciwnym razie pojawi się unknown revisionbłąd „ ”.
Uwaga: od wersji Git 2.9.x / 2.10 (III kwartał 2016 r.) Możesz wybrać zakres zatwierdzania bezpośrednio w gałęzi sierocej (pusta głowa): patrz „ Jak zmienić istniejącą gałąź w sierotę w git ”.
Oryginalna odpowiedź (styczeń 2010 r.)
rebase --ontoByłoby lepiej, gdzie można odtworzyć dany zakres popełnić na szczycie swojego oddziału integracyjnego, jak Charles Bailey opisane tutaj .
(także poszukaj „Oto jak przeszczepiłbyś gałąź tematu opartą na jednej gałęzi do drugiej” na stronie podręcznika git rebase , aby zobaczyć praktyczny przykład git rebase --onto)
Jeśli obecna gałąź to integracja:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
To odtworzy wszystko między:
- po rodzicu
first_SHA-1_of_working_branch_range(stąd ~1): pierwszego zatwierdzenia, które chcesz odtworzyć
- do „
integration” (co wskazuje na ostatnie zatwierdzenie, które chcesz odtworzyć, z workinggałęzi)
na „ tmp” (który wskazuje, gdzie integrationwcześniej wskazywał)
Jeśli wystąpi konflikt przy odtwarzaniu jednego z tych zatwierdzeń:
- rozwiąż go i uruchom „
git rebase --continue”.
- lub pomiń tę łatkę i zamiast tego uruchom „
git rebase --skip”
- lub anuluj wszystko za pomocą „
git rebase --abort” (i odłóż integrationgałąź na tmpgałąź)
Po tym rebase --onto, integrationbędzie z powrotem na ostatni popełnić oddziału integracyjnego (czyli „ tmp” oddział + wszystkie odtwarzanych zobowiązuje)
Przy zbieraniu wiśni lub rebase --onto, nie zapomnij, ma to konsekwencje dla kolejnych połączeń, jak opisano tutaj .
Omówiono tutaj czyste cherry-pickrozwiązanie , które wymagałoby:
Jeśli chcesz zastosować podejście oparte na łatce, wybierz „git format-patch | git am” i „git cherry”.
Obecnie git cherry-pickprzyjmuje tylko jeden commit, ale jeśli chcesz, aby wybrać zakres Bpoprzez Dktóry byłby B^..Dw git żargon, więc
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Ale w każdym razie, kiedy trzeba „odtworzyć” zakres zatwierdzeń, słowo „powtórz” powinno zachęcić cię do korzystania z funkcji „ rebase” Git.