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

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

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

git reset --hard HEAD

Ответ 1

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

git checkout .

Если вы хотите отменить изменения, внесенные в индекс (т.е. вы добавили), сделайте это. Предупреждение: reset все ваши неустановленные коммиты для освоения!:

git reset

Если вы хотите вернуть внесенное изменение, сделайте следующее:

git revert <commit 1> <commit 2>

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

git clean -f

Или не отслеживаемые каталоги (например, новые или автоматически созданные каталоги):

git clean -fd

Ответ 2

Примечание. Вы также можете запустить

git clean -fd

а

git reset --hard

не удалит ненужные файлы, где git -clean удалит любые файлы из отслеживаемого корневого каталога, которые не находятся под git отслеживанием. ПРЕДУПРЕЖДЕНИЕ - ОСТОРОЖНО! Полезно запускать сухой пробег с помощью git -clean сначала, чтобы увидеть, что он будет удалять.

Это также особенно полезно, когда вы получаете сообщение об ошибке

~"performing this command will cause an un-tracked file to be overwritten"

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

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

Ответ 3

Re-клон

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • Local Удаляет локальные не выдвинутые коммиты
  • Changes Отменяет сделанные вами изменения в отслеживаемых файлах
  • Tra Восстанавливает отслеженные файлы, которые вы удалили
  • ✅ Удаляет файлы/каталоги, перечисленные в .gitignore (например, файлы сборки)
  • ✅ Удаляет файлы/каталоги, которые не отслеживаются и отсутствуют в .gitignore
  • 😀 Вы не забудете этот подход
  • 😔 пропускная способность отходов

Ниже приведены другие команды, которые я ежедневно забываю.

Очистить и перезагрузить

git clean --force -d -x
git reset --hard
  • Local Удаляет локальные не выдвинутые коммиты
  • Changes Отменяет сделанные вами изменения в отслеживаемых файлах
  • Tra Восстанавливает отслеженные файлы, которые вы удалили
  • ✅ Удаляет файлы/каталоги, перечисленные в .gitignore (например, файлы сборки)
  • ✅ Удаляет файлы/каталоги, которые не отслеживаются и отсутствуют в .gitignore

Чистый

git clean --force -d -x
  • Local Удаляет локальные не выдвинутые коммиты
  • Changes Отменяет сделанные вами изменения в отслеживаемых файлах
  • Tra Восстанавливает отслеженные файлы, которые вы удалили
  • ✅ Удаляет файлы/каталоги, перечисленные в .gitignore (например, файлы сборки)
  • ✅ Удаляет файлы/каталоги, которые не отслеживаются и отсутствуют в .gitignore

Сбросить

git reset --hard
  • Local Удаляет локальные не выдвинутые коммиты
  • Changes Отменяет сделанные вами изменения в отслеживаемых файлах
  • Tra Восстанавливает отслеженные файлы, которые вы удалили
  • ❌ Удаляет файлы/каталоги, перечисленные в .gitignore (например, файлы сборки)
  • ❌ Удаляет файлы/каталоги, которые не отслеживаются и не находятся в .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 выше, но вы можете отменить его

Ответ 4

Если вы хотите вернуть все изменения и обновиться с текущим удаленным мастером (например, вы обнаружите, что ведущий HEAD продвинулся вперед, так как вы отделили его, а ваш push "отклонен" ), вы можете использовать

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.

Ответ 5

Посмотрите на 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 [email protected]{0}: HEAD^^: updating HEAD
ae7c2b3 [email protected]{1}: commit: Append e to a
fdf2c5e [email protected]{2}: commit: Append d to a
145c322 [email protected]{3}: commit: Append c to a
363e22a [email protected]{4}: commit: Append b to a
fa26c43 [email protected]{5}: commit: Append foo to a
0a392a5 [email protected]{6}: commit (initial): Add file a
$ git reset --hard [email protected]{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

Ответ 6

ОПАСНОСТЬ ВПЕРЕД: (пожалуйста, прочитайте комментарии. Выполнение команды, предложенной в моем ответе, может удалить больше, чем вы хотите)

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

git clean -f -d

Ответ 7

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

Здесь мой текущий bash script для этого, который работает все время.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Запуск из корневого каталога рабочей копии.

Ответ 8

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

git stash

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

git stash apply 

Ответ 9

У меня была аналогичная проблема. Решение состоит в использовании git log для поиска, какая версия локального коммита отличается от удаленного. (Например, версия 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Затем используйте git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec, чтобы вернуть изменение.

Ответ 10

Я искал аналогичную проблему,

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

  • клонировал репозиторий (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 выше.

Ответ 11

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

`git stash --all` 

Ответ 12

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

$ git reset --hard HEAD

Но если вы видите такую ​​ошибку:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

Вы можете перейти в папку ".git", а затем удалить файл index.lock:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Завершить, снова запустите команду:

$ git reset --hard HEAD