Sytuacja:
- mistrz jest na X
- quickfix1 jest w X + 2 zatwierdza
Tak, że:
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
Potem zacząłem pracować nad Quickfix2, ale przez przypadek wziąłem Quickfix1 jako gałąź źródłową do skopiowania, a nie master. Teraz Quickfix2 jest na X + 2 zatwierdzeń + 2 odpowiednie zatwierdzenia.
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
\
q2a--q2b (quickfix2 HEAD)
Teraz chcę mieć gałąź z Quickfix2, ale bez 2 zatwierdzeń, które należą do Quickfix1.
q2a'--q2b' (quickfix2 HEAD)
/
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
Próbowałem utworzyć łatkę z pewnej wersji w Quickfix2, ale łatka nie zachowuje historii zmian. Czy istnieje sposób, aby zapisać moją historię zatwierdzeń, ale mieć gałąź bez zmian w Quickfix1?
quickfix1
. (Zwróć też uwagę na różnicę w odpowiedziach).Odpowiedzi:
Jest to klasyczny przypadek
rebase --onto
:Więc powinieneś odejść
do:
Najlepiej zrobić to na czysto działającym drzewie.
Zobacz
git config --global rebase.autostash true
, szczególnie po Git 2.10 .źródło
q2a
naX
i wybierz rebase 2 rewizje z opcji w oknie dialogowym występującego.git rebase --onto
.rebase.autostash
konfiguracji: pozwoli to uniknąć utraty pracy w drzewie roboczym podczas wykonywania zmiany bazy.Możesz użyć,
git cherry-pick
aby wybrać zatwierdzenie, które chcesz skopiować.Prawdopodobnie najlepszym sposobem jest utworzenie gałęzi z poziomu głównego, a następnie użycie w tej gałęzi
git cherry-pick
dwóch zatwierdzeń z Quickfix2, które chcesz.źródło
Najprostszą rzeczą, jaką możesz zrobić, jest wybór zakresu. Robi to samo,
rebase --onto
ale jest łatwiejszy dla oczu :)źródło
rebase --onto
też zachowuje oryginalne zmiany?rebase
icherry-pick
dają ci nowe klucze SHA. To dlatego, że każde zatwierdzenie jest unikalną migawką repozytorium.cherry-pick
osiągnąć zakres jak w tej odpowiedzi i to pomieszało moje repo. Musiałem robić indywidualnecherry-pick
dla każdego zatwierdzenia. (I być może jest to oczywiste, ale na wypadek, gdyby ktoś walczył, musiszcherry-pick
w porządku chronologicznym, aby twoje zobowiązania zostały zastosowane.)git checkout
ma tutaj kluczowe znaczenie. jaka jest twoja GŁOWA :)?Wierzę, że to:
źródło
cherry-pick
działa z hashami zatwierdzania, więc jeśli chcesz po prostu pobrać gdzieś zatwierdzenie i umieścić go gdzie indziej, jest to właściwa droga. Tylko upewnij się, że wykonujeszcheckout <branch>
najpierw prawidłową gałąź.Inne bardziej przydatne polecenia tutaj z wyjaśnieniem: Git Guide
źródło