413 Stimmen

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

Mit git habe ich etwas wie dieses erstellt

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 mir gesagt wurde, dass ich mich auch dann noch engagieren kann, wenn ich mit dem Kopf nicht bei der Sache bin, habe ich das getan. Aber jetzt möchte ich meinen abgetrennten Head-Zweig und meinen lokalen Master-Zweig zusammenführen und dann meine Änderungen nach origin/master übertragen.

Also meine Frage ist, wie könnte ich den Master-Zweig mit meinem aktuellen Zustand (abgetrennten Kopf) zusammenführen

13voto

paradocslover Punkte 2528

Wie ich sehe, hat fast jeder eine Lösung vorgeschlagen, bei der eine temporäre Verzweigung erstellt wird. Nun muss man zugeben, dass dieses "Commit in einem losgelösten Zustand"-Problem in der Regel nach einem Commit auftritt. Und einen ganzen Zweig für diesen einen mickrigen Commit zu erstellen - klingt zu viel, oder? Vor allem in Projekten, in denen man ohnehin schon zwischen zu vielen Zweigen hin und her springt.

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

Wie kann ich das bekommen?

  1. Machen Sie eine git log . Sie würden etwa so aussehen:

    commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD) Author: Someone someone@something.com Date: So/me/day SO:ME:TI:ME

    A commit message that doesn't mean much

    commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master, master) Author: Someone someone@something.com Date: Some/other/day SOME:OTHER:TIME

    Another commit message that doesn't mean much

    commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10 Author: Someone someone@something.com Date: Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

Nun sieht es zwar wie ein normaler Fall aus, aber wenn Sie eine git push würde es heißen "Alles aktuell".

Ein aufmerksamer Mensch würde sehen, dass sie nicht "aktuell" ist. HEAD an einem anderen Ort als dem Master liegt.

  1. Und was nun? Kopieren Sie einfach die ersten Zeichen des Hashes 10bf8fe4d1 . Und machen Sie zuerst eine git checkout master . Dies würde Sie dazu bewegen master Zweigstelle. Und da Sie den Hash bereits kopiert haben. Sie können eine git merge <hash> . Machen Sie eine git log jetzt

Und VOILA:

commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD -> master)
Author: Someone <someone@something.com>
Date:   S/om/eday SO:ME:TI:ME 

    A commit message that doesn't mean much

commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master)
Author: Someone <someone@something.com>
Date:   Some/other/day SOME:OTHER:TIME 

    Another commit message that doesn't mean much

commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date:   Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

Nun, die HEAD scheint am richtigen Platz zu sein.

Jemand könnte fragen: "Was ist, wenn ich das Hasch nicht habe? Ich wusste nichts von der baumelnden Übergabe und habe einfach eine git checkout master ." Keine Sorge, ich habe eine Lösung für Sie. Sie können den Commit-Hash an zwei Stellen finden:

  1. Als Sie die git checkout master , git hatte Sie 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 ), richtig?

  1. Sagen Sie nicht, dass Sie es nicht finden können. Es ist genau dort. Aber wenn Sie es wirklich nicht können, dann können Sie eine git reflog . Es wird Ihnen etwa so etwas angezeigt:

    a3cd1ce (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 to master 10bf8fe HEAD@{1}: commit: A commit message that doesn't mean much

Siehst du, da ist der Schatz, den du gesucht hast... Die Raute.

Ich denke, dies deckt alle möglichen Szenarien ab, die in einem losgelösten Zustand mit einer hängenden Übergabe passieren können. Vorsicht beim nächsten Mal!

7voto

Razan Paul Punkte 12902

Im Falle eines abgetrennten HEAD funktionieren die Übertragungen wie üblich, nur dass kein benannter Zweig aktualisiert wird. Um den Master-Zweig mit Ihren Commit-Änderungen zu aktualisieren, erstellen Sie einen temporären Zweig, in dem Sie sich befinden (auf diese Weise enthält der temporäre Zweig alle Commit-Änderungen, die Sie im abgetrennten HEAD vorgenommen haben), wechseln Sie dann zum Master-Zweig und führen Sie den temporären Zweig mit dem Master-Zweig zusammen.

git branch  temp
git checkout master
git merge temp

3voto

Nesha Zoric Punkte 5358

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

Auf diese Weise werden alle von Ihnen vorgenommenen Änderungen in diesem Zweig gespeichert. Falls Sie Ihren Master-Zweig von übrig gebliebenen Übertragungen bereinigen müssen, führen Sie bitte git reset --hard master .

Dabei werden Sie Ihre Zweige neu schreiben, also achten Sie darauf, dass Sie niemanden mit diesen Änderungen stören. Schauen Sie sich unbedingt diesen Artikel an, um eine bessere Veranschaulichung zu erhalten abgetrennter KOPF Zustand.

3voto

Checkout actual-branch

git merge {{commit-hash}}

2voto

Simeon Punkte 586

Als ich den Checkout durchgeführt habe, der zu einem abgetrennten Kopf führt, sagt mir Git tatsächlich, was ich in einem solchen Fall tun soll:

git switch -c \<new-branchname>

Das Ergebnis ist der Master wie vor der Abtrennung des Head und der neue Branch, der alle Commits enthält, die während der Arbeit im abgetrennten Head-Status gemacht wurden.

Ausführlicher wiedergeben/prüfen/verstehen:

  1. Erstellung eines Testrepos mit zwei Commits:
~/gittest$ git log --oneline 
17c34c0 (HEAD -> master) 2
5975930 1
  1. Vorherige Übergabe prüfen 1

~/gittest$ git checkout 5975930

Diese deutsche Nachricht wird angezeigt

Hinweis: Wechsle zu '5975930'.

Sie befinden sich im Zustand eines 'losgelösten HEAD'. Sie können sich umschauen, experimentelle Änderungen vornehmen und diese committen, und Sie können alle möglichen Commits, die Sie in diesem Zustand machen, ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie zu einem anderen Branch wechseln.

Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits zu behalten, können Sie das (jetzt oder später) durch Nutzung von 'switch' mit der Option -c tun. Beispiel:

git switch -c \<neuer-Branchname>

Oder um diese Operation rückgängig zu machen: git switch -

Sie können diesen Hinweis ausschalten, indem Sie die Konfigurationsvariable 'advice.detachedHead' auf 'false' setzen.

HEAD ist jetzt bei 5975930 1

was ins Englische übersetzt soviel bedeutet wie:

Hinweis: Änderung in '5975930'.

Sie befinden sich im Zustand eines "losgelösten KOPFES". Sie können sich umsehen, experimentelle Änderungen vornehmen und diese übertragen, und Sie können alle Commits verwerfen, die Sie in diesem Zustand machen, ohne einen Zweig zu beeinflussen indem Sie zu einem anderen Zweig wechseln.

Wenn Sie einen neuen Zweig erstellen wollen, um Ihre erstellten Commits zu behalten, können Sie das (jetzt oder später) tun, indem Sie 'switch' mit der Option -c verwenden. Beispiel:

git switch -c <new-branch-name>.

Oder um diesen Vorgang rückgängig zu machen: git switch -.

Sie können diesen Hinweis deaktivieren, indem Sie die Konfigurationsvariable "advice.detachedHead" auf "false" setzen.

HEAD ist jetzt bei 5975930 1

(Übersetzt mit www.DeepL.com/Translator (kostenlose Version))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X