Was tun mit einem Commit, das in einem abgetrennten Kopf gemacht wurde?

Lesezeit: 8 Minuten

Was tun mit einem Commit das in einem abgetrennten Kopf
Benzol

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 sagte, dass ich mich immer noch binden kann, wenn ich mich in einem losgelösten Kopfzustand befinde, habe ich es getan. Aber jetzt möchte ich gerne meinen Detached-Head-Branch und meinen Local-Master-Branch zusammenführen und dann meine Reihe von Änderungen an Origin/Master pushen.

Meine Frage ist also, wie ich den Master-Zweig mit meinem tatsächlichen Zustand (abgetrennter Kopf) zusammenführen könnte.

  • mögliches Duplikat von Git: HEAD ist verschwunden, möchte es mit Master zusammenführen

    – Karl Bielefeldt

    19. August 2011 um 17:10 Uhr

  • Ich könnte einen Screenshot eines Commit-Baums in diesem Zustand hinzufügen (wie ein Commit auf einem abgetrennten Kopf tatsächlich in Gitk oder SourceTree aussieht), das würde diese Frage noch besser machen.

    – Florisla

    6. Mai 2015 um 11:41 Uhr

  • Leider kann ich im Moment nicht, aber wenn Sie etwas zur Verfügung stellen können, freue ich mich, es hier zu sehen. Selbst wenn es ein Unentschieden sein muss, wird es klarer

    – Benzol

    6. Mai 2015 um 15:11 Uhr

Erstellen Sie dort, wo Sie sich gerade befinden, einen Zweig, wechseln Sie dann zum Master und führen Sie ihn zusammen:

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

  • Wie vermeidet man in Zukunft das Abnehmen von Köpfen?

    – ycomp

    4. März 2016 um 4:17 Uhr

  • Ich tat dies und befand mich um 5 Commits vor dem Ursprung. Machst du in diesem Fall einfach git push origin?

    – Winnemucca

    5. April 2016 um 23:31 Uhr

  • seltsam, ich bekomme “bereits aktuell”. beim Zusammenführen der my-temporary-work

    – Robert Sinclair

    22. September 2016 um 17:37 Uhr

  • Vergessen Sie nicht, meine temporäre Arbeit mit “git branch -d my-temporary-work” zu löschen.

    – Kapitän Lepton

    27. Februar 2017 um 16:57 Uhr

  • @ycomp “detached head” tritt auf, wenn Sie die Dateien eines alten Commit bearbeiten und diese dann ohne Verzweigung festschreiben, um später auf dieses neue Commit zu verweisen. Checken Sie keine alten Commits aus, um einen abgetrennten Kopf zu vermeiden. Wenn Sie immer noch alle Dateien von dort haben möchten, aber als neuen Commit, dann könnten Sie das Verzeichnis aus dem Commit auschecken, anstatt den Commit selbst. Siehe diese Antwort

    – Klarbrot

    3. Dezember 2017 um 10:35 Uhr


Was tun mit einem Commit das in einem abgetrennten Kopf
CB Bailey

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

git checkout master
git merge [email protected]{1}

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

  • Ich weiß, das ist Jahre später, aber danke für diese Antwort. Ich hielt mich nicht für fertig mit der Suche nach der akzeptierten Antwort hier, weil ich keinen temporären Zweig hinterlassen wollte und diese Antwort den Befehl hat, ihn zu löschen.

    – Jeremy Pridemore

    4. März 2014 um 23:26 Uhr

  • Wenn Sie sich entscheiden, den Befehl zu verwenden git merge [email protected]{1} Sie sollten wahrscheinlich sicherstellen, dass dies diejenige ist, die Sie verwenden möchten, indem Sie verwenden git reflog

    – Michael Stramel

    3. Februar 2015 um 18:46 Uhr

  • Die Möglichkeit, [email protected]{1} zusammenzuführen, hat mir das Leben gerettet, da ich den Master bereits präventiv ausgecheckt hatte.

    – Juli

    13. Juli 2016 um 21:44 Uhr

1646255890 696 Was tun mit einem Commit das in einem abgetrennten Kopf
Bhushan

Folgendes habe ich getan:

Denken Sie grundsätzlich an die detached HEAD als neuer Zweig, ohne Namen. Sie können sich in diesen Branch wie in jeden anderen Branch einschreiben. Sobald Sie mit dem Festschreiben fertig sind, möchten Sie es auf die Fernbedienung übertragen.

Das erste, was Sie tun müssen, ist dies zu geben detached HEAD ein Name. 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 Remote verschieben.

In meinem Fall wollte ich diesen Zweig auch schnell vorspulen, um ihn zusammen mit den Commits, die ich in gemacht habe, zu meistern detached HEAD (jetzt some-new-branch). Alles, was ich tat, war

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.

  • Diese Antwort funktionierte für mich, wo die anderen nicht funktionierten. git checkout -b new-branch hat bei mir funktioniert. Die anderen Vorschläge verlangten git branch new-branchaber das ließ mich immer noch in einem distanzierten Kopf zurück und der neue Zweig nahm meine Änderungen nicht auf.

    – Jesse Patel

    3. Mai 2018 um 20:59 Uhr


  • @JessePatel Das liegt daran, dass Sie nur mit “git branch new-branch” einen Zweig erstellen und HEAD (den aktuellen Ort, an dem Sie gerade suchen / in dem Sie arbeiten) in diesen Zweig verschieben müssen, indem Sie “git checkout new-branch” ausführen. Das Flag “-b” in “git checkout -b new-branch” bedeutet, dass Sie einen Zweig erstellen, bevor Sie HEAD in diesen Zweig verschieben. Wie 2 Befehle in einem.

    – Postermaestro

    25. Januar um 8:30 Uhr

Du kannst einfach tun git merge <commit-number> oder git 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

Alternativ könnten Sie die Commit-ID in Ihrem Zweig auswählen.

<commit-id> made in detached head state

git checkout master

git cherry-pick <commit-id>

Keine temporären Zweige, kein Zusammenführen.

1646255891 449 Was tun mit einem Commit das in einem abgetrennten Kopf
Razan Paul

Im Fall von getrenntem HEAD funktionieren Commits wie gewohnt, außer dass kein benannter Zweig aktualisiert wird. Um den Master-Branch mit Ihren festgeschriebenen Änderungen zu aktualisieren, erstellen Sie dort, wo Sie sich befinden, einen temporären Branch (auf diese Weise enthält der temporäre Branch alle festgeschriebenen Änderungen, die Sie im abgetrennten HEAD vorgenommen haben), wechseln Sie dann zum Master-Branch und führen Sie den temporären Branch mit zusammen der Meister.

git branch  temp
git checkout master
git merge temp

Ich sehe, dass fast jeder eine Lösung vorgeschlagen hat, bei der ein temporärer Zweig erstellt wird. Nun muss man zugeben, dass, wann immer dieses „Committed in a Detached State“-Problem auftritt, es im Allgemeinen nach einem Commit erkannt wird. Und einen ganzen Branch für diesen einen mickrigen Commit zu erstellen – Klingt zu viel, oder? Vor allem in Projekten, wo man schon zwischen zu vielen Ästen herumspringt.

Was ist dann der einfache Weg? Verwenden Sie den Commit-Hash!

Wie bekomme ich das?

  1. Mach ein git log. Sie würden so etwas sehen:
commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD)
Author: Someone <[email protected]>
Date:   So/me/day SO:ME:TI:ME 

    A commit message that doesn't mean much

commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master, master)
Author: Someone <[email protected]>
Date:   Some/other/day SOME:OTHER:TIME 

    Another commit message that doesn't mean much

commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <[email protected]>
Date:   Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

Nun sieht es zwar nach einem Normalfall aus, aber wenn man das macht git push es würde sagen “Alles aktuell”.

Eine vorsichtige Person würde sehen, dass es nicht “aktuell” ist. HEAD ist woanders als der Meister.

  1. Also, was als nächstes? Kopieren Sie einfach die Anfangszeichen des Hashs 10bf8fe4d1. Und machen Sie zuerst a git checkout master. Das würde Sie bewegen master sich verzeigen. Und jetzt, da Sie den Hash bereits kopiert haben. Sie können eine git merge <hash>. Mach ein git log jetzt

Und VOILA:

commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD -> master)
Author: Someone <[email protected]>
Date:   S/om/eday SO:ME:TI:ME 

    A commit message that doesn't mean much

commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master)
Author: Someone <[email protected]>
Date:   Some/other/day SOME:OTHER:TIME 

    Another commit message that doesn't mean much

commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <[email protected]>
Date:   Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

Jetzt die HEAD scheint an der richtigen Stelle zu sein.

Jemand könnte fragen: „Was ist, wenn ich den Hash nicht habe? Ich wusste nichts über den Dangling Commit und habe einfach einen gemacht git checkout master.” Keine Sorge, ich habe alles im Griff. Sie können den Commit-Hash an zwei Stellen finden:

  1. Als du das gemacht hast git checkout master, git hatte dich so gewarnt
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  10bf8fe A commit message that doesn't mean much

If you want to keep it by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 10bf8fe

Switched to branch 'master'

Sie können Ihren Schatz sehen (hash), rechts?

  1. Sag mir nicht, du kannst es nicht finden. Es ist genau da. Aber wenn du es wirklich nicht kannst, dann kannst du es tun git reflog. Es wird Ihnen so etwas zeigen:
a3cd1ce (HEAD -> master, origin/master) [email protected]{0}: checkout: moving from 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 to master
10bf8fe [email protected]{1}: commit:  A commit message that doesn't mean much

Du siehst, da ist der Schatz, nach dem du gesucht hast… Das Haschisch.

Ich denke, dies deckt alle möglichen Szenarien ab, die in einem getrennten Zustand mit einem baumelnden Commit auftreten könnten. Vorsicht beim nächsten Mal!!

916220cookie-checkWas tun mit einem Commit, das in einem abgetrennten Kopf gemacht wurde?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy