änderungen - git pull




Eine gelöschte Datei in einem Git-Repository suchen und wiederherstellen (14)

Angenommen, ich bin in einem Git-Repository. Ich lösche eine Datei und bestätige diese Änderung. Ich arbeite weiter und mache weitere Verpflichtungen. Dann muss ich die Datei wiederherstellen.

Ich weiß, dass ich eine Datei mit git checkout HEAD^ foo.bar , aber ich weiß nicht wirklich, wann diese Datei gelöscht wurde.

  1. Was wäre der schnellste Weg, um das Commit zu finden, das einen bestimmten Dateinamen gelöscht hat?
  2. Was wäre der einfachste Weg, um diese Datei wieder in meine Arbeitskopie zu bekommen?

Ich hoffe, ich muss meine Protokolle nicht manuell durchsuchen, das gesamte Projekt nach einem bestimmten SHA auschecken und diese Datei dann manuell in mein ursprüngliches Projekt-Checkout kopieren.


git undelete path/to/file.ext

  1. .bash_profile Sie dies in Ihr .bash_profile (oder eine andere relevante Datei, die beim Öffnen einer Befehlsshell .bash_profile ) ein:

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. Dann benutze:

    git undelete path/to/file.ext
    

Dieser Alias ​​sucht zuerst nach dem letzten Commit, an dem diese Datei vorhanden war, und führt dann eine Überprüfung des Dateipfads durch, bei dem der letzte Commit ausgeführt wurde, an dem diese Datei vorhanden war. source


  1. Verwenden Sie git log --diff-filter=D --summary , um alle Commits zu erhalten, bei denen Dateien gelöscht und die Dateien gelöscht wurden.
  2. Verwenden Sie git checkout $commit~1 filename , um die gelöschte Datei wiederherzustellen.

Dabei ist $commit der Wert des Commits, das Sie in Schritt 1 gefunden haben, z. B. e4cf499627


Einfach und präzise

Zuallererst erhalten Sie ein aktuelles stabiles Commit, in dem Sie diese Datei haben, indem Sie

git log 

Angenommen, Sie finden $ commitid 1234567 ... dann

git checkout <$commitid> $fileName

Dadurch wird die Dateiversion wiederhergestellt, die in diesem Commit enthalten war.


Ich habe diese Lösung .

  1. Rufen Sie die ID des Commits ab, bei dem die Datei mit einer der folgenden Methoden gelöscht wurde.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # wird empfohlen, wenn Sie sich an nichts erinnern
  2. Sie sollten etwas bekommen wie:

begehen bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexander Orlov Datum: Do Mai 12 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

Commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autor: Alexander Orlov Datum: Do 12. Mai 22:10:22 2011 +0200

3 Verwenden Sie nun die Festschreibungs-ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Da die Commit-ID auf das Commit verweist, bei dem die Datei bereits gelöscht wurde, müssen Sie auf das Commit vor bfe68b verweisen, was Sie durch Anhängen von ^1 tun können. Das heißt: Gib mir das Commit kurz vor bfe68b.


Ich kam zu dieser Frage und wollte eine Datei wiederherstellen, die ich gerade gelöscht habe, aber ich hatte die Änderung noch nicht vorgenommen. Für den Fall, dass Sie sich in dieser Situation befinden, müssen Sie nur Folgendes tun:

git checkout HEAD -- path/to/file.ext


In unserem Fall haben wir versehentlich Dateien in einem Commit gelöscht, und einige Commits später haben wir unseren Fehler erkannt und wollten alle gelöschten Dateien zurückerhalten, nicht jedoch die, die geändert wurden.

Basierend auf der hervorragenden Antwort von Charles Bailey ist hier mein einziger Liner:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

Mein neuer Lieblingsalias, basierend auf der answer bonyiii (angehoben), und meine eigene Antwort zum bonyiii "Übergeben eines Arguments an einen Git- Aliasbefehl":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

Ich habe eine Datei verloren, die vor einigen Commits versehentlich gelöscht wurde.
Schnell:

git restore my_deleted_file

Krise abgewendet.

Robert Dailey schlägt in den Kommentaren folgenden Alias ​​vor:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

Und jegan fügt in den Kommentaren hinzu :

Um den Alias ​​von der Kommandozeile aus einzustellen, habe ich diesen Befehl verwendet:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

So stellen Sie eine gelöschte und festgeschriebene Datei wieder her:

git reset HEAD some/path
git checkout -- some/path

Es wurde mit Git Version 1.7.5.4 getestet.


Um alle gelöschten Dateien in einem Ordner wiederherzustellen, geben Sie den folgenden Befehl ein.

git ls-files -d | xargs git checkout --

Wenn Sie den Commit kennen, der die Datei (en) gelöscht hat, führen Sie den folgenden Befehl aus, wobei <SHA1_deletion> der Commit ist, der die Datei gelöscht hat:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

Der Teil vor der Pipe listet alle Dateien auf, die im Commit gelöscht wurden. Sie sind alle aus dem vorherigen Commit ausgecheckt, um sie wiederherzustellen.


Wenn Sie nur Änderungen vorgenommen und eine Datei gelöscht haben, aber nicht festschreiben, haben Sie Ihre Änderungen jetzt getrennt

git checkout -- .

Ihre gelöschten Dateien wurden jedoch nicht zurückgegeben. Sie geben einfach den folgenden Befehl ein:

git checkout <file_path>

Und presto, deine Akte ist zurück.


Wenn Sie verrückt sind, verwenden Sie git-bisect . Hier ist was zu tun ist:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Jetzt ist es an der Zeit, den automatisierten Test durchzuführen. Der Shell-Befehl '[ -e foo.bar ]' gibt 0 zurück, wenn foo.bar vorhanden ist, andernfalls 1. Der "run" -Befehl von git-bisect verwendet die binäre Suche, um automatisch das erste Commit zu finden, bei dem der Test fehlschlägt. Es beginnt in der Mitte des angegebenen Bereichs (von gut bis schlecht) und halbiert es auf der Grundlage des Ergebnisses des angegebenen Tests.

git bisect run '[ -e foo.bar ]'

Jetzt bist du beim Commit, der es gelöscht hat. Von hier aus können Sie in die Zukunft zurückspringen und git-revert , um die Änderung rückgängig zu machen.

git bisect reset
git revert <the offending commit>

oder Sie könnten einen Commit zurückgehen und den Schaden manuell prüfen:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

git checkout /path/to/deleted.file





git-checkout