83 Stimmen

Rückgängig machen git filter-branch

Ich habe versehentlich eine Datei aus meinem Repository gelöscht, indem ich git filter-branch verwendet habe:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch images/thumb/a.JPG' HEAD

Wie kann ich das rückgängig machen? Ist das möglich? Ist die Datei dauerhaft gelöscht?

155voto

William Seiti Mizuta Punkte 7559

Wenn Sie git filter-branch verwenden, wird eine Sicherungsdatei erstellt in

refs/original/refs/heads/master

Wenn Sie den Befehl im Zweig master verwendet haben. Sie können überprüfen, ob Sie die Sicherung im Verzeichnis .git/refs haben. Mit diesem Hintergedanken können Sie diese Sicherung verwenden, um Ihre Dateien mit wiederherzustellen:

git reset --hard refs/original/refs/heads/master

33voto

Eldar Abusalimov Punkte 22885

Vielleicht ist es eine angemessenere Methode als ein einfacher Hard-Reset auf den ursprünglichen Master, alle von git filter-branch umgeschriebenen Verweise wiederherzustellen und möglicherweise sogar Backup-Verweise danach zu löschen, um git filter-branch erneut ohne --force aufrufen zu können:

for orig_ref in $(git for-each-ref --format="%(refname)" refs/original/); do
    git update-ref "${orig_ref#refs/original/}" $orig_ref
    git update-ref -d $orig_ref  # um auch Backup-Verweise zu entfernen
done

Und danach:

git reset --hard master

UPDATE.

Hier ist eine möglicherweise etwas "git"-artigere Methode, um dasselbe ohne eine Shell-Schleife durchzuführen:

git for-each-ref --format="update %(refname:lstrip=2) %(objectname)" refs/original/ | git update-ref --stdin
git for-each-ref --format="delete %(refname) %(objectname)" refs/original/ | git update-ref --stdin

7voto

Mr_and_Mrs_D Punkte 29254

Eine viel sauberere Lösung wird in dieser Antwort von @jthill gegeben.

git fetch . +refs/original/*:*

Wie in dieser Antwort erwähnt, müssen Sie möglicherweise den HEAD abtrennen, wenn der aktuell ausgecheckte Branch wiederhergestellt werden soll.

Um die refs/original Referenzen zu löschen, verwenden Sie:

git for-each-ref refs/original --format='delete %(refname) %(objectname)' | git update-ref --stdin

5voto

che Punkte 11861

Es ist möglich, dass Ihre alte Branch-Spitze in Ihrem Reflog erhalten bleibt. Dann sollten Sie in der Lage sein, den unveränderten Commit mit der gesamten vorherigen Historie auszuchecken.

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