Kontext: Ich arbeite am Master und füge eine einfache Funktion hinzu. Nach ein paar Minuten merke ich, dass es nicht so einfach war und es hätte besser sein sollen, in einer neuen Niederlassung zu arbeiten.
Das passiert mir immer und ich habe keine Ahnung, wie ich zu einem anderen Zweig wechseln und all diese nicht festgeschriebenen Änderungen mitnehmen soll, wenn ich den Hauptzweig sauber lasse. Ich hätte git stash && git stash branch new_branch
das einfach erreichen wollen, aber das bekomme ich:
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ echo "hello!" > testing
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)
~/test $ git s
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git checkout master
M testing
Switched to branch 'master'
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Wissen Sie, ob es eine Möglichkeit gibt, dies zu erreichen?
Antworten:
Keine Notwendigkeit zu verstauen.
berührt Ihre lokalen Änderungen nicht. Es wird nur der Zweig aus dem aktuellen HEAD erstellt und der HEAD dort festgelegt. Also ich denke, das ist was du willst.
--- Bearbeiten, um das Ergebnis des Checkout-Masters zu erklären ---
Sind Sie verwirrt, weil
checkout master
Ihre Änderungen nicht verworfen werden?Da die Änderungen nur lokal sind, möchte git nicht, dass Sie sie zu leicht verlieren. Beim Ändern des Zweigs überschreibt git Ihre lokalen Änderungen nicht. Das Ergebnis von Ihnen
checkout master
ist:Dies bedeutet, dass Ihre Arbeitsdateien nicht sauber sind. git hat den HEAD geändert, aber Ihre lokalen Dateien nicht überschrieben. Aus diesem Grund zeigt Ihr letzter Status immer noch Ihre lokalen Änderungen an, obwohl Sie aktiviert sind
master
.Wenn Sie die lokalen Änderungen wirklich verwerfen möchten, müssen Sie das Auschecken mit erzwingen
-f
.Da Ihre Änderungen nie festgeschrieben wurden, würden Sie sie verlieren.
Versuchen Sie, zu Ihrer Zweigstelle zurückzukehren, Ihre Änderungen festzuschreiben und den Master erneut auszuchecken.
Sie sollten
M
nach dem ersten Auschecken eine Nachricht erhalten, aber nicht mehr nach demcheckout master
undgit status
sollten keine geänderten Dateien anzeigen.--- Bearbeiten, um Verwirrung über das Arbeitsverzeichnis (lokale Dateien) zu beseitigen ---
Als Antwort auf Ihren ersten Kommentar sind lokale Änderungen nur ... gut, lokal. Git speichert sie nicht automatisch, Sie müssen es anweisen, um sie für später zu speichern. Wenn Sie Änderungen vornehmen und diese nicht explizit festschreiben oder speichern, werden sie von git nicht versioniert. Wenn Sie HEAD (
checkout master
) ändern , werden die lokalen Änderungen nicht überschrieben, da sie nicht gespeichert wurden.quelle
git checkout
"Dateien im Arbeitsbaum aktualisiert werden, um mit der Version im Index oder dem angegebenen Baum übereinzustimmen." Dies setzt voraus, dass Ihre Änderungen in Ihrem Dateisystem danach GEGANGEN sind . Ohne eine Chance, sie zurückzubekommen. Selbst wenn Sie sagen, dass dies nicht der Fall ist, hinterlässt dies immer noch ein sehr schlechtes Gefühl. Ich vertraue dem überhaupt nicht . Entweder ist die Dokumentation wirklich schlecht oder das Standardverhalten von git ist wirklich gefährlich. Man sollte sich nicht auf eine „automagische“ Heuristik verlassen müssen, um zu erkennen, dass Sie in diesem Fall Ihre Änderungen nicht verlieren möchten.checkout
dies nicht mit Ihren lokalen Änderungen in Konflikt steht, funktioniert das Auschecken und lässt die lokalen Änderungen in Ruhe. Ich verstehe das schlechte Gefühl, auf der Manpage sollte vielleicht "Updates unveränderter Dateien im Arbeitsbaum" stehen. Git hingegen macht es nicht zu einfach, lokale Änderungen zu verlieren.git checkout
Entweder lassen Sie Ihre lokalen Änderungen alleine oder lehnen es ab, wenn ein Konflikt vorliegt.git checkout <other_branch> -f
. Sie verlieren Ihre lokalen Änderungen ohne Vorwarnung.Versuchen:
quelle
Zwei Dinge, die Sie tun können:
oder
(
git checkout -
<- Der Bindestrich ist eine Verknüpfung für den vorherigen Zweig, in dem Sie sich befanden.)(
git stash -u
<--u
bedeutet, dass auch nicht bereitgestellte Änderungen erforderlich sind)quelle
Wenn Sie den GitHub Windows-Client (wie ich) verwenden und nicht festgeschriebene Änderungen vorgenommen haben, die Sie in einen neuen Zweig verschieben möchten, können Sie einfach über den GitHub-Client einen neuen Zweig erstellen. Es wechselt zum neu erstellten Zweig und behält Ihre Änderungen bei.
quelle
Wenn Sie möchten, dass Ihre aktuellen nicht festgeschriebenen Änderungen am aktuellen Zweig in einen neuen Zweig verschoben werden, erstellen Sie mit dem folgenden Befehl einen neuen Zweig und kopieren Sie die nicht festgeschriebenen Änderungen automatisch.
Dadurch wird aus Ihrem aktuellen Zweig ein neuer Zweig erstellt (vorausgesetzt, er ist Master), die nicht festgeschriebenen Änderungen kopiert und zum neuen Zweig gewechselt.
Übernehmen Sie Ihre Änderungen in den neuen Zweig.
Da ein neuer Zweig erstellt wird, müssen Sie den Upstream festlegen, bevor Sie ihn an Remote senden. Verwenden Sie den folgenden Befehl, um den Upstream einzustellen und auf Remote zu schieben.
Sobald Sie diesen Befehl drücken, wird auf der Fernbedienung ein neuer Zweig erstellt und Ihr neuer lokaler Zweig auf die Fernbedienung verschoben.
Wenn Sie nun Ihre nicht festgeschriebenen Änderungen aus dem Hauptzweig entfernen möchten, verwenden Sie:
Dadurch werden alle nicht festgeschriebenen lokalen Änderungen beim Auschecken verworfen.
quelle
Wenn Sie im neuesten GitHub- Client für Windows nicht festgeschriebene Änderungen vorgenommen haben und einen neuen Zweig erstellen möchten.
Sie werden aufgefordert, genau mit diesem Szenario umzugehen:
Gleiches gilt, wenn Sie einfach auch den Zweig wechseln.
quelle