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?
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 istgit checkout filename
äquivalent zusvn revert filename
.
Natürlich machtgit 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 zuapt-get update
wäre undrm othername
rm -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
'
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!
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.
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.
wenn Sie Eclipse als IDE und EGit verwenden, haben Sie in Ihrer Datei das Team-Menü:
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.
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.
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.
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.
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.