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”.


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ę.


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.


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)


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.