Вопрос:

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

git version-control

2292891 просмотра

30 ответа

135576 Репутация автора

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

Автор: Readonly Источник Размещён: 09.09.2008 07:33

Ответы (30)


4775 плюса

52452 Репутация автора

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

git checkout -- .

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

git checkout -- path/to/file/to/revert

--здесь, чтобы удалить аргумент неоднозначности .

Автор: Tobi Размещён: 09.09.2008 07:37

2435 плюса

696707 Репутация автора

Решение

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

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

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

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

Автор: Greg Hewgill Размещён: 09.09.2008 07:39

306 плюса

537385 Репутация автора

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

git checkout .

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

git checkout-index -a -f
Автор: CB Bailey Размещён: 20.06.2009 10:28

44 плюса

755 Репутация автора

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

git diff | git apply --reverse
Автор: Joshua Kunzmann Размещён: 28.07.2011 05:27

28 плюса

615 Репутация автора

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

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

Автор: artur Размещён: 14.10.2011 09:07

230 плюса

3741 Репутация автора

git clean -df

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

-d: Удаление неотслеживаемых каталогов в дополнение к неотслеживаемым файлам

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

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

Автор: Elvis Ciotti Размещён: 07.12.2011 01:09

10 плюса

6743 Репутация автора

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

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

Автор: tjb Размещён: 15.06.2012 08:55

58 плюса

10327 Репутация автора

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

Посмотрите на статью выше для дальнейших советов.

Автор: blak3r Размещён: 13.08.2012 09:31

1760 плюса

24293 Репутация автора

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

git clean -df
git checkout -- .

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

Автор: Mariusz Nowak Размещён: 29.08.2012 06:28

7 плюса

1073 Репутация автора

Когда вы хотите передать тайник кому-то еще:

# 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

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

Автор: twicejr Размещён: 08.07.2013 03:07

16 плюса

8519 Репутация автора

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

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

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

Автор: GlassGhost Размещён: 05.09.2013 09:38

9 плюса

2421 Репутация автора

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

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

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

Автор: bbarker Размещён: 05.01.2014 04:53

41 плюса

4105 Репутация автора

git checkout -f


man git-checkout:

-f, --force

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

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

Автор: Bijan Размещён: 17.05.2014 02:28

14 плюса

310 Репутация автора

cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
Автор: vivekporwal04 Размещён: 30.05.2014 09:26

95 плюса

4169 Репутация автора

Мой любимый

git checkout -p

Это позволяет вам выборочно возвращать фрагменты.

Смотрите также:

git add -p
Автор: Ben Размещён: 10.10.2014 12:31

6 плюса

1878 Репутация автора

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

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

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

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

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

Автор: Ivan Размещён: 20.03.2015 03:38

21 плюса

3049 Репутация автора

просто скажи

git stash

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

git stash apply 

или Git Stash поп

Автор: piyushmandovra Размещён: 24.04.2015 12:19

33 плюса

788 Репутация автора

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

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

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

git add --all

Затем я

git fetch --all

Потом я сбрасываю на источник

git reset --hard origin/branchname

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

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

git reset --hard @{u}
Автор: Nick Размещён: 07.08.2015 09:15

36 плюса

2388 Репутация автора

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

git add .
git stash

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

git stash drop

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

ОБНОВИТЬ

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

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

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

Автор: Asped Размещён: 11.09.2015 11:59

6 плюса

1208 Репутация автора

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

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

    git diff

  • Убрать заначку

    git submodule update

Автор: onalbi Размещён: 01.10.2015 09:32

11 плюса

6728 Репутация автора

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

git reset --hard <commit hash>

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

Автор: msangel Размещён: 05.02.2016 12:59

84 плюса

10368 Репутация автора

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

git clean -dfx
git checkout .

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

-d

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

-f

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

-x

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

Также git checkout .необходимо сделать в корне репо.

Автор: Martin G Размещён: 28.04.2016 07:46

42 плюса

666 Репутация автора

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

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

Автор: Erdem ÖZDEMİR Размещён: 17.05.2016 11:27

10 плюса

1380 Репутация автора

По моему мнению,

git clean -df

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

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

Описание

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

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

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

Опции

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

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

Автор: Lahiru Размещён: 14.07.2016 07:03

21 плюса

4118 Репутация автора

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

git stash -u

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

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

git checkout -- .
git clean -df

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

Автор: Ben Wilde Размещён: 08.09.2016 06:19

6 плюса

164 Репутация автора

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

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

Автор: SDV Размещён: 08.02.2017 11:58

51 плюса

1009 Репутация автора

Самый простой способ сделать это с помощью этой команды:

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

git checkout -- .

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

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

git stash -u

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

Автор: A H M Forhadul Islam Размещён: 12.04.2017 09:27

7 плюса

5767 Репутация автора

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

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


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

discard = checkout --

Затем вы можете использовать его как следующий, чтобы отменить все изменения:

discard .

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

discard filename

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

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

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

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

cleanout

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

Автор: Pau Размещён: 05.06.2017 04:44

6 плюса

1204 Репутация автора

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

git update-index --assume-unchanged file_to_ignore

Автор: Jesús Castro Размещён: 31.07.2017 03:57

49 плюса

6811 Репутация автора

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

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

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

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

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

git stash
  • Все изменения будут перенесены в Git's Stash для последующего доступа.
  • Несколько вариантов доступны для более детального хранения; см. документацию
Автор: jtheletter Размещён: 18.03.2018 12:19
Вопросы из категории :
32x32