web-dev-qa-db-fra.com

Récupérer les modifications après le paiement 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")

Accomplément, j'ai git checkout -f et maintenant les changements ont disparu, 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?

51
Autodidact

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

Même si cela n'est pas proposé dans la page Git Aliases, je préconiserais un type d'alias pour le paiement (comme il y a l'utilisation de alias rm /bin/rm -i):

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

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

stason propose dans les commentaires :

co = "!git stash Push -m \"co backup\"; git stash apply; git checkout \"$@\"" 

Remarque, j'ai ajouté un message pour dire aux caches de sauvegarde des autres. -

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


J'ai perdu beaucoup de données avec git.
La plupart de cela concerne des commandes à la sonorité inoffensive qui ne demandent pas de confirmation lors de la suppression de 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 changera de branche par défaut, mais cela n'empêche pas bash autocomplete de gâcher la journée.

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


Ennuyeux peut-être, mais c’est une erreur de l’utilisateur, pas une erreur de conception. Avec git, si je veux jeter sans perte ma copie de travail, je peux simplement "git stash".
Selon votre logique, "rm" est défectueux car il ne demande pas de confirmation lorsque vous passez -f au lieu de -i. Ben ouais. Pardon.


Votre analogie serait plus précise si rm somename était l'équivalent de apt-get update, et rm othername était rm -fr othername.
Cependant, il n’est pas juste que "get checkout foo" fasse une des deux choses COMPLETEMENT différentes selon qu’il existe ou non un fichier appelé foo dans le répertoire courant


Voici une autre idée folle: ne lancez pas 'git checkout ...' sur un arbre de travail sale. Problème résolu.
Un autre: ne réutilisez pas les noms de fichiers en tant que noms de branches.
Pour être honnête: j'ai le même problème avec des invocations négligentes de 'rm' ruinant ma journée, mais quand je marmonne des sorts, c'est à mon paresse/stupidité et non à des achèvements ou à un comportement de 'rm'

44
VonC

Une autre chose que vous pouvez regarder est à travers votre IDE. J'ai accidentellement extrait 2 fichiers et j'ai pu ramener les modifications dans "l'historique local" de mon IDE (netbeans). Quelle bénédiction!

46
gigi2

Sauf si vous avez déjà utilisé git add ou git stash avec ces fichiers précédemment, alors malheureusement non. Si vous les avez ajoutés ou cachés, vous devriez pouvoir trouver leurs hachages dans git reflog .

Je n'ai jamais été à l'aise avec ce comportement destructeur de git checkout. Une amélioration utile consisterait peut-être dans le fait que ce type de git checkout crée automatiquement une réserve (de manière à ce que les fichiers soient capturés par le biais du reflog) avant de remplacer votre travail.

20
Greg Hewgill

Ce qui suit peut s’appliquer si vous utilisez vim sous Linux.

  • Si les fichiers sont ouverts dans une mémoire tampon active, vous avez le contenu du fichier, tant que vous ne rechargez pas le fichier dans vim, et que vous pouvez le restaurer en l'enregistrant. .

  • Si les fichiers ne sont pas ouverts dans un tampon actif, mais sont sales, un fichier .swp devrait figurer dans le répertoire source, qui contient également une copie du contenu récupérable via vim -r file.swp.

  • Si les fichiers ne sont ni ouverts dans le tampon antif, ni sales, et si votre copie de travail se trouve sur une partition ext3 ou ext4, alors extundelete pourra peut-être trouver les fichiers .swp récemment supprimés et/ou une version plus ancienne du fichier. fichiers source. Remontez la partition en lecture seule, par exemple. mount -o remount,ro /mnt/point et lancez

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

    Si la partition contenant la copie de travail est la partition racine, elle peut refuser le remontage, puis essayer de supprimer tous les services, et si rien ne le permet, puis arrêter et démarrer à l'aide d'un Live CD/USB/PXE, tel que _ grml _. , et exécutez ce qui précède. J'ai réussi à récupérer un fichier perdu sur trois de cette façon.

5
alexei

si vous utilisez Eclipse comme IDE et EGit , vous avez sur votre fichier le menu Team:

  1. clic droit sur votre fichier depuis l'intérieur 
  2. Élément de liste "Équipe" -> "Afficher l'historique local"

vous verrez toute la version sauvegardée localement sans aucun nom, dans mon cas, mais vous pouvez facilement vérifier toutes les modifications non suivies dans les fonctionnalités de git et restaurer votre code manquant.

3
Jonathan

Si IDE est Android Studio, ouvrez le fichier qui a été modifié et accédez à VCS -> Historique local -> Afficher l'historique. Le fichier ouvert sera affiché ici.

3
Deep

Il n'y a rien que vous puissiez faire avec les commandes git mais si vous utilisez IDE, vous pourrez alors récupérer vos modifications . J'utilise PhpStorm où nous pouvons voir l'historique des modifications du fichier . Cliquez simplement sur le fichier et cliquez sur afficher l'historique local . Sous l'onglet Modifications externes, vous pouvez trouver les modifications locales que vous avez supprimées par inadvertance.

0
Sushil88

Si vous utilisez IDE et que l'option annulée est annulée, il suffit d'annuler les modifications pour annuler le rechargement à partir du disque, ce qui ramènera vos modifications. La plupart des IDE/éditeurs ont cette option.

0
ShankarDaruga

J'utilise Intellij. CTRL + z fonctionne pour moi, il vous demandera "recharger les modifications à partir du disque", puis cliquez sur Oui.

0
Oscar Zhang