Как отбросить неустановленные изменения в 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 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
. Checkout "обновляет файлы в рабочем дереве в соответствии с версией в индексе". Если файлы не были поставлены (он же добавлен в индекс)... эта команда по существу вернется файлы, на которые вы записывались в последний раз.git checkout -- foo.txt
-
если вы поставили файл, используйте git reset. Reset изменяет индекс в соответствии с фиксацией.
git reset -- foo.txt
Я подозреваю, что с помощью git stash
- Это идеальный выбор, так как это немного менее опасно. Вы всегда можете вернуться к нему, если вы случайно сдуете слишком много при использовании git reset. Сброс рекурсивен по умолчанию.
взгляните на статья выше для дальнейших консультаций.
самый простой способ сделать это с помощью следующей команды:
эта команда используется для отмены изменений в рабочем каталоге -
git checkout -- .
https://git-scm.com/docs/git-checkout
в команде git скрытие неотслеженных файлов достигается с помощью:
git stash -u
Если вы не заинтересованы в сохранении неустановленных изменений (особенно если поэтапные изменения являются новыми файлами), я нашел это удобным:
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