У меня есть проект, в котором я запустил git init
.
После нескольких коммитов я выполнил git status
, который сообщил мне, что все обновлено и нет никаких локальных изменений.
Затем я сделал несколько последовательных изменений и понял, что хочу все выбросить и вернуться к исходному состоянию. Сможет ли эта команда сделать это за меня?
git reset --hard HEAD
Если вы хотите отменить изменения, внесенные в рабочую копию, сделайте следующее:
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. ПРЕДУПРЕЖДЕНИЕ - БУДЬТЕ ОСТОРОЖНЫ С ЭТИМ! Полезно сначала выполнить пробный запуск git-clean, чтобы посмотреть, что он удалит.
Это также особенно полезно, когда вы получаете сообщение об ошибке
~"performing this command will cause an un-tracked file to be overwritten"
Которое может возникнуть при выполнении нескольких действий, одно из которых - обновление рабочей копии, когда вы и ваш друг добавили новый файл с одинаковым именем, но он зафиксировал его в системе контроля исходного кода первым, а вы не заботитесь об удалении своей неотслеживаемой копии.
В этой ситуации пробный запуск также поможет вам увидеть список файлов, которые будут перезаписаны.
GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
.gitignore
(например, файлы сборки).gitignore
Следующие другие команды я забываю ежедневно.
git clean --force -d -x
git reset --hard
.gitignore
(например, файлы сборки).gitignore
git clean --force -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
выше, но вы можете отменить егоЕсли вы хотите отменить все изменения И быть в курсе текущего удаленного мастера (например, вы обнаружите, что мастер HEAD продвинулся вперед с тех пор, как вы разветвили его, и ваш толчок «отклоняется»), вы можете использовать
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-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
просто скажи
git stash
это удалит все ваши местные чаги. и вы также можете использовать позже, сказав
git stash apply
Прочитав кучу ответов и попробовав их, я обнаружил различные крайние случаи, которые означают, что иногда они не полностью очищают рабочую копию.
Вот мой текущий скрипт bash для этого, который работает все время.
#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD
Запустите из корневого каталога рабочей копии.
Я встретил похожую проблему.
Решение состоит в том, чтобы использовать git log
, чтобы посмотреть, какая версия локального коммита отличается от удаленного. (Например. версия 3c74a11530697214cbcc4b7b98bf7a65952a34ec
).
Затем используйте git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec
, чтобы отменить изменение.
Я искал подобную проблему
Хотел выбросить местные коммиты:
Так же, как и ниже:
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 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`
Попробуйте это для отмены всех изменений, не совершенных в локальной ветке
$ 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