Récupérer les changements après un départ accidentel?

ce qui suit était le statut de mon repo.

[~/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")

par la suite, j'ai fait git checkout -f et maintenant les changements sont partis ce que je n'étais pas censé faire.

[~/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)] ➔ 

puis-je récupérer les modifications?

49
demandé sur Autodidact 2010-06-03 00:11:24
la source

7 ответов

Je ne pense pas que vous puissiez récupérer ces données privées ("privé "comme dans" Non ajouté dans l'index, ni engagé", donc inconnu de git), à moins que vous ayez un autre processus de sauvegarde en place pour votre répertoire de travail actuel.

même si cela n'est pas proposé dans le Git Aliases page , Je plaiderais pour une sorte d'alias pour la caisse (comme il ya le alias rm /bin/rm -i usage):

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

, avec le " git stash; git stash apply ' étant le "point de contrôle technique" utilisée "par 1519260920" Brian Campbell dans sa réponse .

ce numéro me rappelle un débat sur ce comportement sur ycombinator (extraits):


j'ai perdu beaucoup de données avec git.

la plus grande partie est liée à des commandements anodins qui: ne pas demander de confirmation lors de la suppression des données .

Par exemple, git checkout filename est équivalent à svn revert filename .

Bien sûr, git checkout branchname fait quelque chose de complètement différent.

Si une branche et un fichier partagent le même nom, git commutera les branches par défaut, mais cela n'empêchera pas bash autocomplete de ruiner la journée.

Voici une idée folle: si vous avez un action et une action dangereuse, ne pas les marquer avec la même commande.


Ennuyeux, peut-être, mais c'est une erreur d'utilisateur, pas d'erreur de conception. Avec git, si je veux jeter sans perte ma copie de travail, je peux juste " git stash ".

Par votre logique, " rm "est défectueux parce qu'il ne demande pas de confirmation quand vous passez -f au lieu de -i . Eh bien, oui. Désolé.


Votre analogie serait plus précise si rm somename était l'équivalent de apt-get update , et rm othername était rm -fr othername .

Pourtant, il ne peut pas être juste que " get checkout foo "fasse l'une des deux choses complètement différentes selon qu'il y a ou non un fichier appelé foo dans le répertoire courant


Voici une autre idée folle: ne pas courir git checkout ... " sur un arbre sale de travail. Le problème est résolu.

Une autre: ne réutilisez pas les noms de fichiers comme noms de branches.

Pour être honnête: j'ai le même problème avec les invocations imprudentes de rm ruinant ma journée mais quand je marmonne des malédictions, c'est à mon lazyness / stupidité et pas à bash complétions ou le comportement de rm

41
répondu VonC 2017-05-23 14:54:58
la source

une autre chose que vous pouvez regarder est à travers votre IDE. J'ai accidentellement vérifié 2 fichiers et j'ai été capable de ramener les changements à travers l '"histoire locale" de mon IDE (netbeans). Quelle bénédiction!

43
répondu gigi2 2013-11-06 02:17:45
la source

sauf si vous avez déjà utilisé git add ou git stash avec ces fichiers auparavant, alors malheureusement non. Si vous les avez ajoutés ou cachés, alors vous devriez être en mesure de trouver leurs git reflog .

Je n'ai jamais été à l'aise avec ce comportement destructeur de git checkout . Peut-être une amélioration utile serait d'avoir ce genre de git checkout créer automatiquement une cachette (de sorte que les fichiers sont capturés par le biais de la reflog) avant de réécrire votre travail.

19
répondu Greg Hewgill 2010-06-03 00:16:46
la source

ce qui suit peut s'appliquer dans le cas où vous utilisez vim sur Linux.

  • si les fichiers sont ouverts dans un tampon actif, alors vous avez le contenu du fichier tant que vous ne rechargez pas le fichier dans vim, et pouvez le restaurer en le sauvegardant. .

  • si les fichiers ne sont pas ouverts dans un tampon actif, mais sont sales, alors il devrait y avoir un .swp fichier dans le répertoire source, qui comporte également une copie du contenu qui est recouvrable par vim -r file.swp .

  • si les fichiers ne sont ni ouverts dans un buffer actif ni sales, et si votre copie de travail est sur une partition ext3 ou ext4, alors extundelete pourrait être en mesure de trouver le récemment supprimé .fichiers swp et / ou une version plus ancienne des fichiers source. Remonter la partition en lecture seule, par exemple mount -o remount,ro /mnt/point , et exécuter

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

    Si la partition qui contient la copie de travail est la partition racine, il peut refuser de redémarrer, puis essayer de tuer tous les services, et si toujours pas aller, puis arrêter et démarrer en utilisant un CD/USB/PXE en direct , comme GRML , et exécuter ce qui précède. J'ai réussi à récupérer un dossier perdu sur trois de cette façon.

4
répondu alexei 2014-10-08 23:36:01
la source

si vous utilisez Eclipse comme IDE et EGit , vous avez sur votre fichier le menu de L'équipe:

  1. clic droit sur votre fichier de l'intérieur
  2. article de la liste "équipe" - > "Afficher L'histoire locale"

vous verrez toute la version enregistrer localement sans n'importe quel nom d'enregistrement, dans mon cas, mais, vous pouvez facilement vérifier tous les changements non tractés hors des traits de git et restaurer votre code manquant.

3
répondu Jonathan 2016-08-30 11:23:50
la source

il n'y a rien que vous puissiez faire avec les commandes git mais si vous utilisez IDE alors vous pouvez récupérer vos modifications. J'utilise PhpStorm où nous pouvons voir l'historique des changements de fichiers. Il suffit de cliquer avec le bouton droit de la souris sur fichier et de cliquer sur Afficher l'histoire locale. Sous l'onglet Modifications externes, vous pouvez trouver vos modifications locales que vous avez accidentellement supprimées.

0
répondu Sushil88 2017-12-05 09:00:47
la source

si vous utilisez IDE et qu'il a l'option Annuler, annulez simplement les modifications, il annulera le rechargement du disque qui ramènera vos modifications. La plupart des IDEs / editors ont cette option.

0
répondu ShankarDaruga 2018-09-18 08:48:33
la source

Autres questions sur git git-checkout