Odkąd git cherry-pick
nauczyliśmy się stosować wiele zatwierdzeń, to rozróżnienie rzeczywiście stało się nieco dyskusyjne, ale jest to coś, co można nazwać ewolucją zbieżną ;-)
Prawdziwa różnica polega na pierwotnym zamiarze stworzenia obu narzędzi:
git rebase
Zadaniem jest przekierowanie serii zmian, które programista ma w swoim prywatnym repozytorium, utworzonych dla wersji X jakiejś gałęzi nadrzędnej, do wersji Y tej samej gałęzi (Y> X). To skutecznie zmienia podstawę tej serii zatwierdzeń, stąd „ponowne podstawy”.
(Pozwala również programistom na przeszczepienie serii zatwierdzeń do dowolnego arbitralnego zatwierdzenia, ale ma to mniej oczywiste zastosowanie).
git cherry-pick
służy przeniesieniu interesującego zatwierdzenia z jednej linii rozwoju do drugiej. Klasycznym przykładem jest przeniesienie poprawki bezpieczeństwa dokonanej na niestabilnej gałęzi programistycznej do gałęzi stabilnej (konserwacyjnej), gdzie merge
nie ma sensu, ponieważ przyniosłaby całą masę niechcianych zmian.
Od pierwszego pojawienia się, git cherry-pick
był w stanie wybrać kilka zatwierdzeń naraz, jeden po drugim.
Dlatego prawdopodobnie najbardziej uderzającą różnicą między tymi dwoma poleceniami jest sposób, w jaki traktują gałąź, na której pracują: git cherry-pick
zwykle przenosi zatwierdzenie z innego miejsca i stosuje je na bieżącej gałęzi, nagrywając nowe zatwierdzenie, podczas gdy git rebase
bierze bieżącą gałąź i przepisuje seria własnych wskazówek zatwierdza się w taki czy inny sposób. Tak, jest to mocno głupi opis tego, co git rebase
można zrobić, ale jest celowe, aby spróbować zagłębić się w ogólny pomysł.
Zaktualizuj, aby dokładniej wyjaśnić przykład git rebase
omawianego użycia .
W tej sytuacji
Księga stwierdza:
Jest jednak inny sposób: możesz wziąć poprawkę zmiany, która została wprowadzona w C3 i ponownie zastosować ją na C4. W Git nazywa się to rebasingiem. Za pomocą polecenia rebase możesz wziąć wszystkie zmiany, które zostały zatwierdzone w jednej gałęzi i zastosować je w innej.
W tym przykładzie uruchomisz następujące polecenie:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
W tym przykładzie „haczyk” polega na tym, że w tym przykładzie gałąź „eksperymentu” (temat do zmiany bazy) została pierwotnie oddzielona od gałęzi „nadrzędnej”, a zatem dzieli z nią zatwierdzenia od C0 do C2 - w rzeczywistości „eksperyment” to master ”aż do C2 włącznie, plus zatwierdzenie C3. (To najprostszy możliwy przypadek; oczywiście „eksperyment” może zawierać kilkadziesiąt zatwierdzeń na podstawie oryginalnej bazy).
Teraz git rebase
mówi się, aby zmienić bazę „eksperymentu” na aktualną końcówkę „mistrza” i git rebase
wygląda tak:
- Uruchamia,
git merge-base
aby zobaczyć, jakie jest ostatnie zatwierdzenie wspólne zarówno dla „eksperymentu”, jak i dla „mistrza” (innymi słowy, jaki jest cel przekierowania). To jest C2.
- Oszczędza wszystkie zatwierdzenia dokonane od momentu przekierowania; w naszym przykładzie z zabawką jest to po prostu C3.
- Przewija HEAD (co wskazuje na końcówkę zatwierdzenia „eksperymentu” przed rozpoczęciem operacji), aby wskazać końcówkę „master” - ponownie bazujemy na niej.
- Próbuje zastosować po kolei każdy z zapisanych zatwierdzeń (jak gdyby
git apply
). W naszym przykładzie z zabawką to tylko jedno zatwierdzenie, C3. Powiedzmy, że jego aplikacja wygeneruje zatwierdzenie C3 '.
- Jeśli wszystko poszło dobrze, odniesienie do „eksperymentu” jest aktualizowane tak, aby wskazywało na zatwierdzenie wynikające z zastosowania ostatniego zapisanego zatwierdzenia (w naszym przypadku C3 ').
Wróćmy teraz do twojego pytania. Jak widać, technicznie rzecz biorąc, git rebase
przeszczepia tutaj serię zatwierdzeń od „eksperymentu” do końcówki „mistrza”, więc można słusznie stwierdzić, że w tym procesie rzeczywiście istnieje „inna gałąź”. Ale sedno jest takie, że zatwierdzenie wskazówki z „eksperymentu” okazało się nowym zatwierdzeniem wskazówki w „eksperymencie”, po prostu zmieniło swoją podstawę:
Ponownie, technicznie można powiedzieć, że git rebase
tutaj włączono pewne zatwierdzenia z „mastera” i jest to absolutnie poprawne.