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


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

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

git reset --hard HEAD
12 1591

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` 

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

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

  1. клонировал репозиторий (git clone)
  2. переключился на ветку dev (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

наконец, выполните еще раз команду:

$ git reset --hard HEAD