Was bedeuten Git Checkout wirklich?

91

Was sind checkouts in git?

Ich weiß, sobald Sie checkouteinen bestimmten Zweig bearbeiten, die HEADPunkte auf diesen Zweig. Aber was bedeutet das wirklich? Bedeutet das, dass ich dann an diesem Zweig arbeiten kann? Wenn ja, kann ich ohne Auschecken einer Filiale nicht daran arbeiten?

Was bedeutet remote checkoutdas auch? Wie ist es nützlich?

daehaai
quelle
1
Keine genommen. Ja, ich habe und ich stoße auf die Theorie, was es bedeutet. dh auf HEAD usw. zeigen. Aber ich möchte aus der Sicht "Checkout-Code - Änderungen vornehmen - Einchecken" wissen, oder ist es anders?
Daehaai
23
@antonijn - Ich habe versucht, die Frage zu googeln - dies ist das erste Ergebnis - irgendwie traurig, dass ich, als ich hier ankam, sah, dass die Frage geschlossen war und diese verrückte Einstellung jeder hat - ich komme aus dem TFS-Hintergrund und ich Ich fange an zu vermuten, dass "Checkout" etwas völlig anderes in GIT bedeutet. Ich will wissen , was es bedeutet , in git-Land.
BrainSlugs83

Antworten:

56

Wie Sie bemerkt haben, HEADist eine Beschriftung angegeben, wo Sie sich im Festschreibungsbaum befinden. Es bewegt sich mit Ihnen, wenn Sie von einem Commit zum anderen wechseln. git checkout <commit>ist der grundlegende Mechanismus, um sich im Festschreibungsbaum zu bewegen und Ihren Fokus ( HEAD) auf das angegebene Festschreiben zu verschieben.

Die begehen kann durch eine beliebige einer Anzahl von Arten angegeben werden, commit hash, Zweigname, Tag - Namen, um die relative Syntax ( HEAD^, HEAD~1, etc.) und so weiter. Es ist oft nützlich, eine Kasse als Zweigwechsel zu betrachten, und es gibt einige Optionen, die aus dieser Perspektive funktionieren, aber alle verweisen auf Commits.

Das Auschecken eines Commits hat andere Nebenwirkungen als das Bewegen HEAD.

  • Das Arbeitsverzeichnis wird auf den Status des ausgecheckten Commits aktualisiert.
  • Wenn ein Zweigstellenname angegeben ist, wird dieser Zweig durch Auschecken aktiviert. Der aktive Zweig wird zusammen mit allen neu hinzugefügten Commits verschoben.
    • Mit der -bOption wird ein neuer Zweig basierend auf dem aktuellen Commit erstellt und dann aktiviert.
    • Mit der --trackOption kann der ausgecheckte Zweig auf einen entfernten Zweig aufmerksam gemacht werden
    • Mit der --orphanOption wird ein neuer Zweig erstellt (wie mit -b), der jedoch nicht auf einem vorhandenen Commit basiert.

Es gibt noch ein paar weitere Optionen, über die Sie in der Manpage zum Auschecken von Git lesen können. Alle Optionen drehen sich um das Wechseln von einem Commit zum anderen - nur in der Auswirkung, die dieser Zug zusätzlich zum Verschieben hat HEAD.

David Culp
quelle
Es hört sich also so an, als ob "Auschecken" etwas völlig anderes bedeutet (im Vergleich zu TFS sowieso - das TFS-Äquivalent wäre "Erhalten" eines bestimmten "Änderungssatzes"). Ich bin froh, dass ich das nachgeschlagen habe! - Gibt es eine magische Konstante für "Neueste"? (in TFS ist es "T") - auf diese Weise können wir einfach die neueste Version des Codes herunterladen, ohne das "HEAD" -Label zu kennen?
BrainSlugs83
1
Wenn Sie sich in einem Zweig befinden, ist der Filialname das letzte Commit für diesen Zweig. Wenn Sie sich nicht in einem Zweig befinden, befinden Sie sich im letzten Commit. Ich würde den Befehl log verwenden, um das letzte Commit im Repository ohne Rücksicht auf die Verzweigung zu finden und dann manuell dorthin zu wechseln - aber ich bin sicher, dass es bei Bedarf automatisiert werden kann.
David Culp
Zum letzten Absatz: Bitte beachten Sie, dass git checkout <commit> <path>keine Zweige gewechselt werden.
Galath
Ihre Erklärung ist nicht falsch, aber Sie haben einen sehr wichtigen (und möglicherweise gefährlichen) Anwendungsfall vergessen : git checkout <path>.
Eric Duminil
23

Lassen Sie mich einige Anwendungsfälle des Auscheckens mit Dateien, Ordnern und Zweigen erläutern, damit dies zum Verständnis hilfreich sein kann.

Nehmen wir an, wir haben einen Ordner mit dem Namen devund index.htmlalles wird verfolgt und das Arbeitsverzeichnis ist sauber.

Wenn ich versehentlich den Dateinamen ändere index.htmlund rückgängig machen möchte, dass ich ihn einfach verwende git checkout index.html, wird dieser Dateistatus aus dem aktuell ausgewählten Repository-Zweig wiederhergestellt.

Nun, wenn ich etwas im devOrdner geändert habe und das wiederherstellen möchte. Ich kann verwenden, git checkout devaber was ist, wenn es bereits einen Zweig mit dem Namen gibt, devanstatt diesen Ordner auszuchecken, wird dieser Zweig heruntergezogen. Um das zu vermeiden, würde ich es lieber tun git checkout -- dev.

Hier steht Bare Double Dash für den aktuellen Zweig und fragt Git nach dem Ordner devdes aktuell ausgewählten Zweigs.

Wenn ich das tue git checkout alpha dev, wird der Dev-Ordner vom Alpha-Zweig heruntergezogen.

Diese Antwort ist für Ihre erste Frage "Git Checkout wirklich bedeuten".

bawa g
quelle
2
In Ihrer letzten Zeile Diese Antwort ist für Ihre erste Frage "Git Checkout wirklich bedeuten".
Checken
22

"Auschecken" bedeutet, dass Sie ein bestimmtes Commit aus dem Repository übernehmen und den Status der zugehörigen Datei und des Verzeichnisbaums im Arbeitsverzeichnis neu erstellen.

Wenn Sie ein Commit auschecken, das kein Verzweigungskopf ist (z. B. git checkout HEAD~2), befinden Sie sich auf einem sogenannten abgetrennten Kopf. Sie können hier Commits erstellen. Sobald Sie jedoch zu einem anderen Zweig wechseln, können diese Commits nicht über einen Filialnamen wiederhergestellt werden und werden möglicherweise nach einiger Zeit sogar vom Garbage Collector entfernt.

Michael Wild
quelle