1233 Stimmen

Git: Erstellen eines Zweigs aus unstaged/uncommitted Änderungen auf master

Der Kontext: Ich arbeite an Master und füge eine einfache Funktion hinzu. Nach ein paar Minuten merke ich, dass es gar nicht so einfach war und besser in einem neuen Zweig hätte arbeiten sollen.

Das passiert mir immer wieder, und ich habe keine Ahnung, wie ich zu einem anderen Zweig wechseln und all diese nicht übertragenen Änderungen mitnehmen kann, so dass der Master-Zweig sauber bleibt. Ich nahm an git stash && git stash branch new_branch würde das einfach erreichen, aber das ist, was ich bekomme:

~/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?

1490voto

Gauthier Punkte 37166

Sie brauchen nichts zu verstecken.

Update 2020 / Git 2.23


Git 2.23 fügt die neue switch in einem Versuch, die Verwirrung zu beseitigen, die durch die überladene Verwendung von checkout (Zweigwechsel, Wiederherstellung von Dateien, Abtrennung von HEAD usw.)

Beginnend mit dieser Version von Git, ersetzen Sie die git checkout Befehl unten mit:

git switch -c <new-branch>

Das Verhalten bleibt unverändert.

Vor Update 2020 / Git 2.23


git checkout -b new_branch_name

berührt Ihre lokalen Änderungen nicht. Es wird lediglich der Zweig aus dem aktuellen HEAD erstellt und der HEAD dort gesetzt. Ich denke, das ist es, was Sie wollen.

--- Bearbeiten, um das Ergebnis von checkout master zu erklären ---

Sind Sie verwirrt, weil checkout master Ihre Änderungen nicht verwirft?

Da die Änderungen nur lokal sind, möchte Git nicht, dass Sie sie zu leicht verlieren. Wenn Sie den Zweig wechseln, überschreibt Git Ihre lokalen Änderungen nicht. Das Ergebnis Ihrer checkout master ist:

M   testing

Das bedeutet, dass Ihre Arbeitsdateien nicht sauber sind. git hat den HEAD geändert, aber Ihre lokalen Dateien nicht überschrieben. Deshalb zeigt Ihr letzter Status immer noch Ihre lokalen Änderungen an, obwohl Sie sich auf master .

Wenn Sie die lokalen Änderungen wirklich verwerfen wollen, müssen Sie den Checkout mit -f .

git checkout master -f

Da Ihre Änderungen nie festgeschrieben wurden, würden sie verloren gehen.

Versuchen Sie, zu Ihrem Zweig zurückzukehren, übertragen Sie Ihre Änderungen und checken Sie dann den Master erneut aus.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

Sie sollten eine M Meldung nach dem ersten Checkout, dann aber nicht mehr nach dem checkout master そして git status sollte keine geänderten Dateien anzeigen.

--- Bearbeiten, um Verwirrung über das Arbeitsverzeichnis (lokale Dateien) auszuräumen ---

Um auf Ihren ersten Kommentar zu antworten: Lokale Änderungen sind einfach... nun ja, lokal. Git speichert sie nicht automatisch, Sie müssen sie für später speichern. Wenn du Änderungen vornimmst und sie nicht ausdrücklich festlegst oder speicherst, wird Git sie nicht versionieren. Wenn Sie HEAD ändern ( checkout master ), werden die lokalen Änderungen nicht überschrieben, da ungespeichert.

87voto

Grant Limberg Punkte 20123

Versuchen Sie es:

git stash
git checkout -b new-branch
git stash apply

31voto

Maverick Punkte 1383

Wenn Sie möchten, dass Ihre aktuellen, nicht übertragenen Änderungen im aktuellen Zweig in einen neuen Zweig verschoben werden, verwenden Sie den folgenden Befehl, um einen neuen Zweig zu erstellen und die nicht übertragenen Änderungen automatisch zu kopieren.

git checkout -b branch_name

Dies erstellt einen neuen Zweig aus Ihrem aktuellen Zweig (unter der Annahme, dass es sich um den Master-Zweig handelt), kopiert die nicht übertragenen Änderungen und wechselt zum neuen Zweig.

Fügen Sie Dateien zu stage hinzu und übertragen Sie Ihre Änderungen in den neuen Zweig.

git add .
git commit -m "First commit"

Da ein neuer Zweig erstellt wird, müssen Sie den Upstream setzen, bevor Sie ihn an den Remote-Server weiterleiten. Verwenden Sie den folgenden Befehl, um den Upstream zu setzen und ihn an den Remote-Server zu übertragen.

git push --set-upstream origin feature/feature/NEWBRANCH

Sobald Sie diesen Befehl ausführen, wird ein neuer Zweig auf dem entfernten Rechner erstellt und Ihr neuer lokaler Zweig wird auf den entfernten Rechner übertragen.

Wenn Sie nun Ihre nicht übertragenen Änderungen aus dem Master-Zweig wegwerfen wollen, verwenden Sie:

git checkout master -f

Dadurch werden alle nicht übertragenen lokalen Änderungen beim Auschecken verworfen.

28voto

Pylinux Punkte 10206

Sie können zwei Dinge tun:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

または

git stash -u
git branch sillyname stash@{0}

( git checkout - <-- der Bindestrich ist eine Abkürzung für den vorherigen Zweig, in dem Sie sich befanden )

( git stash -u <-- die -u bedeutet, dass es auch ungetaktete Änderungen übernimmt)

7voto

Tod Birdsall Punkte 15830

Wenn Sie den GitHub-Windows-Client verwenden (so wie ich) und sich in einer Situation befinden, in der Sie unbestätigte Änderungen vorgenommen haben, die Sie in einen neuen Zweig verschieben möchten, können Sie einfach über den GitHub-Client einen neuen Zweig erstellen". Er wechselt in den neu erstellten Zweig und behält Ihre Änderungen bei.

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X