it-swarm.com.de

Wie übertrage ich meine aktuellen Änderungen auf einen anderen Zweig in Git?

Manchmal kann es vorkommen, dass ich einige Änderungen in meinem Arbeitsverzeichnis vornehme und feststelle, dass diese Änderungen in einem anderen Zweig als dem aktuellen festgeschrieben werden müssen. Dies geschieht normalerweise, wenn ich neue Dinge ausprobieren oder testen möchte und vergesse, vorher einen neuen Zweig zu erstellen, aber ich möchte keinen unsauberen Code für den Hauptzweig festlegen.

Also, wie kann ich festlegen, dass nicht festgeschriebene Änderungen (oder Änderungen, die im Index gespeichert sind) für einen anderen Zweig als den aktuellen festgeschrieben werden?

605
Auron

Die anderen Antworten, die das Auschecken des anderen Zweigs und das anschließende Festschreiben vorschlagen, funktionieren nur, wenn das Auschecken aufgrund der lokalen Änderungen möglich ist. Wenn nicht, ist der häufigste Anwendungsfall für git stash:

git stash
git checkout other-branch
git stash pop

Das erste stash verbirgt Ihre Änderungen (im Grunde genommen ein temporäres Commit) und das nachfolgende stash pop wendet sie erneut an. Dadurch kann git seine Zusammenführungsfunktionen nutzen.

Wenn Sie versuchen, den Stash zu öffnen, treten Zusammenführungskonflikte auf. Die nächsten Schritte hängen davon ab, um welche Konflikte es sich handelt. Wenn alle verstauten Änderungen tatsächlich zu diesem anderen Zweig gehören, müssen Sie sie lediglich sortieren. Dies ist eine Folge davon, dass Sie Ihre Änderungen auf dem falschen Zweig vorgenommen haben.

Auf der anderen Seite können Sie einige Arbeit sparen, wenn Sie wirklich durcheinander sind und Ihr Arbeitsbaum eine Mischung aus Änderungen für die beiden Zweige aufweist und die Konflikte nur die sind, die Sie für den ursprünglichen Zweig zurückschreiben möchten . Wie üblich gibt es viele Möglichkeiten, dies zu tun. Hier ist eine, die beginnt, nachdem Sie aufgetaucht sind und die Konflikte gesehen haben:

# Unstage everything (warning: this leaves files with conflicts in your tree)
git reset
# Add the things you *do* want to commit here
git add -p     # or maybe git add -i
git commit
# The stash still exists; pop only throws it away if it applied cleanly
git checkout original-branch
git stash pop
# Add the changes meant for this branch
git add -p 
git commit
# And throw away the rest
git reset --hard

Wenn Sie sich jedoch im Voraus darüber im Klaren sind, dass dies passieren wird, übergeben Sie einfach die Dinge, die zum aktuellen Zweig gehören. Sie können jederzeit zurückkehren und dieses Commit ändern:

git add -p
git commit
git stash
git checkout other-branch
git stash pop

Denken Sie natürlich daran, dass dies alles ein wenig Arbeit gekostet hat, und vermeiden Sie es beim nächsten Mal, indem Sie Ihren aktuellen Filialnamen in die Eingabeaufforderung einfügen, indem Sie $(__git_ps1) zu Ihrer PS1 in Ihrem bashrc hinzufügen. (Siehe zum Beispiel Git in Bash docs.)

913
Cascabel

Sie können einfach einen neuen Zweig erstellen und darauf wechseln. Übernehmen Sie Ihre Änderungen dann:

git branch dirty
git checkout dirty
// And your commit follows ...

Alternativ können Sie auch einen vorhandenen Zweig auschecken (nur git checkout <name>). Aber nur, wenn es keine Kollisionen gibt (die Basis aller bearbeiteten Dateien ist dieselbe wie in Ihrem aktuellen Zweig). Ansonsten erhalten Sie eine Nachricht.

54
tanascius
  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

Und geben Sie Ihre Commit-Nachricht an.

20
Hank Gay