Как мне отменить нестационарные изменения в Git?

StackOverflow https://stackoverflow.com/questions/52704

  •  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/

Есть пара разных случаев:

  1. Если вы еще не подготовили файл, то вы используете git checkout.Проверьте "обновляет файлы в рабочем дереве в соответствии с версией в индексе".Если файлы не были обработаны (иначе говоря добавлены в индекс)...эта команда, по сути, вернет файлы к тому состоянию, каким был ваш последний коммит.

    git checkout -- foo.txt

  2. Если вы настроили файл, то используйте git reset.Сброс изменяет индекс в соответствии с фиксацией.

    git reset -- foo.txt

Я подозреваю, что использование git stash это популярный выбор, так как он немного менее опасен.Вы всегда можете вернуться к нему, если случайно потеряете слишком много при использовании git reset.Сброс по умолчанию является рекурсивным.

Взгляните на статью выше для получения дальнейших советов.

Самый простой способ сделать это - использовать эту команду:

Эта команда используется для отмены изменений в рабочем каталоге -

git checkout -- .

https://git-scm.com/docs/git-checkout

В команде git удаление неотслеживаемых файлов достигается с помощью:

git stash -u

http://git-scm.com/docs/git-stash

Если вы просто пожелаете чтобы удалить изменения в существующих файлах, использовать 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top