Rettung von Dateien und Commits von "no branch" in git


11

Ich fing an, an einigen Dateien zu arbeiten, die ich in einem Git-Submodul unter einem anderen Projekt hatte. Da es sich jedoch um ein Git-Submodul handelte, wurde "master" nie ausgecheckt, sondern nur der Kopf ausgecheckt und alle Dateien im Ordner "no branch" abgelegt.

Nachdem ich versehentlich einige Änderungen an diesen Dateien vorgenommen habe, habe ich gerade festgestellt, dass ich in einem Submodul "kein Zweig" meines Projekts arbeite.

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

Antworten:


28

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 es git merge $COMMIT_SHAeinmal gemacht, als ich in der anderen Filiale war.
Xeoncross

3

Der Status "kein Zweig" wird als losgelöster HEAD bezeichnet. Dies wird genannt, weil die HEAD-Referenz keinem Zweig zugeordnet ist, sondern direkt auf ein Commit zeigt. Verwenden Sie, um HEAD an einen Zweig anzuhängen, der auf das aktuelle HEAD-Commit verweist git checkout -b branchname.

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

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

Oder verwenden Sie gleichwertig die Reflog-Notation HEAD@{1}, um zu vermeiden, dass der temporäre Zweig erstellt werden muss:

git checkout branchname
git merge HEAD@{1}

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, das Sie verwenden können git branch -f branchname && git checkout branchname. Wenn das Festschreiben bei HEAD nicht auf dem aktuellen Tipp des Zweignamens basiert, führt dies zu einer nicht schnellen Änderung des Zweignamens, die Sie normalerweise vermeiden möchten (dies wird als Umschreiben des Verlaufs angesehen).


Beachten Sie, dass bei dieser Antwort davon ausgegangen wird, dass der HEAD immer noch auf das letzte Commit zeigt, das sich nicht in einem Zweig befand. Wenn Sie den HEAD seitdem verschoben haben und erst jetzt erkannt haben, was passiert ist, müssen Sie möglicherweise im Reflog nach dem verlorenen Commit suchen (siehe Mipadis Antwort).
LarsH

1

So fügen Sie frühere Antworten hinzu:

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

git tag <some-tag>

Dadurch wird dem Commit ein Tag hinzugefügt , das es in gitkund anderen Tools sichtbar macht .

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.