Git Switch-Zweig, ohne lokale Änderungen zu verwerfen

181

Okay, sagen wir eines Tages, wir machen eine Reihe von Änderungen und wenn wir sie festschreiben, bemerken wir, dass wir an der falschen Niederlassung gearbeitet haben.

Wie können wir git Schalterzweigen zwingen , ohne lokale Änderungen zu verwerfen .

Ich werde das wahrscheinlich naiv angehen, während ich auf eine Antwort warte, aber ich würde gerne wissen, ob es ein korrektes Verfahren gibt, da ich lügen würde, wenn ich sagen würde, dass mir das noch nie passiert ist ...

  • Backup geändert Repo
  • git reset --hard
  • git checkout right-branch
  • Änderungen wiederherstellen
  • git commit -m "changes"
Megawac
quelle

Antworten:

342

Es gibt verschiedene Möglichkeiten, je nachdem, wie weit Sie entfernt sind und auf welchen Zweigen Sie sie haben möchten.

Nehmen wir einen klassischen Fehler:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

Nun möchten Sie, dass diese Änderungen, zu denen Sie sich noch nicht verpflichtet haben master, wirksam werden develop.

  1. Wenn Sie nicht über eine developnoch ist das Verfahren trivial:

    $ git checkout -b develop
    

    Dadurch wird ein neuer developZweig erstellt, der von jedem Ort aus beginnt. Jetzt können Sie sich verpflichten und das neue Zeug ist fertig develop.

  2. Du hast eine develop. Sehen Sie, ob Sie mit Git wechseln können, ohne etwas zu tun:

    $ git checkout develop
    

    Dies wird entweder erfolgreich sein oder sich beschweren. Wenn es gelingt, großartig! Einfach begehen. Wenn nicht ( error: Your local changes to the following files would be overwritten ...), haben Sie noch viele Optionen.

    Das einfachste ist wahrscheinlich git stash(wie alle anderen Antwortenden, die mich zum Klicken geschlagen haben, postsagten). Run git stash saveor git stash push, 1 oder einfach nur git stashdie Abkürzung für save/ push:

    $ git stash
    

    Dadurch wird Ihr Code mithilfe einer seltsamen Methode ohne Verzweigung festgeschrieben (ja, es werden tatsächlich einige Festschreibungen vorgenommen). Die Commits, die es macht, befinden sich nicht in einem Zweig, sondern werden jetzt sicher im Repository gespeichert, sodass Sie jetzt die Zweige wechseln und dann den Stash "anwenden" können:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    Wenn alles gut geht und Sie die Ergebnisse mögen, sollten Sie git stash dropdas Versteck. Dadurch wird der Verweis auf die seltsamen Commits ohne Verzweigung gelöscht. (Sie befinden sich noch im Repository und können manchmal im Notfall abgerufen werden. In den meisten Fällen sollten Sie sie jedoch als zu diesem Zeitpunkt verschwunden betrachten.)

Der applySchritt führt eine Zusammenführung der verborgenen Änderungen durch, wobei die leistungsstarke zugrunde liegende Zusammenführungsmaschinerie von Git verwendet wird. Dies gilt auch für die Zusammenführung von Zweigen. Dies bedeutet, dass Sie "Zusammenführungskonflikte" erhalten können, wenn sich der Zweig, an dem Sie versehentlich gearbeitet haben, ausreichend von dem Zweig unterscheidet, an dem Sie arbeiten wollten. Es ist daher eine gute Idee, die Ergebnisse sorgfältig zu überprüfen, bevor Sie davon ausgehen, dass der Stash sauber angewendet wurde, auch wenn Git selbst keine Zusammenführungskonflikte festgestellt hat.

Viele Leute benutzen git stash pop, was für kurz ist git stash apply && git stash drop. Soweit es geht, ist das in Ordnung, aber es bedeutet, dass Sie den Vorrat nicht einfach zurückbekommen können, wenn die Anwendung zu einem Durcheinander führt und Sie entscheiden, dass Sie diesen Weg nicht beschreiten möchten. Aus diesem Grund empfehle ich apply, die Ergebnisse dropnur dann zu überprüfen, wenn sie zufrieden sind. (Dies führt natürlich einen weiteren Punkt ein, an dem Sie eine weitere Kaffeepause einlegen und vergessen können, was Sie getan haben, zurückkommen und das Falsche tun können. Es ist also keine perfekte Heilung.)


1 Das savein git stash saveist das alte Verb zum Erstellen eines neuen Stashs. In Git Version 2.13 wurde das neue Verb eingeführt, um die Konsistenz popzu verbessern und dem Erstellungsbefehl weitere Optionen hinzuzufügen. Git Version 2.16 hat das alte Verb offiziell veraltet (obwohl es immer noch in Git 2.23 funktioniert, der neuesten Version zum Zeitpunkt der Bearbeitung).

torek
quelle
3
Was ist, wenn ich zu einem anderen Zweig wechseln möchte, ohne mich auf den aktuellen Zweig festzulegen (z. B. sind die Änderungen noch nicht abgeschlossen) und später wieder wechseln möchte, um fortzufahren?
stt106
@ stt106: Sie müssen noch festschreiben, aber Sie können es wie in dieser und den anderen Antworten über git stashtun, damit die Festschreibungen - denn git stashSie erhalten in einer ungewöhnlichen Anordnung zwei Festschreibungen pro Stash-Eintrag - in keinem Zweig sind. Abgesehen von sehr kurzfristigen Sonderfällen bevorzuge ich jedoch im Allgemeinen ein normales Commit. Sie können git reset --softoder git reset --mixedspäter oder verwenden, git commit --amendum es beiseite zu schieben, wenn Sie wieder an diesem Zweig arbeiten. (In modernen Git können Sie auch verwenden git worktree add, was eine noch bessere Lösung sein kann.)
Torek
"Dies wird entweder erfolgreich sein oder sich beschweren." Was wären die Gründe für Erfolg oder Fehler beim Auschecken?
Nanocv
Alle meine lokalen Änderungen gehen verloren, wenn ich mit den oben genannten Schritten in den Zweig <a> wechsle und meine Änderungen vornehme. Ich möchte in den Zweig <b> wechseln und alle meine Änderungen darin verschieben. Wenn ich Git Stash mache und zu anderen Zweigen wechsle, werden alle Dateien des Zweigs <b> abgerufen und meine lokalen Änderungen gehen verloren
Mukul Munjal,
38

Verwenden Sie Git Stash

git stash

Es überträgt Änderungen auf einen Stapel. Wenn Sie sie zurückziehen möchten, verwenden Sie

 git stash apply

Sie können sogar einzelne Gegenstände herausziehen. Um das Versteck komplett wegzublasen:

 git stash clear
Strahl
quelle
7
Letzter Befehl sollte wahrscheinlich sein git stash drop; git stash clearlöscht den gesamten Stash-Stack, einschließlich möglicherweise nicht verwandter Stashes für diesen Befehlssatz.
Leland
15
  • git stash um Ihre nicht festgeschriebenen Änderungen zu speichern
  • git stash list um Ihre gespeicherten nicht festgeschriebenen Vorräte aufzulisten
  • git stash apply stash@{x} Dabei kann x 0,1,2 sein. Keine Anzahl von Verstecken, die Sie erstellt haben
gebrochener Fuß
quelle
4

Du kannst entweder :

  • Verwenden Sie git stashdiese Option, um Ihre Änderungen zu speichern, oder,

  • Erstellen Sie einen weiteren Zweig, übernehmen Sie Ihre Änderungen dort und führen Sie diesen Zweig in Ihrem Arbeitsverzeichnis zusammen

X3074861X
quelle