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

as

git reset --hard

будет не удалить неотслеженные файлы, где как Git-clean удалит любые файлы из отслеживаемого корневого каталога, которые не находятся под отслеживанием git. ВНИМАНИЕ-БУДЬТЕ ОСТОРОЖНЫ С ЭТИМ! Полезно сначала запустить сухой прогон с 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.

Ре-клон

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 чтобы сделать новые коммиты, которые отменяют предыдущие commits
  • 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 сделает это для вас.

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

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

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: Stash все файлы (наименее агрессивные)

`git stash --all` 

Я искал похожие проблемы

хотел выбросить локальные коммиты:

  1. клонировал репозиторий (git clone)
  2. переключился на dev branch (git checkout dev)
  3. сделал несколько коммитов (git commit-m "commit 1")
  4. но решил выбросить эти локальные коммиты, чтобы вернуться к удаленному (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

Finaly, повторите команду:

$ git reset --hard HEAD