Odkąd git cherry-picknauczyliś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 rebaseZadaniem 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-picksł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 mergenie ma sensu, ponieważ przyniosłaby całą masę niechcianych zmian.
Od pierwszego pojawienia się, git cherry-pickbył 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-pickzwykle przenosi zatwierdzenie z innego miejsca i stosuje je na bieżącej gałęzi, nagrywając nowe zatwierdzenie, podczas gdy git rebasebierze 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 rebasemożna zrobić, ale jest celowe, aby spróbować zagłębić się w ogólny pomysł.
Zaktualizuj, aby dokładniej wyjaśnić przykład git rebaseomawianego 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 rebasemówi się, aby zmienić bazę „eksperymentu” na aktualną końcówkę „mistrza” i git rebasewygląda tak:
- Uruchamia,
git merge-baseaby 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 rebasetutaj włączono pewne zatwierdzenia z „mastera” i jest to absolutnie poprawne.