703 Stimmen

Wie führe ich meine lokalen, nicht übertragenen Änderungen in einem anderen Git-Zweig zusammen?

Wie kann ich in Git Folgendes tun?

Mein aktueller Zweig ist Zweig1 und ich habe einige lokale Änderungen vorgenommen. Jetzt stelle ich jedoch fest, dass ich diese Änderungen eigentlich auf Zweig2 anwenden wollte. Gibt es eine Möglichkeit, diese Änderungen anzuwenden/zusammenzuführen, so dass sie zu lokalen Änderungen in Zweig2 werden, ohne sie in Zweig1 zu binden?

3 Stimmen

Es gibt ein tolles Git-Tutorial rechts aquí über SO. Es ist eine Art Zentrale für alle Git-Fragen auf Stack Overflow.

0 Stimmen

Dieser Link existiert dank der StackOverflow-Magie in der "verlinkten" Gruppe von Fragen auf der rechten Seite, aber ich denke, er verdient einen Kommentar-Link: siehe auch Verschieben vorhandener, nicht gebundener Arbeiten in einen neuen Zweig in Git .

991voto

VonC Punkte 1117238

Da Ihre Dateien noch nicht in branch1 :

git stash
git checkout branch2
git stash pop

または

git stash
git checkout branch2
git stash list       # to check the various stash made in different branch
git stash apply x    # to select the right one

Oben ist die längere, explizitere Version von rbento 's respuesta :

git stash
git stash branch branch2

Es verwendet:

git stash branch <branchname> [<stash>]

  • Erstellt und checkt einen neuen Zweig namens <branchname> ab der Übertragung, bei der die <stash> ursprünglich erstellt wurde,
  • wendet die Änderungen an, die in <stash> auf den neuen Arbeitsbaum und den Index.

Wenn das gelingt, und <stash> ist eine Referenz der Form stash@{<revision>} wird dann die <stash> .

Dies ist nützlich, wenn der Zweig, auf dem Sie git stash push hat sich so verändert, dass git stash apply aufgrund von Konflikten scheitert.
Da der Stash-Eintrag auf die Übergabe angewendet wird, die zu diesem Zeitpunkt HEAD war git stash ausgeführt wurde, wird der ursprünglich gespeicherte Zustand ohne Konflikte wiederhergestellt.


Wie kommentiert por benjohn (siehe git stash Manpage ):

Um auch aktuell nicht verfolgte (neu hinzugefügte) Dateien zwischenzuspeichern, fügen Sie das Argument -u , also:

git stash -u

0 Stimmen

Danke - das ist genau das, wonach ich gesucht habe.

2 Stimmen

Sie sind herzlich willkommen. Weitere Beispiele für die Verwendung von Vorräten unter unethicalblogger.com/posts/2008/11/ .

2 Stimmen

Wenn Sie nach einer Lösung für das gleiche Problem suchen, aber mit TFS, ist die äquivalente Lösung, Ihre Änderungen in die Schublade zu legen und dann die TFS Power Tools zu verwenden, um die Schublade mit dem Schalter /migrate in den richtigen Zweig zu verschieben.

89voto

CB Bailey Punkte 693084

Stashing, temporäre Commits und Rebasing könnten zu viel des Guten sein. Wenn Sie die geänderten Dateien noch nicht in den Index aufgenommen haben, können Sie vielleicht einfach den anderen Zweig auschecken.

git checkout branch2

Dies funktioniert, solange sich keine der Dateien, die Sie bearbeiten, zwischen Zweig1 und Zweig2 unterscheiden. Sie bleiben auf Zweig2 und Ihre Arbeitsänderungen bleiben erhalten. Wenn sie sich unterscheiden, können Sie angeben, dass Sie Ihre lokalen Änderungen mit den Änderungen zusammenführen wollen, die durch den Wechsel der Zweige mit der Option -m Option zur Kasse gehen.

git checkout -m branch2

Wenn Sie Änderungen am Index vorgenommen haben, sollten Sie diese Änderungen zunächst mit einem Reset rückgängig machen. (Dadurch bleibt Ihre Arbeitskopie erhalten, es werden lediglich die Änderungen entfernt).

git reset

3 Stimmen

Ich dachte, das stash "einfacher" irgendwie zu verstehen, aber Ihr Ansatz ist besser zu berücksichtigen, das Arbeitsverzeichnis über verschiedene Zweige. +1

6 Stimmen

Ein einfaches traditionelles Auschecken schien mir für das vorliegende Problem geeigneter zu sein. Vielleicht ist es einfacher, den Stash-Ansatz zu verstehen, oder es ist einfach nicht offensichtlich genug, dass Checkout in diesem Anwendungsfall "sicher" ist.

0 Stimmen

Si checkout -m in einer bestimmten Situation nicht "sicher" ist (vielleicht würde es einen Merge-Konflikt verursachen), würde Stash irgendeinen Vorteil bieten (z. B. kann man einen Stash-Pop entpopen)?

17voto

rbento Punkte 6245

Eine kürzere Alternative zur akzeptierten Antwort wäre:

Verschieben Sie die Änderungen vorübergehend in ein Versteck.

  1. git stash

Erstellen Sie einen neuen Zweig und wechseln Sie zu diesem, um dann den Vorrat in nur einem Schritt zu öffnen.

  1. git stash branch new_branch_name

Dann einfach add y commit die Änderungen an diesem neuen Zweig.

12voto

chakrit Punkte 59834

WARNUNG: Nicht für Git-Neulinge.

Das kommt in meinem Arbeitsablauf so oft vor, dass ich schon fast versucht habe, einen neuen Git-Befehl dafür zu schreiben. Der übliche git stash fließen ist der Weg zum Erfolg sondern ist ein wenig unangenehm. Normalerweise mache ich zuerst eine neue Übertragung, da wenn ich mir die Änderungen angesehen habe, sind alle Informationen noch frisch in meinem Gedächtnis und es ist besser, einfach anzufangen git commit Was ich gefunden habe (in der Regel ein Bugfix, der zu Master gehört und den ich bei der Arbeit an einem Feature-Zweig entdecke), bringe ich gleich mit.

Es ist auch hilfreich - wenn Sie häufig in solche Situationen geraten -, wenn Sie ein anderes Arbeitsverzeichnis neben Ihrer aktuellen, die immer die master Zweigstelle überprüft.

Ich gehe also folgendermaßen vor:

  1. git commit die Änderungen sofort mit einer guten Commit-Nachricht.
  2. git reset HEAD~1 um die Übertragung vom aktuellen Zweig rückgängig zu machen.
  3. (optional) die Arbeit an der Funktion fortsetzen.

Manchmal später (asynchron), oder sofort in einem anderen Terminalfenster:

  1. cd my-project-master ein weiterer WD, der die gleiche .git
  2. git reflog um die Fehlerbehebung zu finden, die ich gerade vorgenommen habe.
  3. git cherry-pick SHA1 der Übergabe.

Optional (immer noch asynchron) können Sie dann Ihren Feature-Zweig neu basen (oder zusammenführen), um den Bugfix zu erhalten, normalerweise wenn Sie kurz davor sind, einen PR einzureichen und Ihren Feature-Zweig und WD bereits bereinigt haben:

  1. cd my-project das ist die wichtigste WD, an der ich arbeite.
  2. git rebase master um die Fehlerbehebungen zu erhalten.

Auf diese Weise kann ich ungestört an dem Feature weiterarbeiten und muss mich nicht um git stash -irgendetwas zu tun oder meine WD vor einer Veranstaltung zu reinigen. git checkout (und dann die Überprüfung der Funktion Zweig wieder aus.) und haben immer noch alle meine Bugfixes geht an master statt in meinem Funktionszweig versteckt.

IMO git stash y git checkout ist eine echte PIA, wenn man gerade an einem großen Feature arbeitet.

0 Stimmen

Interessante und gültige Alternative zu meiner Antwort. +1

0 Stimmen

Kommen Sie von mercurial? Die my-project-master denselben .git lässt es so klingen. Warum nicht git checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard und dann später (asynchron) während master , git cherry-pick <SHA1 of the commit(s) in bugfixABC ? (oder sogar, um nicht den SHA1 herausfinden zu müssen, git rebase --onto master feature bugfixABC von der Zweigstelle aus, in der Sie sich gerade befinden. Das heißt, Sie können das direkt nach der git reset oben, während auf feature .)

0 Stimmen

Es klingt jedoch so, als ob OP noch nicht bereit ist, die Änderungen zu übernehmen, in diesem Fall einfach checkout -m ist besser.

2voto

claf Punkte 8682

Wenn es um übertragene Änderungen ginge, sollten Sie sich git-rebase ansehen, aber wie in dem Kommentar von VonC erwähnt, wäre git-stash, da es sich um lokale Änderungen handelt, sicherlich der richtige Weg, dies zu tun.

0 Stimmen

Ich verstehe diese Lösung nicht: es würde die Commit-Historie von branch2 von branch1 umschreiben... warum alle committed Änderungen von branch1 in branch2 erhalten, wenn wir nur lokale, nicht-committed Änderungen von branch1 in branch2 erhalten wollen?...

0 Stimmen

@VonC : stimmt, in diesem Fall bekommt rebase alle committed Änderungen seit dem letzten Merge zwischen Zweigen in Zweig1. Ich habe den "non-committed"-Parameter dieser Frage zunächst nicht verstanden. rebase ist nicht die richtige Antwort.

0 Stimmen

@claferri: pfew... Ich hatte schon Kopfschmerzen ;) Ich hätte Ihre Antwort heruntergestuft, aber da ich selbst eine veröffentlicht hatte, gab es einen "klaren Interessenkonflikt". Mit deinem aktualisierten Beitrag muss ich jetzt gar nicht mehr runterstufen. Danke :)

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