Was tun mit Commit in einem abgetrennten Kopf?


279

Mit git habe ich so etwas gemacht

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

Weil es mir gesagt hat, dass ich mich immer noch verpflichten kann, wenn ich mich in einem Zustand mit losgelöstem Kopf befinde, habe ich es getan. Aber jetzt möchte ich meinen abgetrennten Hauptzweig und meinen lokalen Hauptzweig zusammenführen und dann meine Änderungen an origin / master verschieben.

Meine Frage ist also, wie ich den Hauptzweig mit meinem tatsächlichen Zustand (losgelöster Kopf) zusammenführen kann.



Wenn Sie in diesem Zustand einen Screenshot eines Commit-Baums hinzufügen könnten (wie ein Commit auf einem abgetrennten Kopf in gitk oder SourceTree tatsächlich aussieht), würde dies diese Frage noch besser machen.
Florida

Unglück im Moment kann ich nicht, aber wenn Sie zur Verfügung stellen können, werde ich mich freuen, es hier zu sehen. Auch wenn es ein Unentschieden sein muss, wird es klarer machen
Benzol

Antworten:


476

Erstellen Sie einen Zweig, in dem Sie sich befinden, wechseln Sie dann zum Master und führen Sie ihn zusammen:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
Wie vermeidet man es in Zukunft, Köpfe abzunehmen?
ycomp

Ich tat dies und befand mich mit 5 Commits vor dem Ursprung. In diesem Fall machst du nur Git Push Origin?
Winnemucca

5
seltsam, ich bekomme "Schon auf dem neuesten Stand". beim Zusammenführen der meine-temporäre-Arbeit
Robert Sinclair

10
Vergessen Sie nicht, meine temporäre Arbeit mit "git branch -d my-temporäre Arbeit" zu löschen
Captain Lepton

5
@ycomp "losgelöster Kopf" tritt auf, wenn Sie die Dateien eines alten Commits bearbeiten und dann diejenigen ohne Verzweigung festschreiben, um später auf dieses neue Commit zu verweisen. Überprüfen Sie keine alten Commits, um ein Abnehmen des Kopfes zu vermeiden. Wenn Sie weiterhin alle Dateien von dort möchten, jedoch als neues Commit, können Sie das Verzeichnis anstelle des Commits selbst aus dem Commit auschecken. Siehe diese Antwort
lucidbrot

96

Sie könnten so etwas tun.

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

Noch einfacher wäre es

git checkout master
git merge HEAD@{1}

Dies birgt jedoch die geringe Gefahr, dass es etwas schwieriger sein kann, die auf dem abgetrennten Kopf vorgenommenen Festschreibungen wiederherzustellen, wenn Sie einen Fehler machen.


4
Ich weiß, dass dies Jahre später ist, aber danke für diese Antwort. Ich habe mich nicht als erledigt angesehen, mit der akzeptierten Antwort hier zu suchen, weil ich keinen temporären Zweig verlassen wollte und diese Antwort den Befehl hat, sie zu löschen.
Jeremy Pridemore

8
Wenn Sie sich für die Verwendung des Befehls entscheiden, git merge HEAD@{1}sollten Sie wahrscheinlich sicherstellen, dass dies der Befehl ist, den Sie verwenden möchtengit reflog
Michael Stramel

3
Die Möglichkeit, HEAD @ {1} zusammenzuführen, hat mir das Leben gerettet, da ich den Master bereits präventiv ausgecheckt hatte.
Juni

seltsam, ich bekomme "Schon auf dem neuesten Stand". beim Zusammenführen von tmp (aber die Dateien sind unterschiedlich)
Robert Sinclair

18

Das habe ich getan:

Stellen Sie sich das detached HEADals einen neuen Zweig ohne Namen vor. Sie können sich wie jeder andere Zweig auf diesen Zweig festlegen. Sobald Sie mit dem Festschreiben fertig sind, möchten Sie es auf die Fernbedienung übertragen.

Das erste, was Sie tun müssen, ist, diesem detached HEADeinen Namen zu geben. Sie können es einfach so machen, während Sie dabei sind detached HEAD:

git checkout -b some-new-branch

Jetzt können Sie es wie jeden anderen Zweig auf die Fernbedienung schieben.

In meinem Fall wollte ich diesen Zweig auch schnell vorspulen, um ihn zusammen mit den Commits, die ich im detached HEAD(jetzt some-new-branch) gemacht habe, zu meistern . Ich habe nur getan

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

Natürlich habe ich es später zusammengeführt master.

Das ist alles.


1
Diese Antwort hat bei mir funktioniert, wo die anderen nicht. git checkout -b new-brancharbeitete für mich. Die anderen Vorschläge forderten git branch new-branch, aber das ließ mich immer noch im Kopf und der neue Zweig nahm meine Änderungen nicht auf.
Jesse Patel

17

Sie können einfach tun git merge <commit-number>odergit cherry-pick <commit> <commit> ...

Wie von Ryan Stewart vorgeschlagen, können Sie auch einen Zweig aus dem aktuellen HEAD erstellen:

git branch brand-name

Oder nur ein Tag:

git tag tag-name

Sie finden Ihre Commit-Nummer auf dem abgetrennten Kopf vongit rev-parse HEAD
KOGI

6

Bei getrenntem HEAD funktionieren Commits wie gewohnt, außer dass kein benannter Zweig aktualisiert wird. Um den Hauptzweig mit Ihren festgeschriebenen Änderungen zu aktualisieren, erstellen Sie einen temporären Zweig an Ihrer Position (auf diese Weise enthält der temporäre Zweig alle festgeschriebenen Änderungen, die Sie im getrennten HEAD vorgenommen haben). Wechseln Sie dann zum Hauptzweig und führen Sie den temporären Zweig mit zusammen der Meister.

git branch  temp
git checkout master
git merge temp

3

Eine einfache Lösung besteht darin, einfach einen neuen Zweig für dieses Commit zu erstellen und ihn auszuchecken : git checkout -b <branch-name> <commit-hash>.

Auf diese Weise werden alle von Ihnen vorgenommenen Änderungen in diesem Zweig gespeichert. Wenn Sie Ihren Hauptzweig von verbleibenden Commits bereinigen müssen, müssen Sie ihn ausführengit reset --hard master .

Damit schreiben Sie Ihre Filialen neu, damit Sie niemanden mit diesen Änderungen stören. Schauen Sie sich unbedingt diesen Artikel an, um den Zustand des abgetrennten HEAD besser zu veranschaulichen .


1

Vielleicht nicht die beste Lösung (schreibt die Geschichte neu), aber Sie könnten es auch tun git reset --hard <hash of detached head commit>.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.