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

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

30 ответов


другой более быстрый способ:

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: Force (может быть не нужно в зависимости от clean.requireForce настройки)

Run 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. Checkout "обновляет файлы в рабочем дереве в соответствии с версией в индексе". Если файлы не были поставлены (он же добавлен в индекс)... эта команда по существу вернется файлы, на которые вы записывались в последний раз.

    git checkout -- foo.txt

  2. если вы поставили файл, используйте git reset. 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


Если вы не заинтересованы в сохранении неустановленных изменений (особенно если поэтапные изменения являются новыми файлами), я нашел это удобным:

git diff | git apply --reverse

при вводе статуса git, (используйте " git checkout -- ..."отказаться от изменений в рабочем каталоге) изображенный.

например git checkout -- .


git checkout -f


man git-checkout:

-f, --force

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

при проверке путей из индекса не завершайте работу с незаполненными записями; вместо этого незаполненные записи игнорируются.


вы можете использовать git stash-если что-то пойдет не так, вы все равно можете вернуться из тайника. Подобно некоторому другому ответу здесь, но этот также удаляет все неустановленные файлы, а также все неустановленные удаления:

git add .
git stash

если вы проверяете, что все в порядке, выбросьте заначку:

git stash drop

ответ от Билала Максуда с git clean также работал для меня, но с заначкой у меня больше контроля - если я случайно сделаю sth, я все равно смогу получить свои изменения назад!--7-->

обновление

Я думаю, что есть еще 1 изменение (не знаю, почему это сработало для меня раньше):

git add . -A вместо git add .

без -A удаленные файлы не пройдет


вместо того, чтобы отбрасывать изменения, я сбрасываю свой пульт в начало координат. Примечание - этот способ полностью восстановить вашу папку с РЕПО.

поэтому я делаю это, чтобы убедиться, что они не сидят там, когда я git reset (позже - исключает gitignores в Origin/branchname)

Примечание: Если вы хотите сохранить файлы еще не отслеживаются, но не в GITIGNORE вы можете пропустить этот шаг, так как он будет стереть эти неотслеженные файлы, не найденные в удаленном репозитории (спасибо @XtrmJosh).

git add --all

Потом

git fetch --all

затем я сброшен в origin

git reset --hard origin/branchname

это вернет его в квадрат один. Так же, как повторное клонирование ветви, сохраняя все мои файлы gitignored локально и на месте.

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

git reset --hard @{u}

пробовал все решения выше, но все еще не мог избавиться от новых, неустановленных файлов.

использовать git clean -f удалить эти новые файлы - хотя с осторожностью! обратите внимание на параметр force.


если вы просто хотите чтобы удалить изменения в существующих файлах используйте checkout (документы).

git checkout -- .
  • ветвь не указана, поэтому она проверяет текущую ветвь.
  • двойной дефис (--) говорит Git, что следующее должно быть принято в качестве второго аргумента (пути), что вы пропустили спецификацию ветви.
  • срок (.) указывает все пути.

если вы хотите для удаления файлов добавлено С момента последнего коммита, используйте clean (документы):

git clean -i 
  • на -i опция инициирует интерактивный clean, для предотвращения ошибочных удалений.
  • несколько других опций доступны для более быстрого выполнения; см. документацию.

если вы желаете для перемещения изменений в удерживающее пространство для последующего доступа используйте stash (документы):

git stash
  • все изменения будут перемещены в тайник Git для возможного последующего доступа.
  • несколько вариантов доступны для более тонкого хранения; см. документацию.

просто сказать

git stash

он удалит все ваши локальные изменения. Вы также можете использовать позже, сказав

git stash apply 

или git stash pop


просто использовать:

git stash -u

сделано. Простой.

если вы действительно забота о вашем стеке тайника, то вы можете следовать с git stash drop. Но в этот момент вам лучше использовать (от Mariusz Nowak):

git checkout -- .
git clean -df

тем не менее, мне нравится git stash -u лучшее, потому что он" отбрасывает " все отслеживаемые и неотслеживаемые изменения в just одной командой. Еще 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 clean-df (это позволит вам избавиться от некоторых файлов не обязательно всех), это сначала добавить новые файлы в индекс, затем заначку, затем отбросить заначку.

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


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

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

У меня часто были бы сообщения о состоянии git, как это (с участием по крайней мере 2/4 files):

$ 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

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

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


по-моему,

git clean -df

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

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

описание

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

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

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

опции

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

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


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

git reset --hard <commit hash>

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


когда вы хотите передать заначку кому-то другому:

# 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

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


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

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

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

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

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


ни одно из решений не работает, если вы просто поменяли разрешения файла (это на DOS/Windoze)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

единственный способ исправить это, чтобы вручную сбросить разрешения на измененные файлы:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff


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

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


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

discard = checkout --

затем вы можете использовать его как рядом, чтобы отменить все изменения:

discard .

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

discard filename

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

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

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

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

cleanout

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


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

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

    git diff

  • чтобы удалить stash

    git submodule update


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

git rm .gitattributes по
git add-a
git reset --hard