Как вернуть все локальные изменения в управляемом проекте Git в предыдущее состояние?
у меня есть проект, в котором я побежал git init
.
После нескольких коммитов, я сделал git status
, который сказал, что все в курсе и не было никаких местных изменений.
затем я сделал несколько последовательных изменений и понял, что хочу выбросить все и вернуться к своему первоначальному состоянию. Эта команда сделает это за меня?
git reset --hard HEAD
12 ответов:
если вы хотите вернуть изменения, внесенные в вашу рабочую копию, сделайте это:
git checkout .
если вы хотите вернуть изменения, внесенные в индекс (т. е., что вы добавили), сделайте это. предупреждение это сбросит все ваши неопущенные коммиты на master!:
git reset
если вы хотите отменить изменения, которые вы совершили, сделайте следующее:
git revert <commit 1> <commit 2>
если вы хотите удалить неотслеженные файлы (например, новые файлы, сгенерированные файлы):
git clean -f
или неотслеженные каталоги (например, новые или автоматически сгенерированные каталоги):
git clean -fd
Примечание: Вы также можете запустить
git clean -fd
как
git reset --hard
будет не удалить неотслеженные файлы, где как git-clean удалит любые файлы из отслеживаемого корневого каталога, которые не находятся под отслеживанием git. ВНИМАНИЕ-БУДЬТЕ ОСТОРОЖНЫ С ЭТИМ! Полезно сначала запустить dry-run с git-clean, чтобы увидеть, что он удалит.
Это также особенно полезно, когда вы получаете сообщение об ошибке
~"performing this command will cause an un-tracked file to be overwritten"
что может произойти, когда делая несколько вещей, один из которых обновляет рабочую копию, когда вы и ваш друг добавили новый файл с тем же именем, но он сначала передал его в систему управления версиями, и вам не нужно удалять свою неотслеженную копию.
В этой ситуации, на пробежке также поможет показать вам список файлов, которые будут перезаписаны.
Если вы хотите отменить все изменения и быть в курсе текущего удаленного мастера (например, вы обнаружите, что главная головка переместилась вперед, так как вы разветвились от нее, и ваш толчок "отклоняется"), вы можете использовать
git fetch # will fetch the latest changes on the remote git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.
Re-clone
GIT=$(git rev-parse --show-toplevel) cd $GIT/.. rm -rf $GIT git clone ...
- удаляет локальные, не нажатые коммиты
- отменяет изменения, внесенные в отслеживаемые файлы
- восстанавливает отслеженные файлы, которые вы удалили
- удаляет файлы / dirs, перечисленные в
.gitignore
(например, файлы сборки)- удаляет файлы / dirs, которые не отслеживаются и не в
.gitignore
- вы не забудете этот подход
- потери пропускной способности
следующий другие команды я забываю ежедневно.
очистить и восстановить
git clean -f -d -x git reset --hard
- удаляет локальные, не нажатые коммиты
- отменяет изменения, внесенные в отслеживаемые файлы
- восстанавливает отслеженные файлы, которые вы удалили
- удаляет файлы / dirs, перечисленные в
.gitignore
(например, файлы сборки)- удаляет файлы / dirs, которые не отслеживаются и не в
.gitignore
очистить
git clean -f -d -x
- удаление локальные, не толкаемые коммиты
- отменяет изменения, внесенные в отслеживаемые файлы
- восстанавливает отслеженные файлы, которые вы удалили
- удаляет файлы / dirs, перечисленные в
.gitignore
(например, файлы сборки)- удаляет файлы / dirs, которые не отслеживаются и не в
.gitignore
сброс
git reset --hard
- удаляет локальные, не нажатые коммиты
- отменяет изменения, внесенные в отслеживаемые файлы
- восстанавливает отслеженные файлы, которые вы удалили
- удаляет файлы / dirs, перечисленные в
.gitignore
(например, файлы сборки)- удаляет файлы / dirs, которые не отслеживаются и не в
.gitignore
Примечания
тестовый случай для подтверждения всего вышеперечисленного (используйте bash или sh):
mkdir project cd project git init echo '*.built' > .gitignore echo 'CODE' > a.sourceCode mkdir b echo 'CODE' > b/b.sourceCode cp -r b c git add . git commit -m 'Initial checkin' echo 'NEW FEATURE' >> a.sourceCode cp a.sourceCode a.built rm -rf c echo 'CODE' > 'd.sourceCode'
см. также
git revert
чтобы сделать новые коммиты, которые отменяют предыдущие коммитыgit checkout
чтобы вернуться во времени к предыдущим коммитам (может потребоваться сначала выполнить команды выше)git stash
то же, что иgit reset
выше, но вы можете отменить его
посмотреть в Git-reflog. Он будет перечислять все состояния, которые он помнит (по умолчанию 30 дней), и вы можете просто проверить тот, который вы хотите. Например:
$ git init > /dev/null $ touch a $ git add . $ git commit -m"Add file a" > /dev/null $ echo 'foo' >> a $ git commit -a -m"Append foo to a" > /dev/null $ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null $ git reset --hard HEAD^^ > /dev/null $ cat a foo b c $ git reflog 145c322 HEAD@{0}: HEAD^^: updating HEAD ae7c2b3 HEAD@{1}: commit: Append e to a fdf2c5e HEAD@{2}: commit: Append d to a 145c322 HEAD@{3}: commit: Append c to a 363e22a HEAD@{4}: commit: Append b to a fa26c43 HEAD@{5}: commit: Append foo to a 0a392a5 HEAD@{6}: commit (initial): Add file a $ git reset --hard HEAD@{2} HEAD is now at fdf2c5e Append d to a $ cat a foo b c d
опасность впереди: (пожалуйста, прочитайте комментарии. Выполнение команды, предложенной в моем ответе, может удалить больше, чем вы хотите)
чтобы полностью удалить все файлы включая каталоги, я должен был работать
git clean -f -d
прочитав кучу ответов и попробовав их, я нашел различные крайние случаи, которые иногда означают, что они не полностью очищают рабочую копию.
вот мой текущий скрипт bash для этого, который работает все время.
#!/bin/sh git reset --hard git clean -f -d git checkout -- HEAD
запуск из корневого каталога рабочей копии.
просто сказать
git stash
он удалит все ваши местные чаги. и вы также можете использовать позже, сказав
git stash apply
я столкнулся с подобной проблемой. Решение заключается в использовании
git log
, чтобы посмотреть, какая версия локальной фиксации отличается от дистанционного. (Например, версия3c74a11530697214cbcc4b7b98bf7a65952a34ec
).затем использовать
git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec
чтобы отменить изменения.
возможно, Вам не обязательно нужно / нужно прятать ваши рабочие / файлы в вашем рабочем каталоге, но вместо этого просто избавиться от них полностью. Команда
git clean
сделает это за вас.некоторые общие случаи использования для этого было бы удалить хлама который был создан слиянием или внешними инструментами или удалением других файлов, чтобы вы могли запустить чистую сборку.
имейте в виду, что вы хотите быть очень осторожными с этой командой, так как она предназначена для удалите файлы из локального рабочего каталога, которые не отслеживаются. если вы внезапно передумаете после выполнения этой команды, нет возврата, чтобы увидеть содержимое файлов, которые были удалены. Альтернативой, которая является более безопасной, является выполнение
git stash --all
который удалит все, но сохранит все это в тайнике. Этот тайник может быть использован позже.
однако, если вы действительно хотите удалить все файлы и очистить ваш рабочий каталог, вы должны выполнить
git clean -f -d
это позволит удалить любые файлы, а также любые подкаталоги, которые не имеют каких-либо предметов в результате команды. Умная вещь, чтобы сделать перед выполнением
git clean -f -d
команда должна выполнятьсяgit clean -f -d -n
который покажет вам предварительный просмотр того, что будет удален после выполнения
git clean -f -d
Итак, вот краткое изложение ваших вариантов от самых агрессивных до наименее агрессивных
1: удалить все файлы локально(наиболее агрессивных)
git clean -f -d
2: предварительный просмотр вышеуказанного воздействия (предварительный просмотр наиболее агрессивный)
git clean -f -d -n
3: прятать все файлы (наименее агрессивные)
`git stash --all`
Я искал похожие проблемы
хотел выбросить локальные коммиты:
- клонировал репозиторий (git clone)
- переключился на ветку dev (git checkout dev)
- сделал несколько коммитов (git commit-m "commit 1")
- но решил выбросить эти локальные коммиты, чтобы вернуться к удаленному (origin / dev)
Так же, как и ниже:
git reset --hard origin/dev
Регистрация:
git status On branch dev Your branch is up-to-date with 'origin/dev'. nothing to commit, working tree clean
теперь локальные коммиты теряются, возвращаясь в исходное клонированное состояние, пункт 1 выше.
попробуйте это для возврата всех изменений, незафиксированных в локальной ветке
$ git reset --hard HEAD
но если вы видите ошибку типа:
fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.
вы можете перейти к '.git ' папка затем удалить индекс.блокировка файла:
$ cd /directory/for/your/project/.git/ $ rm index.lock
наконец, выполните еще раз команду:
$ git reset --hard HEAD