Git: impossibile annullare le modifiche locali (errore: percorso ... non unito)


338

Ho seguito lo stato dell'albero di lavoro

$ 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")

Il file foo/bar.txtè lì e voglio riportarlo allo "stato invariato" (simile a '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

Ora sta diventando confuso:

$ 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
#

Lo stesso file in entrambe le sezioni, nuovo e modificato? Cosa dovrei fare?


7
Vorrei che qualcuno potesse spiegare come possiamo entrare in questa situazione, perché succede e perché la soluzione funziona.
Marcos Dione,

1
Mi sono imbattuto in questa situazione quando ho fatto scoppiare la mia scorta dopo un rebase che mi ha fatto entrare in un conflitto di unione (lo stash pop fa una fusione) .... Per risolverlo, ho fatto un "checkout - loro" .... apparentemente il mio le modifiche erano ancora lì .... per rimuovere quelle ... ho provato di nuovo un checkout sul file ... è stato quando ho visto l'errore sopra.
Arindam Roychowdhury,

Risposte:


558

L'hai fatto nel modo sbagliato. Dovresti ripristinare prima, annullare la messa in scena del file, quindi fare il checkout, per ripristinare le modifiche locali.

Prova questo:

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

Grazie; ha funzionato come un fascino! Ho dovuto impegnarmi ( non con -a arg, i cambiamenti rilevanti erano già in scena) e quindi sono stato in grado di spingere / tirare come al solito.
Patrick

18
Per me è stato richiesto un: <br/> $ git reset - foo / bar.txt <br/> $ git checkout - foo / bar.txt <br/> (Nota il "-" in più in mezzo)
Jan

4
La sintassi corretta è "git reset HEAD file1 file2 ..." quindi "git checkout - file1 file2 ..."
Thomas Decaux,

1
È sempre divertente quando la risposta più votata dice semplicemente "stai sbagliando" :)
nathanchere

4
Una spiegazione (su cosa fanno le cose) sarebbe stata grandiosa ...
Kissaki,

52

Ha funzionato perfettamente per me:

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

14
git checkout origin/[branch] .
git status

// Nota punto (.) Alla fine. E tutto andrà bene


-2
git checkout foo/bar.txt

ci hai provato? (senza una parola chiave HEAD)

Di solito ripristino le mie modifiche in questo modo.


1
Errore tipico quando si prova a checkoutnel mezzo di un'unione: $ git co path/to/file= risultato => error: path 'path/to/file' is unmerged => quindi, prima esecuzione:, $ git reset path/to/filequindi git checkout path/to/filedovrebbe funzionare.
michael,

2
Se non si specifica HEAD, verrà eseguito il checkout di git dall'indice, che è un'operazione più debole (l'origine del contenuto è l'indice anziché HEAD). Inoltre, non credo che ciò faccia la differenza in questo caso - con il problema specifico che la domanda ha affermato. Ci hai provato?
Kissaki,

-4

Trovo che git stash sia molto utile per la gestione temporale di tutti gli stati 'sporchi'.


4
Se lo trovi utile, ti preghiamo di dare una spiegazione su come sarebbe utile in questo caso concreto. Come lo useresti qui?
Kissaki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.