Dateien und Commits von "no branch" in git retten

8063
Xeoncross

Ich begann an einigen Dateien zu arbeiten, die ich in einem git-Submodul in einem anderen Projekt hatte. Da es sich jedoch um ein git-Submodul handelt, hat es nie "master" ausgecheckt, sondern lediglich den Kopf ausgecheckt und alle Dateien im Ordner in "no branch" abgelegt.

Nun, da ich versehentlich einige Änderungen an diesen Dateien vorgenommen habe, wurde mir gerade klar, dass ich in einem "no branch", Submodul meines Projekts, arbeitete.

Wie bekomme ich diese Dateien in einen Zweig (wie Master), damit ich sie retten kann?

10

3 Antworten auf die Frage

24
mipadi

Sie können verwenden git reflog, um die "verlorenen" Commits zu finden:

$ cd submodule_dir $ git reflog # Find the commit $ git checkout master $ git cherry-pick $SHA_OF_MISSING_CMMIT 
Ja, das hat super funktioniert! außer ich habe eine `git merge $ COMMIT_SHA` gemacht, als ich in der anderen Branche war. Xeoncross vor 14 Jahren 0
3
Chris Johnsen

Der Zustand "keine Verzweigung" wird als getrennter HEAD bezeichnet. Dies wird als "HEAD ref" bezeichnet, da sie keinem Zweig zugeordnet ist, sondern direkt auf ein Commit zeigt. Verwenden Sie, um HEAD mit einem Zweig zu verknüpfen, der auf das aktuelle HEAD-Commit verweist git checkout -b branchname.

Sie können einen vorhandenen Zweig sicher aktualisieren, um die Commits in HEAD in dieser Reihenfolge einzuschließen:

git branch temp git checkout branchname git merge temp git branch -d temp 

Oder Sie verwenden gleichermaßen die Umflog-Notation HEAD@, um zu vermeiden, dass Sie den temporären Zweig erstellen müssen:

git checkout branchname git merge HEAD@ 

Die Verwendung des temporären Zweigs wäre eine gute Idee, wenn Sie die Zusammenführung nicht sofort durchführen würden.

Wenn Sie einen vorhandenen Zweig zwangsweise überschreiben möchten, um auf das Commit bei HEAD zu verweisen, können Sie dies verwenden git branch -f branchname && git checkout branchname. Wenn das Commit bei HEAD nicht auf dem aktuellen Tipp von branchname basiert, führt dies zu einer nicht schnellen Vorwärtsänderung des branchnamens, die Sie normalerweise vermeiden möchten (dies wird als Umschreibungshistorie angesehen).

Beachten Sie, dass diese Antwort davon ausgeht, dass der HEAD immer noch auf den letzten Commit-nicht-auf-einem-Zweig zeigt. Wenn Sie den HEAD seitdem verschoben haben und erst jetzt erkannt haben, was passiert ist, müssen Sie möglicherweise das verlorene Commit im Reflog suchen (siehe Antwort von Mipadi). LarsH vor 6 Jahren 0
1
data

Zu den vorherigen Antworten hinzufügen:

Während Sie sich noch auf einem separaten HEAD befinden, können Sie ein Tag hinzufügen:

git tag <some-tag> 

Dies fügt dem Commit ein Tag hinzu, das es in gitkund anderen Tools sichtbar macht .