Как мне отменить нестационарные изменения в Git?
-
09-06-2019 - |
Вопрос
Как мне отменить изменения в моей рабочей копии, которых нет в индексе?
Решение
Другим более быстрым способом является:
git stash save --keep-index --include-untracked
Вам не нужно включать --include-untracked
если вы не хотите разбираться в этом досконально.
После этого вы можете выбросить этот тайник с помощью git stash drop
командуй, если хочешь.
Другие советы
Для всех неустановленных файлов в текущем рабочем каталоге используйте:
git checkout -- .
Для конкретного использования файла:
git checkout -- path/to/file/to/revert
--
здесь, чтобы удалить двусмысленность аргумента.
Похоже, что полное решение таково:
git clean -df
git checkout -- .
git clean
удаляет все неотслеживаемые файлы (предупреждение:хотя это не приведет к удалению игнорируемых файлов, упомянутых непосредственно в .gitignore, он может удалять проигнорированные файлы, находящиеся в папках) и git checkout
удаляет все неустановленные изменения.
При этом проверяется текущий индекс для текущего каталога, отбрасывая все изменения в файлах из текущего каталога вниз.
git checkout .
или это, которое проверяет все файлы из индекса, перезаписывая файлы рабочего дерева.
git checkout-index -a -f
git clean -df
Очищает рабочее дерево путем рекурсивного удаления файлов, которые не находятся под контролем версий, начиная с текущего каталога.
-d
:Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам
-f
:Сила (может быть необязательной в зависимости от clean.requireForce
настройка)
Бежать git help clean
чтобы ознакомиться с руководством
Мое любимое блюдо - это
git checkout -p
Это позволяет вам выборочно возвращать фрагменты.
Смотрите также:
git add -p
Поскольку ни один ответ не подсказывает точную комбинацию опций, которую я использую, вот она:
git clean -dfx
git checkout .
Это текст онлайн-справки для используемого git clean
Опции:
-d
Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам.Если неотслеживаемый каталог управляется другим репозиторием Git, по умолчанию он не удаляется.Использование -f
выберите дважды, если вы действительно хотите удалить такой каталог.
-f
Если конфигурационная переменная Git clean.requireForce
не установлено значение false
, Git clean откажется удалять файлы или каталоги , если не указано иное -f
, -n
, или -i
.Git откажется удалять каталоги внутри .git
подкаталог или файл, если только второй -f
дается.
-x
Не используйте правила игнорирования из .gitignore
(для каждого каталога) и $GIT_DIR/info/exclude
, но все равно используйте правила игнорирования , приведенные с -e
Опции.Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки.Это может быть использовано (возможно, в сочетании с git reset
) создать чистый рабочий каталог для тестирования чистой сборки.
Также, git checkout .
это должно быть сделано в корневом каталоге репозитория.
Я действительно нашел эту статью полезной для объяснения того, когда какую команду использовать: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Есть пара разных случаев:
Если вы еще не подготовили файл, то вы используете
git checkout
.Проверьте "обновляет файлы в рабочем дереве в соответствии с версией в индексе".Если файлы не были обработаны (иначе говоря добавлены в индекс)...эта команда, по сути, вернет файлы к тому состоянию, каким был ваш последний коммит.git checkout -- foo.txt
Если вы настроили файл, то используйте git reset.Сброс изменяет индекс в соответствии с фиксацией.
git reset -- foo.txt
Я подозреваю, что использование git stash
это популярный выбор, так как он немного менее опасен.Вы всегда можете вернуться к нему, если случайно потеряете слишком много при использовании git reset.Сброс по умолчанию является рекурсивным.
Взгляните на статью выше для получения дальнейших советов.
Самый простой способ сделать это - использовать эту команду:
Эта команда используется для отмены изменений в рабочем каталоге -
git checkout -- .
https://git-scm.com/docs/git-checkout
В команде git удаление неотслеживаемых файлов достигается с помощью:
git stash -u
Если вы просто пожелаете чтобы удалить изменения в существующих файлах, использовать checkout
(задокументировано здесь).
git checkout -- .
- Ветвь не указана, поэтому выполняется проверка текущей ветви.
- Двойной дефис (
--
) сообщает Git, что то, что следует за этим, должно быть принято в качестве его второго аргумента (path), что вы пропустили спецификацию ветви. - Период (
.
) указывает все пути.
Если ты хочешь для удаления добавленных файлов с момента вашего последнего коммита используйте clean
(задокументировано здесь):
git clean -i
- Тот Самый
-i
опция инициирует интерактивныйclean
, чтобы предотвратить ошибочное удаление. - Для более быстрого выполнения доступно несколько других опций;смотрите документацию.
Если вы пожелаете чтобы переместить изменения в пространство хранения для последующего доступа, использовать stash
(задокументировано здесь):
git stash
- Все изменения будут перенесены в Git's Stash для возможного последующего доступа.
- Доступно несколько вариантов для более тонкого хранения;смотрите документацию.
Если вы не заинтересованы в сохранении нестационарных изменений (особенно если поэтапные изменения представляют собой новые файлы), я нашел это удобным:
git diff | git apply --reverse
Когда вы вводите git status, (используйте "git checkout - ...", чтобы отменить изменения в рабочем каталоге) показано.
например , git checkout -- .
git checkout -f
man git-checkout
:
-f, --force
При переключении ветвей продолжайте, даже если индекс или рабочее дерево отличаются от ЗАГОЛОВКА.Это используется для удаления локальных изменений.
При проверке путей из индекса не допускайте сбоя при обнаружении несвязанных записей;вместо этого несвязанные записи игнорируются.
Вы можете использовать git stash - если что-то пойдет не так, вы все равно можете вернуться из stash.Похоже на какой-то другой ответ здесь, но этот также удаляет все неустановленные файлы, а также все неустановленные удаления:
git add .
git stash
если вы убедитесь, что все в порядке, выбросьте заначку:
git stash drop
Ответ от Билала Максуда с git clean
у меня тоже сработало, но с тайником у меня больше контроля - если я что-то сделаю случайно, я все равно смогу вернуть свои изменения обратно
Обновить
Я думаю, что есть еще 1 изменение (не знаю, почему это работало у меня раньше):
git add . -A
вместо того, чтобы git add .
без -A
удаленные файлы не будут сохранены
Вместо того чтобы отменять изменения, я сбрасываю свой пульт дистанционного управления в исходное положение.Примечание - этот метод заключается в полном восстановлении вашей папки в папке репозитория.
Итак, я делаю это, чтобы убедиться, что они не останутся там, когда я сброшу git (позже - исключает gitignores в Origin / branchname)
ПРИМЕЧАНИЕ:Если вы хотите сохранить файлы, которые еще не отслежены, но не в GITIGNORE, вы можете пропустить этот шаг, так как он удалит эти неотслеживаемые файлы, не найденные в вашем удаленном репозитории (спасибо @XtrmJosh).
git add --all
Тогда я
git fetch --all
Затем я возвращаюсь к источнику
git reset --hard origin/branchname
Это вернет все на круги своя.Точно так же, как ПОВТОРНО клонировать ветку, сохраняя при этом все мои файлы с gitignored локально и на месте.
Обновлено в соответствии с комментарием пользователя ниже:Вариант для сброса в любую текущую ветку, в которой находится пользователь.
git reset --hard @{u}
Перепробовал все вышеперечисленные решения, но по-прежнему не смог избавиться от новых, неустановленных файлов.
Использование git clean -f
чтобы удалить эти новые файлы - но с осторожностью! Обратите внимание на опцию принудительного использования.
просто скажи
git stash
Это удалит все ваши локальные изменения.Вы также можете использовать позже, сказав
git stash apply
или git stash pop
Просто используй:
git stash -u
Выполнено.Легко.
Если вы в самом деле позаботьтесь о своем стеке тайников, тогда вы сможете следовать с помощью git stash drop
.Но в этот момент вам лучше использовать (от Мариуша Новака):
git checkout -- .
git clean -df
Тем не менее, мне нравится git stash -u
лучший, потому что он "отбрасывает" все отслеживаемые и неотслеживаемые изменения всего за одна команда.И все же git checkout -- .
отменяет только отслеженные изменения,
и git clean -df
отбрасывает только неотслеженные изменения...и ввод обеих команд - это далеко слишком много работы :)
Это работает даже в каталогах, которые;за пределами обычных разрешений git.
sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
Это случилось со мной недавно
cd path_to_project_folder # take you to your project folder/working directory
git checkout . # removes all unstaged changes in working directory
Независимо от того, в каком состоянии находится ваше репозиторий, вы всегда можете вернуться к любой предыдущей фиксации:
git reset --hard <commit hash>
Это приведет к отмене всех изменений, которые были внесены после этой фиксации.
Другой способ избавиться от новых файлов, который более специфичен, чем git clean -df (это позволит вам избавиться от некоторых файлов, не обязательно от всех), - это сначала добавить новые файлы в индекс, затем сохранить, а затем удалить этот файл.
Этот метод полезен, когда по какой-либо причине вы не можете легко удалить все неотслеживаемые файлы каким-либо обычным механизмом (например, rm).
На мой взгляд,
git clean -df
должно сработать.Согласно Документация Git по git clean
git-clean - удаляет неотслеживаемые файлы из рабочего дерева
Описание
Очищает рабочее дерево путем рекурсивного удаления файлов, которые не находятся под контролем версий, начиная с текущего каталога.
Обычно удаляются только файлы, неизвестные Git, но если указана опция -x , игнорируемые файлы также удаляются.Это может, например, быть полезно для удаления всех продуктов сборки.
Если таковые имеются , необязательно ...приведены аргументы, затрагиваются только эти пути.
Опции
-d Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам.Если неотслеживаемый каталог управляется другим репозиторием Git, он не удаляется по умолчанию.Используйте опцию -f дважды, если вы действительно хотите удалить такой каталог.
-f --принудительно Если для переменной конфигурации Git clean.requireForce не задано значение false, git clean откажется запускаться, если не заданы -f, -n или -i .
То, что следует ниже, на самом деле является решением только в том случае, если вы работаете с разветвлением репозитория, где вы регулярно синхронизируете (напримерзапрос на извлечение) с другим репозиторием.Краткий ответ:удалите форк и перефорк, но ознакомьтесь с предупреждениями на 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
Внимательный глаз заметит, что у этих файлов есть допплегангеры, которые состоят из одной буквы в регистре off.Каким-то образом, и я понятия не имею, что привело меня по этому пути с самого начала (поскольку я сам не работал с этими файлами из вышестоящего репозитория), я переключил эти файлы.Попробуйте множество решений, перечисленных на этой странице (и других страницах), но, похоже, они не помогли.
Я смог устранить проблему, удалив свой разветвленный репозиторий и все локальные репозитории и переразветвляя.Одного этого было недостаточно;upstream пришлось переименовать файлы, о которых идет речь, в новые имена файлов. Пока у вас нет незавершенной работы, нет вики-сайтов и нет проблем, которые расходятся с вышестоящим репозиторием, у вас все должно быть в порядке.Восходящий поток может быть, мягко говоря, не очень доволен вами.Что касается моей проблемы, это, несомненно, ошибка пользователя, поскольку я не настолько хорошо разбираюсь в git, но тот факт, что это далеко не просто исправить, указывает и на проблему с git.
Когда вы хотите передать тайник кому-то другому:
# 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
[редактировать] как было прокомментировано, можно называть тайники.Что ж, используй это, если хочешь поделиться своей заначкой ;)
Вы могли бы создать свой собственный псевдоним, который описывал бы, как это сделать описательным образом.
Я использую следующий псевдоним, чтобы отменить изменения.
Отменить изменения в (списке) файлах в рабочем дереве
discard = checkout --
Затем вы можете использовать его как next, чтобы отменить все изменения:
discard .
Или просто файл:
discard filename
В противном случае, если вы хотите отменить все изменения, а также неотслеживаемые файлы, я использую сочетание проверки и очистки:
Очистите и удалите изменения и неотслеживаемые файлы в рабочем дереве
cleanout = !git clean -df && git checkout -- .
Таким образом, использование простое, как показано ниже:
cleanout
Теперь доступно в следующем репозитории Github, который содержит множество псевдонимов:
Если все промежуточные файлы действительно были зафиксированы, то ветвь можно просто сбросить, напримериз вашего графического интерфейса примерно тремя щелчками мыши: Филиал, Сброс, ДА!
Итак, что я часто делаю на практике, чтобы отменить нежелательные локальные изменения, - это фиксирую все хорошее, а затем сбрасываю ветку.
Если хороший материал зафиксирован в одном коммите, то вы можете использовать "изменить последний коммит", чтобы вернуть его к этапному или нестагнированному состоянию, если в конечном итоге вы захотите зафиксировать его немного по-другому.
Возможно, это не то техническое решение, которое вы ищете для своей проблемы, но я нахожу это очень практичным решением.Это позволяет вам выборочно отбрасывать нестационарные изменения, сбрасывая те изменения, которые вам не нравятся, и сохраняя те, которые вы делаете.
Итак, подводя итог, я просто делаю зафиксировать, сброс ветви, и изменить последнюю фиксацию.
Если у вас есть подмодуль и никакие другие решения не работают, попробуйте:
Чтобы проверить, в чем проблема (возможно, в "грязном" случае), используйте:
git diff
Чтобы удалить тайник
git submodule update
У меня была странная ситуация, когда файл всегда не имеет состояния, это помогает мне решить.
git rm .атрибуты gitattributes
git добавить -A
git reset -жесткий
Если исключить изменения файлов практически невозможно, рассматривали ли вы возможность их игнорирования?Если это утверждение верно, и вы не стали бы прикасаться к этим файлам во время разработки, эта команда может оказаться полезной:
git update-index --assume-unchanged file_to_ignore