Git: не может отменить локальные изменения (ошибка: путь… не объединен)

338

У меня есть следующее рабочее дерево

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

Файл foo/bar.txtесть, и я хочу снова вернуть его в «неизменное состояние» (аналогично '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

Теперь это сбивает с толку:

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

Один и тот же файл в обоих разделах, новый и измененный? Что я должен делать?

mklhmnn
источник
7
Хотелось бы, чтобы кто-нибудь мог объяснить, как мы попадаем в эту ситуацию, почему это происходит и почему решение работает.
Маркос Дионе
1
Я попал в эту ситуацию, когда вытащил свой тайник после перебазирования, в результате которого я попал в конфликт слияния (stash pop выполняет слияние) .... Чтобы решить эту проблему, я сделал «checkout - theirs» .... очевидно мой изменения были еще там .... чтобы удалить те .. Я попробовал проверить файл еще раз .., когда я увидел вышеупомянутую ошибку.
Ариндам Ройховдхури

Ответы:

558

Вы сделали это неправильно. Вы должны сбросить сначала, удалить файл, а затем оформить, чтобы отменить локальные изменения.

Попробуй это:

$ git reset foo/bar.txt
$ git checkout foo/bar.txt
Игорь Зевака
источник
Спасибо; работал как шарм! Я должен был зафиксировать ( не с аргументом -a, соответствующие изменения уже были организованы), и затем я смог толкать / тянуть, как обычно.
Патрик
18
Для меня это потребовало: <br/> $ git reset - foo / bar.txt <br/> $ git checkout - foo / bar.txt <br/> (обратите внимание на дополнительный «-» между ними)
Jan
4
Хороший синтаксис: «git reset HEAD file1 file2 ...», затем «git checkout - file1 file2 ...»
Томас Деко,
1
Всегда забавно, когда ответ с наибольшим количеством голосов просто говорит: «Вы делаете это неправильно» :)
nathanchere
4
Объяснение (о том, что делают) было бы здорово ...
Киссаки
52

Это отлично сработало для меня:

$ git reset -- foo/bar.txt
$ git checkout foo/bar.txt
Штеффи
источник
14
git checkout origin/[branch] .
git status

// Обратите внимание на точку (.) В конце. И все будет хорошо

Джо Хайд
источник
-2
git checkout foo/bar.txt

ты пробовал это? (без ключевого слова HEAD)

Я обычно отменяю свои изменения таким образом.

zed_0xff
источник
1
Типичная ошибка при попытке checkoutв середине слияния: $ git co path/to/file= результат => error: path 'path/to/file' is unmerged => так, сначала запустите:, $ git reset path/to/fileа затем git checkout path/to/fileдолжно работать.
Майкл
2
Если не указать HEAD, git checkout получит извлечение из индекса, что является более слабой операцией (источником контента является индекс, а не HEAD). Кроме того, я не думаю, что это имеет значение в этом случае вообще - с конкретной проблемой, поставленной вопросом. Ли вы попробовать это?
Киссаки
-4

Я считаю, что git stash очень полезен для временной обработки всех «грязных» состояний.

takeshin
источник
4
Если вы найдете это полезным, пожалуйста, объясните, как это могло бы помочь в этом конкретном случае. Как бы вы использовали это здесь?
Киссаки