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

3956

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

  • 0
    См. Также stackoverflow.com/questions/22620393/…
  • 5
    git-clean удаляет только неотслеживаемые файлы из рабочего дерева git-scm.com/docs/git-clean
Показать ещё 6 комментариев
Теги:

32 ответа

2336
Лучший ответ

Еще один быстрый способ:

git stash save --keep-index --include-untracked

Вам не нужно включать --include-untracked если вы не хотите быть --include-untracked.

После этого вы можете сбросить этот штамп с помощью команды git stash drop если хотите.

  • 114
    И чтобы быть внимательным, вы бы хотели --include-untracked .
  • 0
    Я думаю, что лучше использовать git reset --hard, если вы не хотите отслеживать изменения
Показать ещё 20 комментариев
4518

Для всех неустановленных файлов используйте:

git checkout -- .

Для конкретного использования файла:

git checkout path/to/file/to/revert

Обязательно укажите период в конце.

  • 94
    Это, кажется, мерзкий канонический путь. то есть именно то, что git говорит вам делать, если вы вводите git status
  • 22
    Не работает, если есть неотслеживаемые файлы. Git сообщает error: The following untracked working tree files would be overwritten by checkout: ...
Показать ещё 24 комментария
1643

Похоже, что полное решение:

git clean -df
git checkout -- .

git clean удаляет все необработанные файлы (warning), в то время как он не удаляет игнорируемые файлы, упомянутые непосредственно в .gitignore, он может удалить проигнорированные файлы, находящиеся в папках), а git checkout очищает все неустановленные изменения.

  • 101
    Два других ответа на самом деле не работают, этот сработал.
  • 2
    по какой-то причине это вернулось к предыдущей фиксации
Показать ещё 16 комментариев
297

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

git checkout .

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

git checkout-index -a -f
  • 24
    Привет, в чем разница между git checkout . и git checkout -- . ?
  • 3
    @Evan: нет разницы в этом случае.
Показать ещё 4 комментария
228
git clean -df

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

-d: удалить ненужные каталоги в дополнение к файлам без следа

-f: Сила (может быть необязательна в зависимости от настройки clean.requireForce)

Запустите git help clean, чтобы просмотреть руководство

  • 0
    почему этот ответ не имеет всех голосов? ответил еще в 2011 году и до сих пор правильно.
85

Мой любимый

git checkout -p

Это позволяет выборочно возвращать куски.

См. также:

git add -p
  • 8
    Я люблю способность видеть фактическое изменение прежде, чем оно будет сброшено.
  • 0
    Это то, что я использую. git checkout -p и затем "a", чтобы принять все.
Показать ещё 1 комментарий
65

Поскольку никакой ответ не предлагает точного варианта комбинации, которую я использую, вот он:

git clean -dfx
git checkout .

Это текст интерактивной справки для используемых опций git clean:

-d

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

-f

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

-x

Не используйте правила игнорирования из .gitignore (для каждого каталога) и $GIT_DIR/info/exclude, но все равно используйте правила игнорирования, заданные с параметрами -e. Это позволяет удалить все необработанные файлы, включая сборку продуктов. Это можно использовать (возможно, в сочетании с git reset), чтобы создать нетронутый рабочий каталог для проверки чистой сборки.

Кроме того, git checkout. необходимо выполнить в корне репо.

  • 0
    +1 за это решение. Что касается вашего замечания о том, что «git checkout. Должен быть сделан в корне репозитория», возможно, вы могли бы упомянуть, что мы можем просто вместо этого сделать git reset --hard ? (что на самом деле эквивалентно git reset --hard HEAD и должно работать в зависимости от текущего каталога ...)
  • 0
    git clean -dfx касается первой команды git clean -dfx , вот совет, которым я пользуюсь, чтобы быть в безопасности перед его запуском: просто запустите git clean -d -x -n прежде, чтобы отобразить список файлов, которые будут удалены , затем подтвердите операцию, запустив git clean -d -x -f (в конце я поставил аргумент -n , соответственно -f чтобы можно было быстро изменить его в терминале)
Показать ещё 1 комментарий
53

Я действительно нашел эту статью полезной для объяснения, когда использовать какую команду: 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. Reset по умолчанию рекурсивный.

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

43

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

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

git checkout -- .

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

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

git stash -u

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

  • 13
    Дважды я приходил сюда, читал этот ответ и забывал . в конце. Для будущего меня: период необходим !
  • 1
    Мне нужно было избавиться от всех локальных изменений в подкаталоге, не стирая все остальные изменения. Этот ответ очень помог, спасибо
Показать ещё 3 комментария
40

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

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

  • 1
    Понижено, потому что это не помогает быстро удалить все файлы. Три точки указывают, что вы должны перечислить все файлы. Это особенно плохо, если вам нужно удалить сразу несколько файлов, например. во время большого слияния после того, как вы сделали все изменения, которые хотите сохранить
  • 2
    Конечно, правильной командой является «git checkout -». одна точка. В комментарии три точки были грамматическими, чтобы указать, что есть много других вариантов, которые можно было бы использовать.
39

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

git diff | git apply --reverse
  • 6
    это пропускает любые неотслеживаемые файлы, что может быть хорошо
37

git checkout -f


man git-checkout:

-f, --force

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

При проверке путей из индекса не терпите неудачу при несанкционированных вводах; вместо этого игнорируемые записи игнорируются.

  • 2
    Это отбросило бы изменения в индексе !! (И ОП требует оставить их как есть.)
32

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

git add .
git stash

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

git stash drop

Ответ от Bilal Maqsood с помощью git clean также работал на меня, но с приложением у меня больше контроля - если я случайно сделаю это, я все равно могу вернуть свои изменения

UPDATE

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

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

без -A удаленные файлы не будут размещены

32

Вместо отбрасывания изменений я reset мой пульт в начало. Примечание. Этот метод предназначен для полного восстановления вашей папки с помощью репо.

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

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

git add --all

Тогда I

git fetch --all

Тогда я reset в начало

git reset --hard origin/branchname

Это вернет его к квадрату. Точно так же, как RE-клонирование ветки, WHILE, сохраняя все мои gitignored файлы локально и на месте.

Обновлено на комментарий пользователя ниже: Изменение до reset для любой текущей ветки, на которой пользователь включен.

git reset --hard @{u}
  • 0
    Это мой предпочтительный вариант, но почему вы сначала добавляете все изменения? Насколько я знаю, это просто изменяет список каталогов в файлах Git, а при использовании git reset --hard это все равно будет потеряно, пока каталоги все равно будут удалены.
  • 0
    Я не на Mac или Linux, Github Windows PowerShell иногда оставляет файлы после сброса. Я думаю, потому что git reset устанавливает все файлы в репо в исходное состояние. Если они не добавлены, они не затронуты. Затем клиент рабочего стола получит сообщение «эй, этот файл здесь и его нужно зафиксировать»
Показать ещё 6 комментариев
26

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

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

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

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

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

git stash
  • Все изменения будут перенесены в Git Stash для возможного последующего доступа.
  • Несколько вариантов доступны для более тонкого stashing; см. документацию.
  • 0
    Это точно преобразует ваши изменения и удаляет вновь добавленные файлы из предыдущего коммита.
24

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

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

21

просто скажите

git stash

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

git stash apply 

или   git stash pop

20

Просто используйте:

git stash -u

Готово. Легко.

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

git checkout -- .
git clean -df

Тем не менее, мне нравится git stash -u лучшее, потому что он "отбрасывает" все отслеживаемые и не проверенные изменения только в одной команде. Тем не менее git checkout -- . только отбрасывает отслеживаемые изменения, и git clean -df только отбрасывает невоспроизводимые изменения... и ввод обеих команд - это слишком много работы:)

  • 0
    Примечание: git stash -u скоро (Git 2.14.x / 2.15, Q3 2017) будет развиваться немного: stackoverflow.com/a/46027357/6309
  • 0
    Если я правильно понял вопрос ОП, индексированные файлы должны быть сохранены. Только нестандартные изменения должны быть удалены. Так что это должно быть git stash -k по моему мнению.
16

Это работает даже в каталогах; вне нормальных разрешений git.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Случилось недавно недавно

  • 0
    Остерегайтесь, однако, что игнорируемый контент git не сохранит свои первоначальные разрешения! Следовательно, это может вызвать угрозу безопасности.
  • 0
    @twicejr Вы не правы, пожалуйста, прочтите git help clean "-d Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам."
Показать ещё 3 комментария
14
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
10

Независимо от того, в каком состоянии ваше репо находится, вы всегда можете сбросить все предыдущие фиксации:

git reset --hard <commit hash>

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

  • 0
    Это также отбрасывает все в индексе (не только вещи, не входящие в индекс), что выходит за рамки того, что запрашивает OP.
10

Другой способ избавиться от новых файлов, более специфичных, чем git clean -df (он позволит вам избавиться от некоторых файлов не обязательно всех), заключается в том, чтобы сначала добавить новые файлы в индекс, затем stash, затем отбросьте тайник.

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

9

По-моему,

git clean -df

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

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

Описание

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

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

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

Опции

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

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

9

То, что следует, действительно является лишь решением, если вы работаете с вилкой репозитория, где вы регулярно синхронизируете (например, запрос на передачу) с другим репо. Короткий ответ: удалите fork и refork, но прочитайте предупреждения о 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

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

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

7

Если вы хотите перенести чек на кого-то другого:

# 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

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

  • 5
    На самом деле Git stash может иметь заголовок. Например, git stash save "Feature X work in progress" .
6

Если все поэтапные файлы были фактически зафиксированы, то ветка может быть просто reset, например. из вашего графического интерфейса с тремя щелчками мыши: Ветка, Reset, Да!

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

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

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

Таким образом, я просто делаю commit, ветвь reset и изменить последнюю фиксацию.

5

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

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


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

discard = checkout --

Затем вы можете использовать его для удаления всех изменений:

discard .

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

discard filename

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

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

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

Поэтому использование простое:

cleanout

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

5

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

git rm.gitattributes
git add -A
git reset --hard

5

Ни одно из решений не работает, если вы просто изменили разрешения файла (это на 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

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

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

5

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

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

    git diff

  • Чтобы удалить скрытый текст

    git submodule update

4

Если почти невозможно исключить модификации файлов, считаете ли вы их игнорированием? Если это утверждение правильно, и вы не будете касаться этих файлов во время разработки, эта команда может быть полезна:

git update-index --assume-unchanged file_to_ignore

0

Просто используйте:

git stash -k -u

Это закроет неустановленные изменения и необработанные файлы (новые файлы) и сохранит поставленные файлы.

Это лучше, чем reset/checkout/clean, потому что вы можете захотеть их позже (через git stash pop). Держать их в кошельке лучше, чем отбрасывать их.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню