Les questions que j'ai vues pour défaire un idiot tirent un peu différent du mien.
Voici ce que j'ai fait:
Il y a un projet dans le répertoire A
(pas un repo). J'ai initialisé un référentiel dans celui-ci, ajouté les fichiers, mais rien commis. Ensuite, j'ai extrait du référentiel B, qui a écrasé un groupe de mes fichiers mis en scène.
J'avais l'impression de pouvoir utiliser git reset --hard
pour annuler la fusion. Bien sûr, cela vient de vérifier le HEAD des commits que je venais d’arriver.
J'aurais dû créer une branche et engager quelque chose avant de faire cette traction, le recul est agréable. Est-il possible de récupérer mes anciens fichiers non mis en scène?
Il semble y avoir une réponse à la récupération des fichiers mis en scène ici:
Récupération du fichier ajouté après la réinitialisation de git --hard HEAD ^
Un git pull
est identique à git fetch
+ git merge
. C'est l'étape de fusion qui a écrasé vos modifications. Pour revenir à l'état antérieur à la fusion, utilisez git log
pour rechercher votre dernier commit, puis utilisez git reset --hard 1234abcd
où 1234abcd est le hachage du commit voulu.
Notez qu'après la réinitialisation, git pull
fusionnera à nouveau les modifications. Pour annuler les modifications pour de bon, utilisez git revert
, ce qui créera une validation supplémentaire qui inverserait les modifications.
Soit simplement réinitialiser le précédent HEAD (c'est-à-dire le commit que vous avez eu dans votre référentiel, qui n'a pas été mis à jour depuis la télécommande), ou utilisez git reflog
. Ce dernier affiche une liste des actions effectuées dans votre référentiel. La commande git pull
devrait en faire partie. Simplement git reset --hard X
à un état avant cette commande.
Vous pouvez également vous séparer de la HEAD précédente (vous pouvez supprimer/écraser la branche précédente), y apporter vos modifications et git tirer à nouveau ...
Je pense que vous ne pouvez pas récupérer complètement maintenant. Le mieux que vous puissiez faire est git status
pour vérifier quels fichiers sont encore intacts. Si les fichiers non validés ne sont pas ici, ils sont perdus.
La prochaine fois, envisagez d'utiliser git stash
avant git pull
ou, mieux encore, utilisez git fetch
.
SI VOUS ETES UN UTILISATEUR AVANCE DE GIT ET LES FICHIERS SONT VRAIMENT IMPORTANT:
Si les fichiers sont stockés, vous pourrez peut-être les extraire du référentiel d'objets. Mais ceux-ci vont droit au but, que je ne pense pas que vous devriez essayer.
Si vous voulez vraiment, lisez ceci:
Il suffit de relire votre question. J'ai oublié que vous retiriez du projet b plutôt que de copier des fichiers dans votre projet. Je ne sais pas si ma réponse tient toujours compte tenu de votre scénario. Je pense que votre meilleur pari est de suivre la réponse de geoffreyd et de vérifier la réponse à la question StackOverflow Récupération du fichier ajouté après avoir effectué la réinitialisation de git --hard HEAD ^ .
Il suffit de faire un git checkout -- <file>
.
Voici l'exemple que j'ai couru pour confirmer ce qui précède ...
# Create a test directory and some test files
$ mkdir blah
$ echo "I've been overwritten" > test1.txt
$ cd blah
$ echo "I'm the real test1.txt" > test1.txt
$ git init .
Initialized empty Git repository in /Users/matthew/blah/.git/
$ git add .
$ cp ~/test1.txt .
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: test1.txt
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: test1.txt
#
$ cat test1.txt
I've been overwritten
$ git checkout -- test1.txt
$ cat test1.txt
I'm the real test1.txt
Lorsque vous exécutez git status
, il vous indique d'utiliser git checkout -- <file>
pour ignorer les modifications du répertoire de travail. Si je lis bien votre question, c'est ce que vous voulez faire.