Git: не вдається скасувати локальні зміни (помилка: шлях… не ввімкнено)


336

У мене є стан робочого дерева

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

Один і той же файл в обох розділах, новий та змінений? Що я повинен зробити?


7
Я хотів би, щоб хтось міг пояснити, як ми потрапляємо в цю ситуацію, чому це відбувається і чому рішення працює.
Marcos Dione

1
Я потрапив у цю ситуацію, коли я вискочив сховище після перезавантаження, яке ввело мене в конфлікт злиття (скрипт-поп робить злиття) .... Щоб вирішити це, я зробив "касу - їхні" .... зміни все ще були .... щоб їх видалити .. я спробував перевірити файл знову ... це коли я побачив вищевказану помилку.
Аріндам Ройховдхурі

Відповіді:


555

Ви зробили це неправильно. Вам призначено спершу скинути, зняти файл, потім отримати замовлення, щоб відновити локальні зміни.

Спробуйте це:

$ 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/> (Зауважте додатково "-" між ними)
січня

4
Хороший синтаксис - "git reset HEAD file1 file2 ...", то "git checkout - file1 file2 ..."
Thomas Decaux

1
Це завжди кумедно, коли відповідь, яка найбільше голосує, в основному просто каже: "ти робиш це неправильно" :)
nathanchere

4
Пояснення (що робити) було б чудово…
Kissaki

51

Це прекрасно працювало для мене:

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

14
git checkout origin/[branch] .
git status

// Примітка крапки (.) В кінці. І все буде добре


-2
git checkout foo/bar.txt

ти це пробував? (без ключового слова HEAD)

Я зазвичай скасовую свої зміни таким чином.


1
Типова помилка при спробі a checkoutпосеред злиття: $ git co path/to/file= result => error: path 'path/to/file' is unmerged => так, спочатку run:, $ git reset path/to/fileа потім git checkout path/to/fileповинен працювати.
Майкл

2
Якщо не вказати HEAD, змусити перевірити git checkout з індексу, що є слабшою операцією (джерелом вмісту є індекс, а не HEAD). Більше того, я не думаю, що це взагалі має значення в цій справі - з конкретною проблемою, яке було зазначено в питанні. Чи ви спробувати це?
Кіссакі

-4

Я вважаю, що git stash дуже корисний для тимчасового поводження з усіма "брудними" станами.


4
Якщо ви вважаєте це корисним, будь ласка, дайте пояснення, як це допомогло б у цьому конкретному випадку. Як би ви тут його використали?
Кіссакі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.