Wie kann ich den Inhalt eines Zweigs in einen neuen lokalen Zweig kopieren?

270

Ich habe an einer lokalen Niederlassung gearbeitet und die Änderungen auch auf Remote übertragen. Ich möchte die Änderungen in diesem Zweig rückgängig machen und etwas anderes daran tun, aber ich möchte die Arbeit nicht vollständig verlieren. Ich habe mir überlegt, lokal einen neuen Zweig zu erstellen und den alten Zweig dort zu kopieren. Dann kann ich die Änderungen rückgängig machen und weiter an dem alten Zweig arbeiten. Gibt es vielleicht einen besseren Weg? Oder wie mache ich das?

serengeti12
quelle
10
4 Jahre später haben Sie mit Git 2.15 (Q4 2017) git branch -c A B. Siehe meine Antwort unten
VonC

Antworten:

444
git checkout old_branch
git branch new_branch

Dadurch erhalten Sie einen neuen Zweig "new_branch" mit demselben Status wie "old_branch".

Dieser Befehl kann wie folgt kombiniert werden:

git checkout -b new_branch old_branch
Daniel Hilgarth
quelle
134
Oder noch kürzer git checkout -b new_branch(wenn du schon dran bist old_branch).
Koraktor
4
Dadurch wird nur der neue Zweig erstellt, der Inhalt kann jedoch nicht von einem Zweig in einen anderen Zweig kopiert werden. Wenn ich diese Befehle versuche, wird nur "Der Zweig mit dem Namen **** existiert bereits" angezeigt.
Anoop
7
Ich denke, wenn man einen neuen Zweig wie diesen erstellt, hat man nicht sofort eine Kopie des alten Zweigs, sondern einfach einen neuen Zeiger am Kopf des alten Zweigs. Wenn Sie jetzt den neuen Zweig neu gründen, sollten Sie feststellen, dass sich der alte Zweig noch im ursprünglichen Zustand befindet, während der neue Zweig geändert wird. Ich denke, das macht das, was das OP will.
uli_1973
1
git checkout old_branch und dann git branch new_branch .... Es ist besser, den obigen Befehl in der Produktion zu verwenden, da der folgende Befehl einen neuen Zweig erstellt und Sie zum neuen Zweig führt (Zweig als neuen Zweig ändern) .... git checkout -b new_branch old_branch
Kiran
55
git branch copyOfMyBranch MyBranch

Dies vermeidet das möglicherweise zeitaufwändige und unnötige Auschecken eines Zweigs. Denken Sie daran, dass beim Auschecken der "Arbeitsbaum" geändert wird. Dies kann lange dauern, wenn er groß ist oder große Dateien enthält (z. B. Bilder oder Videos).

Lyle Z.
quelle
1
Wenn Sie Binärdateien in Git haben, insbesondere große, lohnt es sich wahrscheinlich, Ihre Strategie für diese Dateien zu analysieren. Natürlich wird es ungewöhnliche Fälle geben und Binärdateien in Git wären durchaus akzeptabel.
Reverend
52

Mit Git 2.15 (Q4 2017) hat " git branch" gelernt " -c/-C, einen neuen Zweig durch Kopieren eines vorhandenen zu erstellen.

Siehe Commit c8b2cec (18. Juni 2017) von Ævar Arnfjörð Bjarmason ( avar) .
Siehe Commit 52d59cc , Commit 5463caa (18. Juni 2017) von Sahil Dua ( sahildua2305) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 3b48045 , 03. Oktober 2017)

branch: füge eine --copy( -c) Option hinzu, die zu --move( -m) passt

Fügen Sie die Fähigkeit zu --copyeinem Zweig und dessen Reflog und Konfiguration hinzu. Dabei wird dieselbe zugrunde liegende Maschinerie wie bei der Option --move( -m) verwendet, außer dass das Reflog und die Konfiguration kopiert werden, anstatt verschoben zu werden.

Dies ist nützlich für zB ein Thema Zweig auf eine neue Version zu kopieren, zB workum work-2nach dem Absenden workThema in die Liste, während all Tracking - Informationen und andere Konfiguration zu bewahren , die mit dem Zweig geht, und im Gegensatz zu --movedem anderen hält bereits eingereichten Zweig herum Referenz.

Hinweis: Wenn Sie einen Zweig kopieren, bleiben Sie in Ihrem aktuellen Zweig.
Wie Junio ​​C Hamano erklärt:

Wenn Sie einen neuen Zweig erstellen, Bindem Sie den Zweig kopieren, der Azufällig der aktuelle Zweig ist, wird er auch aktualisiert HEAD, um auf den neuen Zweig zu verweisen.
Es wurde wahrscheinlich so gemacht, weil " git branch -c A B" seine Implementierung auf " git branch -m A B" huckepack genommen hat ,

Dies entspricht nicht den üblichen Erwartungen.
Wenn ich auf einem blauen Stuhl sitzen würde und jemand kommt und ihn rot lackiert, würde ich akzeptieren, dass ich auf einem Stuhl sitze, der jetzt rot ist (ich kann stattdessen auch stehen, da es meinen blauen Lieblingsstuhl nicht mehr gibt ).

Aber wenn jemand einen neuen roten Stuhl erstellt und ihn dem blauen Stuhl nachbildet, auf dem ich sitze, erwarte ich nicht, dass er vom blauen Stuhl gebootet wird und auf dem neuen roten Stuhl sitzt.

VonC
quelle