Jaka jest różnica między git switch a git checkout <branch>

166

Git 2.23 wprowadza nowe polecenie git switch- po przeczytaniu dokumentacji wydaje się być prawie takie samo, jak git checkout <branchname>ktoś może wyjaśnić różnicę lub przypadek użycia?

Wprowadzono dwa nowe polecenia „git switch” i „git restore” w celu rozdzielenia „sprawdzania gałęzi, aby pracować nad rozwojem jej historii” i „sprawdzania ścieżek poza indeksem i / lub drzewem, aby pracować nad przyspieszeniem bieżącej history z jednego polecenia „git checkout”.

Bastian Venthur
źródło
2
W InfoQ jest dobry artykuł na ten temat: infoq.com/news/2019/08/git-2-23-switch-restore
rsenna

Odpowiedzi:

180

Cóż, zgodnie z dokumentacją, do której odsyłasz, jej jedynym celem jest podzielenie i wyjaśnienie dwóch różnych zastosowań git checkout:

  • git switchmoże teraz służyć do zmiany gałęzi, podobnie git checkout <branchname>jak
  • git restoremoże służyć do resetowania plików do pewnych wersji, podobnie git checkout --<path_to_file>jak

Ludzie są zdezorientowani tymi różnymi sposobami korzystania git checkout, jak widać na podstawie wielu pytań dotyczących git checkouttutaj w Stackoverflow. Wydaje się, że deweloperzy Git wzięli to pod uwagę.

kowsky
źródło
32
Wydaje się, że to dobra zmiana. Zrobić gałąź? git checkoutPrzełączyć gałąź? git checkoutPobrać określoną wersję pliku? git checkoutUsunąć zmiany w jednym pliku? git checkoutSzczerze mówiąc, zastanawiam się, ile normalnego przepływu pracy gita można wykonać z różnymi flagami git checkout.
Kapitan Man
5
Czy więc pomysł, który z git checkouttechnicznego punktu widzenia nie jest już potrzebny? A może nadal jest używany do pewnych rzeczy, takich jak sprawdzanie zatwierdzenia, który nie jest odgałęzieniem (przejście do trybu „odłączonej głowy”)?
PieterNuyts
5
@Mike Jak możesz powiedzieć, że płatność nie tworzy gałęzi w jednym zdaniu po tym, jak powiesz, że płatność tworzy gałęzie? Nie ma znaczenia wewnętrzne działanie -bflagi. Nadal tworzy gałąź.
Kapitan Man,
5
@CaptainMan, checkout operacja nie tworzy gałęzi, może jedynie przełączyć się do już istniejącej gałęzi. -bOpcja do checkout polecenia wewnętrznie wykonuje git branchzanim faktycznie robi kasę. To jest to samo, co git pulljest skrótem do git fetch+ git merge.
Mike
7
Pomocna uwaga: dla tych, którzy przywykli git checkout -b <branch name>, możesz użyć, git switch -c <branch name>aby uzyskać ten sam efekt
Xeuron
73

git checkout jest trochę szwajcarskim scyzorykiem, który ma kilka niepowiązanych zastosowań.

Jeśli zmodyfikujesz plik, ale nie wprowadzisz zmiany do poczekalni, to git checkout <filename>odwrócisz modyfikacje ... szybki i łatwy sposób na anulowanie zmian w pliku. Pozostajesz w tej samej branży.

git checkout <branchname> (jak zauważyłeś) przełącza gałęzie.

Dwa zupełnie różne cele, które mogą prowadzić do nieporozumień, jeśli nazwa pliku i nazwa gałęzi są podobne.

Posiadanie tego jako dwóch poleceń jest jaśniejsze.

SteveTurczyn
źródło
Jak wspomniałeś, posiadanie gałęzi i pliku o tej samej nazwie jest mylące. Zakładam, że gałąź ma pierwszeństwo przed plikiem, ponieważ często byłoby to bardziej pożądane? Albo jak to działa?
AgentM
@AgentM Tak, zgadza się. Jeśli gałąź i plik mają tę samą nazwę, to git checkout <name>daje pierwszeństwo gałęzi zamiast pliku.
Kartik Soneji
3

switchma pewne ograniczenia: w tej chwili możesz przełączyć się z dowolnego zatwierdzenia na <branch name>, jednak niemożliwe jest przełączenie się z <branch name> konkretnego zatwierdzenia ze statusem odłączonego HEAD . Musisz więc użyć git checkout 5efb(gdzie 5efb jest przykładem skrótu odniesienia do dowolnego zatwierdzenia)

mieszaniec
źródło
3
Twierdzę, że jest to w rzeczywistości funkcja, a nie błąd (ograniczenie). switchjest tworzony wyłącznie w celu zmiany gałęzi, a kiedy to robisz, chcesz być na czele tej gałęzi. checkoutjest bardziej ogólną operacją, która dostosowuje twoją kopię roboczą do dowolnego stanu w historii (= zatwierdzenie). Ponieważ każda nazwa gałęzi jest aliasem dla zatwierdzenia HEAD tej gałęzi, sprawdzenie gałęzi nie różni się technicznie od sprawdzenia dowolnego innego zatwierdzenia.
Mike
16
z -dtobą możesz:git switch -d 6c13
Mendi Barel