Verschieben geänderter Dateien zum Einchecken in einen anderen Zweig

421

Das passiert mir oft: Ich schreibe Code, checke meine Änderungen ein und stelle dann fest, dass ich nicht in der richtigen Verzweigung bin, um diese Änderungen einzuchecken. Ich kann jedoch nicht zu einem anderen Zweig wechseln, ohne dass meine Änderungen rückgängig gemacht werden. Gibt es eine Möglichkeit, Änderungen in einen anderen Zweig zu verschieben, um dort eingecheckt zu werden?

mainsozial
quelle

Antworten:

750

git stash ist dein Freund.

Wenn Sie das Commit noch nicht durchgeführt haben, führen Sie es einfach aus git stash. Dadurch werden alle Ihre Änderungen gespeichert.

Wechseln Sie zu dem Zweig, in dem die Änderungen vorgenommen werden sollen, und führen Sie ihn aus git stash pop.

Es gibt viele Verwendungszwecke für Git Stash. Dies ist sicherlich einer der nützlicheren Gründe.

Ein Beispiel:

# work on some code
git stash
git checkout correct-branch
git stash pop
Bill Door
quelle
122
Sie müssen keine nicht festgeschriebenen Änderungen aufbewahren, sie begleiten Sie, wenn Sie eine Filiale auschecken. Stash ist eher für die längerfristige Speicherung temporärer Dinge gedacht (Dinge, die Sie später beenden und festschreiben möchten, aber Sie müssen jetzt etwas anderes tun).
Tekkub
2
Ich verstehe das. Also muss ich verstauen, den Zweig wechseln und dann Pop C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
IsmailS
3
@Tekkub "Langzeitspeicherung von temporären Dingen", die sich sehr umständlich anfühlt. Ein weiterer Punkt bei der Verwendung von Stash ist, dass es in einen Stapel verschoben wird. Wenn Sie also nicht möchten, dass es etwas anderes überträgt und daran arbeitet, ist es auf diese Weise nützlich . Ja, das müssen Sie nicht, sondern fühlen sich sauberer und kontrollierter.
Atherion
Bravo Baby! sollte anhängen, was Sie tun sollten, wenn Sie die Commits gemacht haben
Ishan Srivastava
2
@Tekkub Dies gilt nur, wenn der Zweig, zu dem Sie wechseln, mit dem Zweig, in dem Sie sich befinden, auf dem neuesten Stand ist. Wenn Sie zum Beispiel versehentlich an einem Prod-Zweig arbeiten und zum Stage-Zweig wechseln müssen, sich die Stufe jedoch in der Zwischenzeit geändert hat, ist dies die einzige Möglichkeit, den Wechsel vorzunehmen.
Danielson317
247

Wenn Sie Ihre Änderungen noch nicht festgeschrieben haben, wechseln Sie einfach git checkoutzum neuen Zweig und übernehmen Sie sie dann normal. Änderungen an Dateien werden erst an einen bestimmten Zweig gebunden, wenn Sie sie festschreiben.

Wenn Sie haben bereits Ihre Änderungen festgeschrieben:

  1. Typ git logund erinnere mich an den SHA von der Commit Sie verschieben möchten.
  2. Überprüfen Sie den Zweig, in den Sie das Commit verschieben möchten.
  3. Geben Sie git cherry-pick SHAden SHA von oben ein.
  4. Wechseln Sie zurück zu Ihrer ursprünglichen Filiale.
  5. Verwenden Sie git reset HEAD~1diese Option, um vor dem Festschreiben eines falschen Zweigs einen Reset durchzuführen.

cherry-pick Nimmt ein bestimmtes Commit und wendet es auf den aktuell ausgecheckten Kopf an, sodass Sie das Commit in einen neuen Zweig kopieren können.

Bernstein
quelle
9
Sie sollten hier nicht einmal Kirschen pflücken müssen. git reset HEAD~N --softund dann git checkout -bden gesamten jetzt nicht festgeschriebenen Code in einen neuen Zweig zu verschieben.
Aaron
19
Änderungen an Dateien werden erst an einen bestimmten Zweig gebunden, wenn Sie sie festschreiben. <- das. Dies löste ein Rätsel für mich. Vielen Dank.
Tschallacka
8
Beim Versuch, Zweige zu wechseln, wird folgende Fehlermeldung angezeigt: "Lokale Änderungen an den folgenden Dateien werden beim Auschecken überschrieben." Es scheint also nicht so, als könnte ich in einen anderen Zweig wechseln und mich normal festlegen.
Mischa
3
@ Mischa es funktioniert nicht, wenn Sie zwischen zwei Zweigen wechseln, die unterschiedliche Historien haben
watashiSHUN
1
@ Aaron, das ist viel schöner (für das Post-Commit-Szenario)! Bitte geben Sie eine separate Antwort.
Jacktose
15

Leider passiert mir das auch ziemlich regelmäßig und ich benutze, git stashwenn ich meinen Fehler vorher erkannt habe git commitund git cherry-pickanderweitig benutze , werden beide Befehle in anderen Antworten ziemlich gut erklärt

Ich möchte eine Klarstellung hinzufügen für git checkout targetBranch: Dieser Befehl behält Ihr Arbeitsverzeichnis und Ihren bereitgestellten Snapshot nur bei, wenn targetBranch denselben Verlauf wie Ihr aktueller Zweig hat

Wenn Sie Ihre Änderungen noch nicht festgeschrieben haben, wechseln Sie einfach mit git checkout in den neuen Zweig und übernehmen Sie sie dann normal

Die Anweisung von @ Amber ist nicht falsch. Wenn Sie zu einer neuen Branche wechseln , git checkout -b newBranchwird ein neuer Zeiger erstellt, der auf genau dasselbe Commit wie Ihr aktueller Zweig verweist.
Wenn Sie zufällig einen anderen Zweig haben, der den Verlauf mit Ihrem aktuellen Zweig teilt (beide zeigen auf dasselbe Commit), können Sie Ihre Änderungen "verschieben"git checkout targetBranch

Normalerweise bedeuten unterschiedliche Zweige jedoch einen unterschiedlichen Verlauf, und mit Git können Sie nicht zwischen diesen Zweigen mit einem schmutzigen Arbeitsverzeichnis oder Staging-Bereich wechseln. In diesem Fall können Sie entweder git checkout -f targetBranchÄnderungen vornehmen (bereinigen und wegwerfen) oder git stage+ git checkout targetBranch( Änderungen bereinigen und speichern ). Durch einfaches Ausführen git checkout targetBranchwird ein Fehler ausgegeben:

Fehler: Ihre lokalen Änderungen an den folgenden Dateien werden beim Auschecken überschrieben: ... Bitte übernehmen Sie Ihre Änderungen oder speichern Sie sie, bevor Sie die Zweige wechseln. Abbruch

watashiSHUN
quelle
4

Ein Soft-Git-Reset bringt festgeschriebene Änderungen wieder in Ihren Index. Überprüfen Sie als Nächstes den Zweig, für den Sie sich verpflichten wollten. Dann git commit mit einer neuen Commit-Nachricht.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

Aus Git-Dokumenten :

git reset [<mode>] [<commit>]Dieses Formular setzt den aktuellen Verzweigungskopf auf zurück und aktualisiert möglicherweise den Index (Zurücksetzen auf den Baum von) und den Arbeitsbaum abhängig von. Wenn nicht angegeben, wird standardmäßig --mixed verwendet. Das muss eines der folgenden sein:

--softBerührt die Indexdatei oder den Arbeitsbaum überhaupt nicht (setzt jedoch den Kopf zurück, genau wie in allen Modi). Dadurch bleiben alle geänderten Dateien "Änderungen müssen festgeschrieben werden", wie der Git-Status es ausdrücken würde.

JSON C11
quelle