Was ist der Unterschied zwischen Git Switch und Git Checkout?

143

Git 2.23 führt einen neuen Befehl ein git switch- nach dem Lesen der Dokumente scheint es so ziemlich dasselbe zu sein, wie git checkout <branchname>kann jemand den Unterschied oder den Anwendungsfall erklären?

Zwei neue Befehle "git switch" und "git restore" werden eingeführt, um "Auschecken eines Zweigs zum Fortschreiten seines Verlaufs" und "Auschecken von Pfaden aus dem Index und / oder eines Baums zum Vorrücken des Stroms" aufzuteilen history "out of the single" git checkout "Befehl.

Bastian Venthur
quelle
2
Es gibt einen guten Artikel bei InfoQ zu diesem Thema: infoq.com/news/2019/08/git-2-23-switch-restore
rsenna

Antworten:

156

Nun, gemäß der Dokumentation, auf die Sie verlinken, besteht der einzige Zweck darin, die zwei verschiedenen Verwendungszwecke von git checkout:

  • git switchkann jetzt verwendet werden, um Zweige zu ändern, wie es git checkout <branchname>tut
  • git restorekann verwendet werden, um Dateien auf bestimmte Revisionen zurückzusetzen, ebenso wie dies der git checkout --<path_to_file>Fall ist

Die Menschen sind durch diese unterschiedlichen Verwendungsmöglichkeiten verwirrt git checkout, wie Sie aus den vielen Fragen git checkoutzu Stackoverflow hier ersehen können. Git-Entwickler scheinen dies berücksichtigt zu haben.

kowsky
quelle
29
Dies scheint eine gute Veränderung zu sein. Einen Zweig machen? git checkoutZweig wechseln? git checkoutEine bestimmte Version einer Datei erhalten? git checkoutÄnderungen an einer Datei entfernen? git checkoutEhrlich gesagt frage ich mich, wie viel vom normalen Git-Workflow mit verschiedenen Flags erledigt werden könnte git checkout.
Captain Man
4
Ist die Idee jetzt also git checkouttechnisch für nichts mehr nötig? Oder wird es noch für bestimmte Dinge verwendet, z. B. zum Auschecken eines Commits, bei dem es sich nicht um einen Verzweigungskopf handelt (Wechseln in den Modus "Abgelöster Kopf")?
PieterNuyts
3
@CaptainMan, das Erstellen eines neuen Zweigs ist erledigt git branch. Das schafft jedoch nur den Zweig und wechselt nicht zu ihm (eine weitere besondere Entwurfsentscheidung). Wenn Sie in der neuen Niederlassung weiterarbeiten möchten, müssen Sie sich darauf einlassen checkout. Es gibt die Option, checkout -b <branch name>die eine Verknüpfung für git branch+ ist git checkout. Die checkoutOperation erstellt jedoch technisch gesehen keinen neuen Zweig.
Mike
4
@Mike Wie kannst du sagen, dass Checkout keine Zweige macht, nachdem du sagst, dass Checkout Zweige macht? Es spielt keine Rolle, wie die -bFlagge intern funktioniert . Es macht immer noch einen Zweig.
Captain Man
4
@CaptainMan, die checkout Operation erstellt keinen Zweig, sondern kann nur in einen bereits vorhandenen Zweig wechseln. Die -bOption für den checkout Befehl führt intern ein aus, git branchbevor das Auschecken tatsächlich durchgeführt wird. Dies ist das gleiche wie git pulleine Verknüpfung für git fetch+ git merge.
Mike
65

git checkout ist ein bisschen wie ein Schweizer Taschenmesser, das mehrere nicht verwandte Verwendungszwecke hat.

Wenn Sie eine Datei ändern, die Änderung jedoch nicht bereitgestellt haben, git checkout <filename>werden die Änderungen rückgängig gemacht. Dies ist eine schnelle und einfache Möglichkeit, Änderungen an einer Datei abzubrechen. Sie bleiben in derselben Branche.

git checkout <branchname> (wie Sie bemerkt haben) wechselt die Zweige.

Zwei völlig unterschiedliche Zwecke, die zu Verwirrung führen können, wenn ein Dateiname und ein Zweigname ähnlich sind.

Es ist klarer, es als zwei Befehle zu haben.

SteveTurczyn
quelle
Wie Sie bereits erwähnt haben, ist es verwirrend, einen Zweig und eine Datei mit demselben Namen zu haben. Ich gehe davon aus, dass der Zweig Vorrang vor der Datei hat, da dies oft wünschenswerter wäre. Oder wie geht das?
AgentM
@AgentM Ja, das ist richtig. Wenn ein Zweig und eine Datei denselben Namen haben git checkout <name>, wird der Zweig anstelle der Datei bevorzugt.
Kartik Soneji
2

switchhat einige Einschränkungen: Im Moment wechseln kann von jeder verpflichten <branch name>, aber es ist unmöglich, Schalter aus <branch name> , um eine bestimmte mit dem Status begehen abgelöst HEAD . Sie müssen also verwenden git checkout 5efb(wobei 5efb ein Beispiel für einen Hash-Verweis auf ein beliebiges Commit ist).

Kanake
quelle
3
Ich würde argumentieren, dass dies akut eine Funktion und kein Fehler ist (Einschränkung). switchwird nur zum Ändern von Zweigen erstellt. Wenn Sie dies tun, möchten Sie sich am KOPF dieses Zweigs befinden. checkoutist eine allgemeinere Operation, die Ihre Arbeitskopie mit einem bestimmten Status in der Historie in Einklang bringt (= Festschreiben). Da jeder Filialname ein Alias ​​für das HEAD-Commit dieses Zweigs ist, unterscheidet sich das Auschecken eines Zweigs technisch nicht vom Auschecken eines anderen Commits.
Mike
11
mit können -dSie:git switch -d 6c13
Mendi Barel