Git: "Derzeit nicht in einem Zweig." Gibt es eine einfache Möglichkeit, zu einem Zweig zurückzukehren, während die Änderungen beibehalten werden?

201

Ich habe also einige Arbeiten im Repository durchgeführt und als ich mich verpflichten möchte, stelle ich fest, dass ich derzeit in keinem Zweig bin.

Dies passiert häufig bei der Arbeit mit Submodulen und ich kann es lösen, aber der Prozess ist langwierig und ich habe gedacht, dass es einen einfacheren Weg geben muss, dies zu tun.

Gibt es eine einfache Möglichkeit, zu einem Zweig zurückzukehren, während die Änderungen beibehalten werden?

Erik B.
quelle

Antworten:

213

Wenn Sie nicht verpflichtet haben:

git stash
git checkout some-branch
git stash pop

Wenn Sie sich verpflichtet haben und seitdem nichts geändert haben:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Wenn Sie sich verpflichtet haben und dann zusätzliche Arbeit geleistet haben:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop
araqnid
quelle
16
Dieser hilft nicht, wenn Sie sich bereits verpflichtet haben. Keine Ablehnung, da dies in der Frage nicht angegeben wurde.
Dean Rather
24
Wenn Sie bereits ein Commit durchgeführt haben: Notieren Sie sich den Hash des von Ihnen vorgenommenen Commits (verwenden Sie git showoder git rev-parse HEAD), wechseln Sie zum Zweig und anschließend git cherry-pickden Commit-Hash.
Araqnid
7
Wenn festgeschrieben, erhalten Sie den Hash des letzten Festschreibens. Kasse der Filiale, in der Sie sein möchten, undgit merge _hash_
Daniel
Seien Sie wirklich vorsichtig. WENN SIE DIE ÄNDERUNG VERPFLICHTET HABEN und diese Schritte ausführen ... wird die Meldung angezeigt ... "Ihr Zweig und Ihre Herkunft / Ihr Master sind auseinander gegangen".
Thinkanotherone
1
@thinkanotherone Wenn Sie Ihre Änderungen bereits festgeschrieben haben, gibt es nichts zu verstauen, und das Auschecken eines anderen Zweigs ist nicht das Ende der Welt. Das soeben vorgenommene Commit ist noch vorhanden, und Sie können es mithilfe von zu diesem Zweig zusammenführen git merge <hash-of-the-commit-you-just-made>.
Erik B
160

das hat mir geholfen

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
babay
quelle
25
Wenn Sie bereits mehrere Commits durchgeführt haben, müssen Sie dies tun.
Benjamin Oakes
Ich habe es nicht versucht, aber es sieht so aus, als würde es funktionieren. Ich denke jedoch, dass es ein unwahrscheinliches Szenario ist. Ich glaube, die meisten Leute werden erkennen, dass sie sich in keinem Zweig befinden, bevor sie sich verpflichten und die akzeptierte Antwort verwenden, um dies zu beheben.
Erik B
49
Du wärst überrascht.
Eric
@ErikB Ich wusste nicht einmal, dass es so etwas wie nicht in einer Filiale gibt. Diese Antwort war sehr hilfreich für mich.
Konstantin Schubert
2
schöne Antwort, eigentlich nur eingetippt und funktioniert, im Gegensatz zu so ziemlich allem anderen, was man als GIT-Anfänger erlebt - man möchte vielleicht darauf hinweisen, dass newbranch ein britischer Name ist und nicht durch einen Commit-Hash ersetzt werden soll
Toni Leigh
22
git checkout master

Das Ergebnis ist ungefähr so:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Also machen wir's:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e
m_messiah
quelle
Ich habe es nicht ausprobiert, aber es scheint, als würde es gut funktionieren. Ich denke, wenn Sie git gczwischen dem Ausführen dieser beiden Befehle laufen würden, würden Sie diese Commits verlieren, aber wenn Sie nicht git gcautomatisch ausgeführt werden, sollte dies ein ziemlich risikofreier Ansatz sein. Ich würde immer noch mit Babays Antwort gehen, aber wenn Sie sich ersparen möchten, zwei zusätzliche Befehle zu schreiben, ist dies wahrscheinlich der richtige Weg.
Erik B
Ich hatte irgendwann die Hauptniederlassung verlassen, da bin ich mir nicht ganz sicher. Ich hatte meine Änderungen festgeschrieben, es gab keine Änderungen am Master. Diese Anweisungen brachten meine Änderungen in die Hauptniederlassung und alles Gute.
Matti Jokipii
+1 Ich war nervös, einen anderen Zweig auszuchecken, während ich Commits hinter mir ließ, und sah, dass diese Nachricht das Vertrauen in sie steigerte.
J-Dizzle
11

Hier einen anderen Weg verlassen

git branch newbranch
git checkout master 
git merge newbranch 
Beobachter
quelle
3
@ErikB Er hat möglicherweise mehrere Commits durchgeführt. In diesem Fall siehe Babays Antwort.
Benjamin Oakes
@BenjaminOakes Das mag sein, aber diese Git-Befehle sind nicht einmal gültig.
Erik B
@ErikB Auf jeden Fall wahr. :) Babays Antwort ist die gültige Form dessen, was Alex versucht zu haben scheint.
Benjamin Oakes
9

Alternativ können Sie Ihre Submodule so einrichten, dass Sie einen Zweig auschecken, anstatt sich in ihrem Standardzustand mit getrenntem Kopf zu befinden.

Bearbeitet, um hinzuzufügen:

Eine Möglichkeit besteht darin, einen bestimmten Zweig des Submoduls auszuchecken, wenn Sie ihn mit dem Flag -b hinzufügen:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Eine andere Möglichkeit besteht darin, einfach in das Submodulverzeichnis zu gehen und es auszuchecken

git checkout master
Abizern
quelle
1
Können Sie mir sagen, wie das geht?
Erik B
Gibt es eine Möglichkeit, ein vorhandenes Submodul in diesem Standardverzweigungsmodus zu aktualisieren? Update gitmodulesvielleicht?
Hertzel Guinness
@HertzelGuinness Nicht wirklich. Das Submodul wird bei einem bestimmten Commit sha ausgecheckt. Ein Zweig ist nur ein Zeiger auf das sha und das sha, auf das er zeigt, kann sich ändern. Dies ist nicht sinnvoll, da der Status des ausgecheckten Submoduls nicht eingefroren wird. Das Auschecken eines Zweigs ist nur eine Annehmlichkeit, wenn Sie Änderungen am Submodul vornehmen.
Abizern
5

Eine Möglichkeit, in dieser Situation zu enden, besteht darin, eine Rebase von einem Remote-Zweig durchzuführen. In diesem Fall wird auf die neuen Commits verwiesen, HEADaber masternicht auf sie. Sie zeigen auf den Ort, an dem sie sich befanden, bevor Sie den anderen Zweig neu gegründet haben.

Sie können dieses Commit zu Ihrem neuen machen, masterindem Sie Folgendes tun:

git branch -f master HEAD
git checkout master

Dies wird zwangsweise aktualisiert master, um auf HEAD(ohne Sie anzulegen) zu verweisen, und wechselt masterdann zu master.

Ian
quelle
Funktionierte perfekt nach Bedarf. Ich hatte die Dateien bereits bereitgestellt und festgeschrieben, konnte sie jedoch aufgrund des oben genannten Fehlers nicht übertragen. Über zwei Codezeilen funktionierte einwandfrei und schob meinen Code wie erwartet.
invinciblemuffi
4

Ich bin kürzlich wieder auf dieses Problem gestoßen. Es ist eine Weile her, seit ich das letzte Mal mit Submodulen gearbeitet habe und nachdem ich mehr über Git erfahren habe, wurde mir klar, dass es ausreicht, nur den Zweig zu überprüfen, für den Sie sich festlegen möchten. Git behält den Arbeitsbaum auch dann bei, wenn Sie ihn nicht verstauen.

git checkout existing_branch_name

Wenn Sie an einem neuen Zweig arbeiten möchten, sollte dies für Sie funktionieren:

git checkout -b new_branch_name

Das Auschecken schlägt fehl, wenn Sie Konflikte im Arbeitsbaum haben, aber das sollte ziemlich ungewöhnlich sein. Wenn dies passiert, können Sie es einfach verstauen, einfügen und den Konflikt lösen.

Im Vergleich zur akzeptierten Antwort erspart Ihnen diese Antwort die Ausführung von zwei Befehlen, deren Ausführung ohnehin nicht so lange dauert. Daher werde ich diese Antwort nicht akzeptieren, es sei denn, sie erhält auf wundersame Weise mehr positive Stimmen (oder zumindest mehr Stimmen) als die derzeit akzeptierte Antwort.

Erik B.
quelle
2

Die folgende Methode kann funktionieren:

git rebase HEAD master
git checkout master

Dadurch werden Ihre aktuellen HEAD-Änderungen über dem Master wiederhergestellt. Dann können Sie den Zweig wechseln.


Alternativ können Sie zuerst die Filiale auschecken:

git checkout master

Dann sollte Git SHA1 Ihrer getrennten Commits anzeigen, dann können Sie sie auswählen, z

git cherry-pick YOURSHA1

Oder Sie können auch die neueste zusammenführen:

git merge YOURSHA1

Führen Sie Folgendes aus, um alle Ihre Commits aus verschiedenen Branchen anzuzeigen (um sicherzustellen, dass Sie sie haben) git reflog.

Kenorb
quelle
0

Ich weiß, dass ich Babay 2012 gesagt habe, dass ich es für unwahrscheinlich halte, dass jemand nicht merkt, dass er nicht in einem Zweig ist und sich verpflichtet. Das ist mir gerade passiert, also muss ich wohl zugeben, dass ich falsch lag, aber wenn man bedenkt, dass es bis 2016 gedauert hat, bis mir das passiert ist, könnte man argumentieren, dass es tatsächlich unwahrscheinlich ist.

Wie auch immer, die Schaffung einer neuen Niederlassung ist meiner Meinung nach übertrieben. Alles was du tun musst, ist:

git checkout some-branch
git merge commit-sha

Wenn Sie das Commit-sha vor dem Auschecken des anderen Zweigs nicht kopiert haben, können Sie es leicht finden, indem Sie Folgendes ausführen:

git reflog
Erik B.
quelle
Es ist ein seltenes (unwahrscheinliches) Problem für einen Mann. Es ist mir seit 2012 nicht mehr passiert. Aber wenn Sie die Chance auf die Anzahl der Git-Benutzer multiplizieren ... wird es sehr wahrscheinlich sein. Es könnte jeden Tag jemandem passieren. :)
Babay