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


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

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

git reset --hard HEAD

1528


источник


Ответы:


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

git checkout .

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

git reset

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

git revert <commit 1> <commit 2>

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

git clean -f

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

git clean -fd

2766



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

git clean -fd

в виде

git reset --hard

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

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

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

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

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


334



Если вы хотите вернуть все изменения и быть актуальными с текущим удаленным мастером (например, вы обнаружите, что ведущий 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.

57



Посмотрите на 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

47



Re-клон

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

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

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

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

чистый

git clean -f -d -x
  • НЕ удаляет локальные, не нажатые коммиты
  • НЕ отменяет изменения, внесенные вами в отслеживаемые файлы
  • НЕ восстанавливает удаленные удаленные файлы
  • Удаляет файлы / каталоги, перечисленные в .gitignore(например, файлы сборки)
  • Удаляет файлы / директории, которые не отслеживаются, а не .gitignore

Сброс

git reset --hard
  • НЕ удаляет локальные, не нажатые коммиты
  • Отменяет изменения, внесенные вами в отслеживаемые файлы
  • Восстанавливает удаленные файлы
  • Удаляет файлы / каталоги, перечисленные в .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выше, но вы можете отменить его

36



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

Вот мой текущий сценарий bash для этого, который работает все время.

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

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


34



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

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

git clean -f -d

33



simply say

git stash

it will remove all your local chages. and you also can use later by saying

git stash apply 

28



I met a similar problem. The solution is to use git log to look up which version of the local commit is different from the remote. (E.g. the version is 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Then use git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec to revert the change.


26



I searched for a similar issue,

Wanted to throw away local commits:

  1. cloned the repository (git clone)
  2. switched to dev branch (git checkout dev)
  3. did few commits (git commit -m "commit 1")
  4. but decided to throw away these local commits to go back to remote (origin/dev)

So did the below:

git reset --hard origin/dev

Check:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

now local commits are lost, back to the initial cloned state, point 1 above.


6



You may not necessarily want/need to stash your work/files in your working directory but instead simply get rid of them completely. The command git clean will do this for you.

Some common use cases for doing this would be to remove cruft that has been generated by merges or external tools or remove other files so that you can run a clean build.

Keep in mind you will want to be very cautious of this command, since its designed to remove files from your local working directory that are NOT TRACKED. if you suddently change your mind after executing this command, there is no going back to see the content of the files that were removed. An alternative which is safer is to execute

git stash --all

which will remove everything but save it all in a stash. This stash can then later be used.

However, if you truly DO want to remove all the files and clean your working directory, you should execute

git clean -f -d

This will remove any files and also any sub-directories that don't have any items as a result of the command. A smart thing to do before executing the git clean -f -d command is to run

git clean -f -d -n

which will show you a preview of what WILL be removed after executing git clean -f -d

So here is a summary of your options from most aggressive to least aggressive


Option 1: Remove all files locally(Most aggressive)

git clean -f -d

Option 2: Preview the above impact(Preview most aggressive)

git clean -f -d -n

Option 3: Stash all files (Least aggressive)

`git stash --all` 

5



Try this for revert all changes uncommited in local branch

$ git reset --hard HEAD

But if you see a error like this:

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

You can navigate to '.git' folder then delete index.lock file:

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

Finaly, run again the command:

$ git reset --hard HEAD

5