Как мне отменить неустановленные изменения в Git? - PullRequest
4319 голосов
/ 09 сентября 2008

Как отменить изменения в моей рабочей копии, которых нет в индексе?

Ответы [ 32 ]

11 голосов
/ 05 февраля 2016

Независимо от того, в каком состоянии находится ваш репо, вы всегда можете сбросить любой предыдущий коммит:

git reset --hard <commit hash>

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

10 голосов
/ 14 июля 2016

На мой взгляд,

git clean -df

должен сделать свое дело. Согласно документации Git по git clean

git-clean - удаление неотслеживаемых файлов из рабочего дерева

Описание

Очищает рабочее дерево, рекурсивно удаляя файлы, которые не находятся под контролем версий, начиная с текущего каталога.

Обычно удаляются только файлы, неизвестные Git, но если опция -x указан, игнорируемые файлы также удаляются. Это может, например, полезно удалить все продукты сборки.

Если заданы необязательные аргументы ..., только эти пути пострадавших.

Опция

-d Удалить неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим Git-репозиторием, он по умолчанию не удаляется. Используйте параметр -f дважды, если вы действительно хотите удалить такой каталог.

-f --force Если для переменной конфигурации Git clean.requireForce не задано значение false, git clean не будет запускаться, если не указано -f, -n или -i.

10 голосов
/ 15 июня 2012

Еще один способ избавиться от новых файлов, который более специфичен, чем git clean -df (это позволит вам избавиться от некоторых файлов, не обязательно всех), - сначала добавить новые файлы в индекс, а затем спрятать, затем бросьте тайник.

Этот метод полезен, когда по какой-то причине вы не можете легко удалить все неотслеживаемые файлы каким-либо обычным механизмом (например, rm).

9 голосов
/ 05 января 2014

То, что следует, действительно только решение, если вы работаете с форком репозитория, где вы регулярно синхронизируете (например, запрос на извлечение) с другим репо. Краткий ответ: удалите fork и refork, но прочитайте предупреждения на github .

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

У меня часто бывают такие сообщения о состоянии git (включая как минимум 2/4 файла):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

Зоркий глаз заметит, что в этих файлах есть допплангеры, которые в случае отключения - одна буква. Каким-то образом, и я понятия не имею, с чего начался этот путь (поскольку я сам не работал с этими файлами из репозитория верхнего уровня), я переключил эти файлы. Попробуйте множество решений, перечисленных на этой странице (и других страницах), похоже, не помогло.

Мне удалось решить эту проблему, удалив мой раздвоенный репозиторий и все локальные репозитории, а затем повторив повторную проверку. Одного этого было недостаточно; апстрим должен был переименовать рассматриваемые файлы в новые имена файлов. Пока у вас нет незагруженной работы, вики и проблем, которые расходятся с репозиторием апстрима, у вас все должно быть в порядке. Upstream может быть не очень доволен вами, если не сказать больше. Что касается моей проблемы, то это, несомненно, ошибка пользователя, так как я не настолько опытен в git, но факт, что исправить проблему с git также далеко не просто.

7 голосов
/ 05 июня 2017

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

Я использую следующий псевдоним для отмены изменений.


Отменить изменения в (списке) файлах в рабочем дереве

discard = checkout --

Затем вы можете использовать его как следующий, чтобы отменить все изменения:

discard .

Или просто файл:

discard filename

В противном случае, если вы хотите отменить все изменения, а также неотслеживаемые файлы, я использую сочетание проверки и очистки:

Очистить и отменить изменения и неотслеживаемые файлы в рабочем дереве

cleanout = !git clean -df && git checkout -- .

Таким образом, использование просто как следующее:

cleanout

Теперь доступно в следующем репозитории Github, который содержит много псевдонимов:

7 голосов
/ 08 июля 2013

Когда вы хотите передать тайник кому-то еще:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[править], как прокомментировано, можно назвать тайники. Ну, используйте это, если вы хотите поделиться своим тайником;)

6 голосов
/ 31 июля 2017

Если почти невозможно исключить изменения файлов, вы рассматривали возможность их игнорирования? Если это утверждение верно и вы не трогаете эти файлы во время разработки, эта команда может быть полезна:

git update-index --assume-unchanged file_to_ignore

6 голосов
/ 08 февраля 2017

У меня была странная ситуация, когда файл всегда неустановлен, это помогает мне решить проблему.

git rm .gitattributes
git add -A
git reset --hard

6 голосов
/ 20 марта 2015

Если все подготовленные файлы были фактически зафиксированы, то ветвь может быть просто сброшена, например, из вашего графического интерфейса с помощью примерно трех щелчков мыши: Филиал , Сброс , Да !

Итак, что я часто делаю на практике, чтобы отменить нежелательные локальные изменения, это зафиксировать все хорошие вещи, а затем сбросить ветку.

Если хороший материал фиксируется в одном коммите, то вы можете использовать «изменить последний коммит», чтобы вернуть его к постановке или не постановке, если вы в конечном итоге захотите сделать это немного по-другому.

Возможно, это не техническое решение, которое вы ищете для вашей проблемы, но я считаю, что это очень практичное решение. Это позволяет вам выборочно отказаться от внесенных изменений, сбрасывать изменения, которые вам не нравятся, и сохранять те, которые вы делаете.

Итак, я просто делаю коммит , сброс ветки и изменение последнего коммита .

6 голосов
/ 02 октября 2015

Если у вас субмодуль и другие решения не работают, попробуйте:

  • Чтобы проверить, в чем проблема (возможно, «грязный» случай), используйте:

    git diff

  • Для удаления заначки

    git submodule update

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...