Frage Git: Erstellen Sie eine Verzweigung aus nicht geänderten / nicht festgeschriebenen Änderungen am Master


Kontext: Ich arbeite daran, eine einfache Funktion hinzuzufügen. Nach ein paar Minuten merke ich, dass es nicht so einfach war und es besser gewesen wäre, in eine neue Filiale zu arbeiten.

Das passiert mir immer und ich habe keine Ahnung, wie ich zu einem anderen Zweig wechseln soll und alle diese unbearbeiteten Änderungen mitnehmen soll, wobei ich den Master-Zweig sauber lasse. Ich vermutete 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")

Weißt du, ob es einen Weg gibt, dies zu erreichen?


789
2018-04-02 22:09


Ursprung


Antworten:


Keine Notwendigkeit, sich zu verstecken.

git checkout -b new_branch_name

berührt nicht Ihre lokalen Änderungen. Es erstellt nur den Zweig vom aktuellen HEAD und setzt den HEAD dort. Also ich denke, das ist es was du willst.

--- Edit, um das Ergebnis des Checkout-Masters zu erklären ---

Bist du verwirrt weil? checkout master verwerfen Sie Ihre Änderungen nicht?

Da die Änderungen nur lokal sind, möchte Git nicht, dass Sie sie zu leicht verlieren. Beim Ändern der Verzweigung überschreibt git Ihre lokalen Änderungen nicht. Das Ergebnis Ihrer checkout master ist:

M   testing

, was 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 eingeschaltet sind master.

Wenn Sie die lokalen Änderungen wirklich verwerfen möchten, müssen Sie das Auschecken mit erzwingen -f.

git checkout master -f

Da Ihre Änderungen nie ausgeführt wurden, würden Sie sie verlieren.

Versuchen Sie, zu Ihrem Zweig zurückzukehren, Ihre Änderungen zu bestätigen und dann den Master erneut auszuprobieren.

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

Du solltest einen bekommen M Nachricht nach dem ersten Checkout, aber dann nicht mehr nach dem checkout master, und git status sollte keine modifizierten Dateien anzeigen.

--- Bearbeiten, um Verwirrung über Arbeitsverzeichnis (lokale Dateien) zu beseitigen ---

Als Antwort auf Ihren ersten Kommentar sind lokale Änderungen nur ... na ja, lokal. Git speichert sie nicht automatisch, Sie müssen es ihm mitteilen, um sie für später zu speichern. Wenn Sie Änderungen vornehmen und diese nicht explizit festschreiben oder speichern, wird git diese nicht versionieren. Wenn du HEAD änderst (checkout master), die lokalen Änderungen werden nicht überschrieben, da sie nicht gespeichert wurden.


941
2018-04-02 22:25



Versuchen:

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

50
2018-04-02 22:15



Zwei Dinge, die du tun kannst:

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

oder

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

(git checkout - <- Der Bindestrich ist eine Abkürzung für den vorherigen Zweig, in dem Sie waren.)

(git stash -u <- der -u bedeutet, dass es auch nicht veränderte Änderungen benötigt)


15
2018-01-13 21:38



Wenn Sie den GitHub Windows-Client (so wie ich) verwenden und nicht festgeschriebene Änderungen vornehmen möchten, die Sie in einen neuen Zweig verschieben möchten, können Sie einfach einen neuen Zweig über den GitHub-Client erstellen. Es wird in den neu erstellten Zweig wechseln und Ihre Änderungen beibehalten.

enter image description here


4
2017-09-13 13:35