2010-06-11 39 views
229

Je suit l'état de l'arbre de travailGit: ne peut pas annuler les modifications locales (erreur: chemin ... est unmerged)

$ git status foo/bar.txt 
# On branch master 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
#  deleted by us:  foo/bar.txt 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

Fichier foo/bar.txt est là et je veux le faire à « l'état inchangé » à nouveau (similaire à 'svn revert'):

$ git checkout HEAD foo/bar.txt 
error: path 'foo/bar.txt' is unmerged 
$ git reset HEAD foo/bar.txt 
Unstaged changes after reset: 
M  foo/bar.txt 

maintenant, il devient source de confusion:

$ git status foo/bar.txt 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  new file: foo/bar.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: foo/bar.txt 
# 

Le même fichier dans les deux sections, ne w et modifiés? Que devrais-je faire?

+1

Je voudrais que quelqu'un pourrait expliquer comment pouvons-nous dans cette situation, * pourquoi * il arrive, et pourquoi la solution fonctionne. –

Répondre

389

Vous l'avez fait à l'envers. Vous devez réinitialiser d'abord le fichier, puis le décocher pour annuler les modifications locales.

Essayez ceci:

$ git reset foo/bar.txt 
$ git checkout foo/bar.txt 
+0

Merci; travaillé comme un charme! Je devais m'engager (pas avec l'argument -a, les changements pertinents étaient déjà mis en scène) et ensuite j'étais capable de pousser/tirer comme d'habitude. – Patrick

+15

Pour moi, il a fallu un:
$ git reset - foo/bar.txt
$ git checkout - foo/bar.txt
(Notez le supplément "-" entre les deux) – Jan

+0

Pour moi, git reset réinitialise * tout * des fichiers, pas seulement ceux listés. Ai-je fait quelque chose de mal? – Zds

-3
git checkout foo/bar.txt 

Avez-vous essayé? (sans mot-clé HEAD)

Je rétablis généralement mes modifications de cette façon.

+0

Erreur typique lors d'un 'checkout' au milieu d'une fusion: ' $ git co chemin/vers/fichier' = résultat => 'erreur: chemin 'chemin/vers/fichier' est non fusionné => , exécutez d'abord: '$ git reset path/vers/file', puis le chemin' git checkout/to/file' devrait fonctionner. – michael

+0

Si vous ne spécifiez pas HEAD, git checkout extrait de l'index, qui est une opération plus faible (la source de contenu est l'index plutôt que HEAD). En outre, je ne pense pas que cela fasse une différence dans ce cas - avec le problème spécifique de la question. Avez-vous * essayé * cela? – Kissaki

-4

Je trouve git stash très utile pour la manipulation temporelle de tous les états 'sales'.

+4

Le stockage ne fonctionne pas lorsque vous avez des changements non fusionnés – Rob

+3

Si vous le trouvez utile, veuillez expliquer comment cela pourrait vous aider dans ce cas concret. Comment l'utiliseriez-vous ici? – Kissaki

9
git checkout origin/[branch] . 
git status 

// Notez le point (.) À la fin. Et tout ira bien

21

Cela a parfaitement fonctionné pour moi:

$ git reset -- foo/bar.txt 
$ git checkout foo/bar.txt