3719 Stimmen

Verschieben vorhandener, nicht gebundener Arbeiten in einen neuen Zweig in Git

Ich habe mit der Arbeit an einer neuen Funktion begonnen, und nachdem ich ein wenig programmiert hatte, beschloss ich, dass diese Funktion in einem eigenen Zweig untergebracht werden sollte.

Wie verschiebe ich die bestehenden, nicht freigegebenen Änderungen in einen neuen Zweig und setze meinen aktuellen Zweig zurück?

Ich möchte meinen aktuellen Zweig zurücksetzen und gleichzeitig die Arbeit an der neuen Funktion beibehalten.

4358voto

knittl Punkte 214432

Update 2020 / Git 2.23

Git 2.23 fügt die neue switch in einem Versuch, die Verwirrung zu beseitigen, die durch die überladene Verwendung von checkout (Zweigwechsel, Wiederherstellung von Dateien, Abtrennung von HEAD usw.)

Ab dieser Version von Git ersetzen Sie den Befehl checkout durch:

git switch -c <new-branch>

Das Verhalten ist identisch und bleibt unverändert.


Vor Update 2020 / Git 2.23

Verwenden Sie das Folgende:

git checkout -b <new-branch>

Dadurch wird Ihr aktueller Zweig belassen, ein neuer Zweig erstellt und ausgecheckt, und alle Änderungen bleiben erhalten. Sie können dann die Änderungen in Dateien einfügen, um sie zu übertragen:

git add <files>

und verpflichten sich zu Ihrem neue Niederlassung mit:

git commit -m "<Brief description of this commit>"

Die Änderungen im Arbeitsverzeichnis und die im Index bereitgestellten Änderungen keiner Branche angehören noch nicht. Dadurch wird der Zweig geändert, in dem diese Änderungen enden würden.

Sie haben keine zurücksetzen Ihr ursprünglicher Zweig bleibt, wie er ist. Die letzte Übergabe an <old-branch> wird immer noch derselbe sein. Deshalb müssen Sie checkout -b und dann übertragen.

393voto

Robin Qiu Punkte 5141

Alternativ dazu:

  1. Aktuelle Änderungen in einem temporären Versteck speichern:

    $ git stash

  2. Erstellen Sie einen neuen Zweig, der auf diesem Stash basiert, und wechseln Sie zu diesem neuen Zweig:

    $ git stash branch <new-branch> stash@{0}

Tipp: Verwenden Sie die Tabulatortaste, um die Eingabe des Verstecknamens zu verringern.

61voto

joeytwiddle Punkte 26603

Wenn Sie Übertragungen vorgenommen haben auf Ihrem Hauptzweig, während Sie programmiert haben, aber Sie wollen diese Commits jetzt in einen anderen Zweig verschieben, ist dies ein schneller Weg:

  1. Kopieren Sie Ihre aktuelle Historie in einen neuen Zweig und nehmen Sie dabei auch alle nicht übertragenen Änderungen mit:

     git checkout -b <new-feature-branch>
  2. Zwingen Sie nun den ursprünglichen "chaotischen" Zweig zum Zurückrollen: (ohne zu ihm zu wechseln)

     git branch -f <previous-branch> <earlier-commit-id>

    Zum Beispiel:

     git branch -f master origin/master

    oder wenn Sie 4 Übertragungen vorgenommen hätten:

     git branch -f master HEAD~4

Warnung: git branch -f master origin/master se die Tracking-Informationen zurücksetzen für diesen Zweig. Wenn Sie also Ihre master Zweig an einen anderen Ort zu schieben als origin/master dann geht diese Konfiguration verloren.

Warnung: Wenn Sie nach der Verzweigung ein rebase durchführen, besteht die Gefahr, dass einige Commits verloren gehen, was hier beschrieben . Die einzige Möglichkeit, dies zu vermeiden, ist die Erstellung eines neuen Verlaufs mit Cherry-Pick. Dieser Link beschreibt die sicherste, wenn auch weniger bequeme Methode. (Wenn Sie unübertragene Änderungen haben, müssen Sie möglicherweise git stash am Anfang und git stash pop am Ende).

49voto

Alex Burov Punkte 1631

Das übliche Szenario ist das folgende: Ich habe vergessen, den neuen Zweig für die neue Funktion zu erstellen, und habe die gesamte Arbeit im alten Funktionszweig erledigt. Ich habe die gesamte "alte" Arbeit in den Master-Zweig übertragen und möchte, dass mein neuer Zweig aus dem "Master" heraus wächst. Ich habe keinen einzigen Commit für meine neue Arbeit gemacht. Hier ist die Struktur des Zweigs: "master"->"Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

22voto

password Punkte 471

Wenn Sie es committen, können Sie auch die einzelne Commit-ID herauspicken. Ich mache das oft, wenn ich mit der Arbeit in master beginne und dann einen lokalen Zweig erstellen möchte, bevor ich zu meinem origin/ hochschiebe.

git cherry-pick <commitID>

Mit Cherry-Pick kann man eine Menge anstellen, wie beschrieben aquí aber das könnte ein Anwendungsfall für Sie sein.

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