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
” A
powinien 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 B
poprzez 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 B
nie jest to główny zatwierdzenie; w przeciwnym razie pojawi się unknown revision
błą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 --onto
Był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 working
gałęzi)
na „ tmp
” (który wskazuje, gdzie integration
wcześ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łóż integration
gałąź na tmp
gałąź)
Po tym rebase --onto
, integration
bę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-pick
rozwią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-pick
przyjmuje tylko jeden commit, ale jeśli chcesz, aby wybrać zakres B
poprzez D
który byłby B^..D
w 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.