Das passiert mir oft: Ich schreibe etwas Code, will meine Änderungen einchecken und stelle dann fest, dass ich mich nicht im richtigen Zweig befinde, um die Änderungen einzuchecken. Ich kann jedoch nicht in einen anderen Zweig wechseln, ohne dass meine Änderungen rückgängig gemacht werden. Gibt es eine Möglichkeit, Änderungen in einen anderen Zweig zu verschieben, damit sie dort eingecheckt werden?
Antworten
Zu viele Anzeigen?git stash
ist Ihr Freund.
Wenn Sie die Übertragung noch nicht vorgenommen haben, führen Sie einfach git stash
. Dadurch werden alle Ihre Änderungen gespeichert.
Wechseln Sie zu dem Zweig, in dem Sie die Änderungen vornehmen wollen, und führen Sie git stash pop
.
Es gibt viele Verwendungsmöglichkeiten für Git Stash. Dies ist sicherlich einer der nützlichsten Gründe.
Ein Beispiel:
# work on some code
git stash
git checkout correct-branch
git stash pop
Aktualisierung: Keine Notwendigkeit der Verwendung von stash
Befehl. Nicht übertragene Änderungen gehören zu keinem Zweig, also verwenden Sie einfach git checkout -b <new-branch>
Wenn Sie Ihre Änderungen noch nicht übertragen haben verwenden Sie einfach git checkout
um sie in den neuen Zweig zu verschieben und sie dann normal zu übertragen - Änderungen an Dateien sind nicht an einen bestimmten Zweig gebunden, bis Sie sie übertragen.
Wenn Sie haben Ihre Änderungen bereits bestätigt:
- Typ
git log
und merken Sie sich das SHA der zu verschiebenden Übergabe. - Überprüfen Sie den Zweig, in den Sie die Übertragung verschieben möchten.
- Typ
git cherry-pick SHA
Ersetzen der SHA von oben. - Wechseln Sie zurück zu Ihrem ursprünglichen Zweig.
- Utilisez
git reset HEAD~1
zurückzusetzen, bevor Sie den falschen Zweig übertragen.
cherry-pick
nimmt einen bestimmten Commit und wendet ihn auf den aktuell ausgecheckten Kopf an, wodurch Sie den Commit auf einen neuen Zweig kopieren können.
Leider passiert mir das auch regelmäßig, und ich benutze git stash
wenn ich meinen Fehler vorher bemerken würde git commit
und verwenden git cherry-pick
Ansonsten werden beide Befehle in anderen Antworten recht gut erklärt
Ich möchte eine Klarstellung hinzufügen für git checkout targetBranch
: Mit diesem Befehl bleiben das Arbeitsverzeichnis und der Snapshot nur dann erhalten, wenn targetBranch die gleiche Historie wie Ihr aktueller Zweig hat
Wenn Sie Ihre Änderungen noch nicht übertragen haben, verwenden Sie einfach git checkout um in den neue Niederlassung und sie dann normal übertragen
Die Aussage von @Amber ist nicht falsch, wenn Sie zu einem newBranch , git checkout -b newBranch
wird ein neuer Zeiger erstellt, der auf denselben Commit verweist wie Ihr aktueller Zweig.
Wenn Sie zufällig einen anderen Zweig haben, der die gleiche Historie hat wie Ihr aktueller Zweig (beide zeigen auf den gleichen Commit), können Sie Ihre Änderungen "verschieben", indem Sie git checkout targetBranch
In der Regel bedeuten unterschiedliche Zweige jedoch auch eine unterschiedliche Historie, und Git lässt es nicht zu, dass Sie zwischen diesen Zweigen mit einem unsauberen Arbeitsverzeichnis oder Staging-Bereich wechseln. in diesem Fall können Sie entweder git checkout -f targetBranch
(saubere und wegwerfbare Änderungen) oder git stage
+ git checkout targetBranch
(sauber und speichern Änderungen), indem Sie einfach git checkout targetBranch
führt zu einer Fehlermeldung:
Fehler: Ihre lokalen Änderungen an den folgenden Dateien würden überschrieben werden durch den Checkout überschrieben: ... Bitte übertragen Sie Ihre Änderungen oder speichern Sie sie, bevor Sie den Zweig wechseln. Abbrechen
A Soft-Git-Reset fügt übertragene Änderungen wieder in Ihren Index ein. Als nächstes checken Sie den Zweig aus, auf dem Sie die Änderungen übertragen wollten. Dann Git Commit mit einer neuen Commit-Nachricht.
-
git reset --soft <commit>
-
git checkout <branch>
-
git commit -m "Commit message goes here"
De Git-Dokumente :
git reset [<mode>] [<commit>]
Dieses Formular setzt den aktuellen Zweigkopf zurück und aktualisiert möglicherweise den Index (setzt ihn auf den Baum von ) und den Arbeitsbaum in Abhängigkeit von . Wenn weggelassen wird, ist der Standardwert --mixed. Der muss einer der folgenden sein:
--soft
Berührt weder die Indexdatei noch den Arbeitsbaum (setzt aber den Kopf auf , zurück, wie alle anderen Modi auch). Dies lässt alle geänderten Dateien als "zu übertragende Änderungen", wie es der Git-Status ausdrücken würde sagen würde.
Wenn Sie neue Dateien erstellt haben, können Sie dies tun:
git checkout main
git checkout -b branch-b
git checkout branch-a :rel/path/to/yourchangedfiles
git commit -m "w"
git checkout branch-a
git checkout main :rel/path/to/yourchangedfiles
# if this happens:
error: pathspec ':rel/path/to/yourchangedfiles' did not match any file(s) known to git
# then just rm the folder
trash-put rel/path/to/yourchangedfiles