webentwicklung-frage-antwort-db.com.de

Holen Sie sich die Änderungen nach versehentlicher Kasse zurück?

Das Folgende war der Status meines Repos.

[~/Rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ gst
# On branch design
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   _layouts/default.html
#   deleted:    _site/blog/2010/04/07/welcome-to-niraj-blog/index.html
#   deleted:    _site/blog/2010/04/08/the-code-syntax-highlight/index.html
#   deleted:    _site/blog/2010/05/01/showing-demo-to-kalyan/index.html
#   deleted:    _site/config.ru
#   deleted:    _site/index.html
#   deleted:    _site/static/css/style.css
#   deleted:    _site/static/css/syntax.css
#   modified:   static/css/style.css
#
no changes added to commit (use "git add" and/or "git commit -a")

Zufällig habe ich git checkout -f gemacht und jetzt sind die Änderungen weg, die ich nicht tun sollte.

[~/Rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ git co -f
[~/Rails_apps/jekyll_apps/nepalonrails (design)] ➔ gst
# On branch design
nothing to commit (working directory clean)
[~/Rails_apps/jekyll_apps/nepalonrails (design)] ➔ 

Kann ich die Änderungen zurückbekommen?

51
Autodidact

Ich glaube nicht, dass Sie diese privaten Daten wiederherstellen können ("private" wie in "nicht im Index hinzugefügt oder festgeschrieben", also für git unbekannt), es sei denn, Sie haben einen anderen Sicherungsprozess für Ihr aktuelles Arbeitsverzeichnis.

Selbst wenn dies nicht in der Git Aliases-Seite vorgeschlagen wird, würde ich mich für einen freundlichen Alias ​​für die Kasse aussprechen (wie es die Verwendung von alias rm /bin/rm -i gibt):

[alias]
co = !sh -c 'git stash; git stash apply; git checkout "[email protected]"'

, wobei der 'git stash; git stash apply' die von Brian Campbell in seiner Antwort verwendete "Checkpoint-Technik" ist.

stason schlägt vor in den Kommentaren :

co = "!git stash Push -m \"co backup\"; git stash apply; git checkout \"[email protected]\"" 

Hinweis: Ich habe eine Nachricht hinzugefügt, um Backup-Stashes von anderen mitzuteilen. -

Diese Ausgabe erinnert mich an eine Debatte über dieses Verhalten an ycombinator (Auszüge):


Ich habe mit git viele Daten verloren.
Das meiste davon hat mit harmlos klingenden Befehlen zu tun, die beim Löschen von Daten keine Bestätigung verlangen.
Zum Beispiel ist git checkout filename äquivalent zu svn revert filename.
Natürlich macht git checkout branchname etwas völlig anderes.
Wenn eine Verzweigung und eine Datei denselben Namen haben, wechselt git standardmäßig die Verzweigungen. Dies verhindert jedoch nicht, dass bash autocomplete den Tag ruiniert.

Hier ist eine verrückte Idee: Wenn Sie eine harmlose Aktion und eine gefährliche Aktion haben, benennen Sie sie nicht mit demselben Befehl.


Ärgerlich vielleicht, aber das ist ein Benutzerfehler, kein Designfehler. Wenn ich mit git meine Arbeitskopie verlustlos verwerfen möchte, kann ich einfach "git stash".
Ihrer Logik nach ist "rm" fehlerhaft, weil Sie nicht zur Bestätigung aufgefordert werden, wenn Sie -f anstelle von -i übergeben. Gut ja. Es tut uns leid.


Ihre Analogie wäre genauer, wenn rm somename äquivalent zu apt-get update wäre und rm othernamerm -fr othername wäre.
Es kann jedoch nicht richtig sein, dass "get checkout foo" eine von zwei VOLLSTÄNDIG verschiedenen Dingen ausführt, abhängig davon, ob sich im aktuellen Verzeichnis eine Datei namens foo befindet oder nicht


Hier ist eine weitere verrückte Idee: Führen Sie nicht 'git checkout ...' in einem schmutzigen Arbeitsbaum aus. Problem gelöst.
Noch eine: Verwenden Sie Dateinamen nicht als Zweignamen.
Um ehrlich zu sein: Ich habe das gleiche Problem mit unvorsichtigen Anrufen von 'rm', die meinen Tag ruinieren, aber wenn ich Flüche murmele, liegt das an meiner Faulheit/Dummheit und nicht an bash-Vollendungen oder dem Verhalten von 'rm'

44
VonC

Eine andere Sache, die Sie betrachten können, ist durch Ihre IDE. Ich habe aus Versehen 2 Dateien ausgecheckt und konnte die Änderungen durch die 'lokale Historie' meiner IDE (Netbeans) zurückholen. Was für ein Segen!

46
gigi2

Wenn Sie diese Dateien bisher noch nicht git add oder git stash verwendet haben, ist dies leider nicht der Fall. Wenn Sie sie hinzugefügt oder verstaut haben, sollten Sie ihre Hashes über git reflog finden können.

Ich habe mich nie mit diesem destruktiven Verhalten von git checkout vertraut gemacht. Vielleicht wäre es eine sinnvolle Verbesserung, wenn diese Art von git checkout automatisch einen Stash erstellt (damit Dateien durch das Umflog erfasst werden), bevor Ihre Arbeit überschrieben wird.

20
Greg Hewgill

Für den Fall, dass Sie vim unter Linux verwenden, kann Folgendes zutreffen.

  • Wenn Dateien in einem aktiven Puffer geöffnet sind, haben Sie den Dateiinhalt, solange Sie die Datei nicht in vim neu laden, und Sie können sie wiederherstellen, indem Sie sie speichern. .

  • Wenn Dateien nicht in einem aktiven Puffer geöffnet sind, aber fehlerhaft sind, sollte sich im Quellverzeichnis eine SWP-Datei befinden, die auch eine Kopie des Inhalts enthält, der über vim -r file.swp wiederhergestellt werden kann.

  • Wenn die Dateien weder in Antive Buffer noch in Dirty geöffnet sind und sich Ihre Arbeitskopie auf einer ext3- oder ext4-Partition befindet, kann extundelete möglicherweise die kürzlich gelöschten .swp-Dateien und/oder eine ältere Version der Datei finden Quelldaten. Bereitstellen der Partition als schreibgeschützt, z. mount -o remount,ro /mnt/point und ausführen

    extundelete --recover-directory /path/to/working/copy /dev/sdaX
    

    Wenn die Partition, die die Arbeitskopie enthält, die Root-Partition ist, kann es sein, dass das Remount nicht mehr ausgeführt wird. Versuchen Sie anschließend, alle Dienste zu beenden. Wenn dies nicht der Fall ist, fahren Sie das System herunter und starten Sie es mit einer Live-CD/USB/PXE wie _ grml _. , und führen Sie das oben aus. Es gelang mir, eine von drei verlorenen Dateien auf diese Weise wiederherzustellen.

5
alexei

wenn Sie Eclipse als IDE und EGit verwenden, haben Sie in Ihrer Datei das Team-Menü:

  1. klicken Sie mit der rechten Maustaste auf Ihre Datei 
  2. Listeneintrag "Team" -> "Lokale Historie anzeigen"

in meinem Fall werden alle Versionen lokal gespeichert, ohne dass ein Name gespeichert wird. In diesem Fall können Sie jedoch problemlos alle nicht protokollierten Änderungen der git-Funktionen überprüfen und den fehlenden Code wiederherstellen.

3
Jonathan

Wenn IDE Android Studio ist, öffnen Sie die geänderte Datei und gehen Sie zu VCS -> Local History -> Show History. Geöffnete Datei wird dort angezeigt.

3
Deep

Mit git-Befehlen können Sie nichts tun, aber wenn Sie IDE verwenden, können Sie Ihre Änderungen wiederherstellen. __ und klicken Sie auf lokales Protokoll anzeigen ..__ Auf der Registerkarte Externe Änderungen finden Sie Ihre lokalen Änderungen, die Sie versehentlich entfernt haben.

0
Sushil88

Wenn Sie IDE verwenden und die Option "Rückgängig machen" hat, machen Sie einfach die Änderungen rückgängig, und machen das erneute Laden von der Festplatte rückgängig, wodurch Ihre Änderungen wiederhergestellt werden. Die meisten IDEs/Editoren haben diese Option.

0
ShankarDaruga

Ich benutze Intellij. CTRL + z Funktioniert für mich, wird es Sie auffordern, "Änderungen von der Festplatte neu zu laden" und dann auf Ja klicken.

0
Oscar Zhang