Как отбросить неустановленные изменения в 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