Verschieben Sie vorhandene, nicht festgeschriebene Arbeiten in einen neuen Zweig in Git

3125

Ich habe mit der Arbeit an einem neuen Feature begonnen und nach einigem Codieren habe ich beschlossen, dass dieses Feature in einem eigenen Zweig sein sollte.

Wie verschiebe ich die vorhandenen nicht festgeschriebenen Änderungen in einen neuen Zweig und setze meinen aktuellen zurück?

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

Däne O'Connor
quelle
Das gleiche interessante Thema stackoverflow.com/q/556923/269514 ?
Gilberto

Antworten:

3642

Verwenden Sie Folgendes:

git checkout -b <new-branch>

Dadurch bleibt Ihr aktueller Zweig unverändert, Sie können einen neuen Zweig erstellen und auschecken und alle Ihre Änderungen beibehalten. Anschließend können Sie Änderungen an Dateien vornehmen, mit denen Folgendes festgeschrieben werden soll:

git add <files>

und verpflichten Sie sich zu Ihrer neuen Niederlassung mit:

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

Die Änderungen im Arbeitsverzeichnis und die im Index vorgenommenen Änderungen gehören noch keinem Zweig an . Dies ändert den Zweig, in dem diese Änderungen enden würden.

Sie müssen nicht zurückgesetzt ursprünglichen Zweig, es bleibt wie es ist. Das letzte Commit <old-branch>bleibt unverändert. Deshalb du checkout -bund dann begehen.


Update 2020 / Git 2.23

Git 2.23 fügt den neuen switchUnterbefehl hinzu , um die Verwirrung zu beseitigen, die durch die überlastete Verwendung von checkout(Verzweigen von Zweigen, Wiederherstellen von Dateien, Trennen von HEAD usw.) entsteht.

Ersetzen Sie ab dieser Version von Git den obigen Befehl durch:

git switch -c <new-branch>

Das Verhalten ist identisch und bleibt unverändert.

stricken
quelle
15
Nur um sicherzugehen, muss ich die unvollendete Funktion festschreiben, bevor ich meinen ursprünglichen Zweig zurücksetze? Oder bleiben diese nicht festgeschriebenen Dateien unabhängig vom Festschreiben erhalten?
Dane O'Connor
192
Zu Ihrer Information: Änderungen im Arbeitsverzeichnis und Änderungen im Index gehören nicht zu einem Zweig. git checkout -b <new branch>Änderungen, in denen diese Änderungen enden würden.
Jakub Narębski
152
Wenn Sie bereits eine Niederlassung haben und Ihre Änderungen in die vorhandene Niederlassung verschieben
möchten
14
Wenn Sie Ihren neuen Zweig in das Remote-Repository verschieben möchten
Dewayne
10
@JDSmith: Nicht festgeschriebene Änderungen gehören NICHT zu einem Zweig. Sie wohnen nur im Arbeitsverzeichnis git checkout ./ git reset --hardwird unrecoverably entferne sie
Knittl
329

Alternative:

  1. Speichern Sie aktuelle Änderungen in einem temporären Stash:

    $ git stash

  2. Erstellen Sie einen neuen Zweig basierend auf diesem Stash und wechseln Sie zum neuen Zweig:

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

Tipp: Verwenden Sie die Tabulatortaste, um die Eingabe des Stash-Namens zu reduzieren.

Robin Qiu
quelle
51
Wenn der andere Zweig bereits vorhanden ist, können Sie einfach mit dem Auschecken zu ihm wechseln git stash apply.
Archonic
6
Ich verstehe den Tipp "Tipp: Verwenden Sie die Tabulatortaste, um die Eingabe des Stash-Namens zu reduzieren." Nicht. Ist "stash @ {0}" nicht der Name? Ich kann es nicht erfolgreich ausführen.
Herbert
7
Warum ist dies besser als die akzeptierte Antwort stackoverflow.com/a/1394804/754997 ?
Chris Seite
10
Ich verstehe nicht, warum dies besser ist als die akzeptierte Antwort vongit checkout -b <new branch name>
Noitidart
6
Sie müssen nicht git add -Avor dem Verstauen.
Vichle
48

Wenn Sie während des Codierens Commits in Ihrem Hauptzweig vorgenommen haben, diese Commits jetzt jedoch in einen anderen Zweig verschieben möchten, ist dies ein schneller Weg:

  1. Kopieren Sie Ihren aktuellen Verlauf in einen neuen Zweig und bringen Sie auch nicht festgeschriebene Änderungen mit:

    git checkout -b <new-feature-branch>
    
  2. Erzwingen Sie nun, dass der ursprüngliche "unordentliche" Zweig zurückgesetzt wird: (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 Commits gemacht haben:

    git branch -f master HEAD~4
    

Achtung: git branch -f master origin/master wird die Tracking - Informationen zurückgesetzt für diesen Zweig. Wenn Sie IhrenmasterZweigso konfiguriert haben, dass er an einen anderen Ort alsorigin/masterdiesen verschoben wird, geht diese Konfiguration verloren.

Warnung: Es besteht auch die Gefahr, dass Sie nach der Verzweigung, die hier beschrieben wird , die Basis neu festlegen. Die einzige Möglichkeit, dies zu vermeiden, besteht darin, mit Cherry-Pick einen neuen Verlauf zu erstellen. Dieser Link beschreibt die sicherste narrensichere Methode . Wenn Sie nicht festgeschriebene Änderungen vorgenommen haben, möchten Sie dies möglicherweisegit stasham Anfang undgit stash popam Endetun.

joeytwiddle
quelle
6
Dies beantwortet eine Frage, die sich geringfügig von der Frage unterscheidet, die die Operation gestellt hat. Ich habe beschlossen, diese Antwort hier zu platzieren, da Google mich hierher gebracht hat, als ich nach einer Antwort gesucht habe. Die eigentliche Frage, die sich mit dieser Situation befasst, ist hier .
Joeytwiddle
26

Das häufigste Szenario ist das folgende: Ich habe vergessen, den neuen Zweig für das neue Feature zu erstellen, und habe die gesamte Arbeit im alten Feature-Zweig ausgeführt. Ich habe alle "alten" Arbeiten an den Master-Zweig übergeben, und ich möchte, dass mein neuer Zweig aus dem "Master" wächst. Ich habe kein einziges Commit für meine neue Arbeit gemacht. Hier ist die Zweigstruktur: "master" -> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
Alex Burov
quelle
18

Wenn Sie es festschreiben, können Sie auch die einzelne Festschreibungs-ID auswählen. Ich mache das oft, wenn ich anfange, im Master zu arbeiten, und dann eine lokale Niederlassung erstellen möchte, bevor ich zu meinem Ursprung aufsteige.

git cherry-pick <commitID>

Es gibt eine Menge, die Sie mit Cherry-Pick tun können, wie hier beschrieben , aber dies könnte ein Anwendungsfall für Sie sein.

Passwort
quelle
2
Schönere Lösung zum Verschieben von Teiländerungen in einen neuen Zweig ... da Sie festlegen können, was Sie jetzt möchten, alle anderen Änderungen speichern, den Zweig überprüfen, von dem aus Sie verzweigen möchten, diesen Commit für den neuen Zweig auswählen und zurückgehen Setzen Sie einen Commit auf den ursprünglichen Zweig zurück, machen Sie dann einen Stash-Pop, fügen Sie ihn hinzu, schreiben Sie ihn fest und singen Sie Halleluja.
Meredith
1
@Meredith, haha, ya so etwas. Das ist großartig, es sei denn, Sie planen Ihre Änderungen im Voraus ... und wer macht das;)
Passwort
1

Dies kann für alle hilfreich sein, die Tools für GIT verwenden

Befehl

Zweig wechseln - Ihre Änderungen werden in den neuen Zweig verschoben. Dann können Sie Änderungen festschreiben.

 $ git checkout -b <new-branch>

TortoiseGIT

Klicken Sie mit der rechten Maustaste auf Ihr Repository und verwenden Sie TortoiseGit-> Switch / Checkout

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

SourceTree

Verwenden Sie die Schaltfläche "Kasse", um den Zweig zu wechseln. Nach dem Klicken auf einen Zweig wird oben die Schaltfläche "Kasse" angezeigt. Änderungen aus dem aktuellen Zweig werden automatisch übernommen. Dann können Sie sie festschreiben.

Geben Sie hier die Bildbeschreibung ein

Przemek Struciński
quelle
0

Ich habe @Robin Antwort verwendet und alles aufgelistet , was ich getan habe.

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Wenn das Repo mehr als einen Vorrat hat, sehen Sie, welcher auf den neuen Zweig angewendet werden soll:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

und inspizieren Sie den einzelnen Vorrat durch,

git stash show stash@{1}

Oder überprüfen Sie alle Verstecke auf einmal:

git stash list -p
NBhat
quelle
0

Es gibt tatsächlich eine sehr einfache Möglichkeit, dies mit GitHub Desktop zu tun, da ich nicht glaube, dass dies zuvor eine Funktion war.

Sie müssen lediglich in GitHub Desktop zum neuen Zweig wechseln und werden aufgefordert, Ihre Änderungen im aktuellen Zweig (der gespeichert wird) zu belassen oder Ihre Änderungen in den neuen Zweig mitzunehmen. Wählen Sie einfach die zweite Option, um die Änderungen in den neuen Zweig zu übernehmen. Sie können dann wie gewohnt festschreiben.

GitHub Desktop

Kristofer Doman
quelle