Git откатить локальные изменения

Если в рабочей директории были внесены нежелательные изменения восстановить состояние можно выполнив

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

Команда подтянет изменения из последнего сделанного коммита — содержимого HEAD. Локальные файлы будут замещены.

При этом те, изменения, которые уже были добавлены в индекс с git add в нем останутся.

Если коммиты не нужны — самый простой способ привести состояние локальной системы в соответствие состоянию удаленной:

Все данные в индексе и коммиты сбрасываются, состояние восстанавливается из указанной ветки, в примере master.

Самая частая практика при откате изменений git

Можно не трогать индекс и локальные файлы просто удаляя коммиты.

reflog выведет все список всех действий

reset возвращает состояние по индексу, взятому из списка

Таким же образом можно отменить последний коммит

После знака тильды можно указать любое другое число;

1 означает, что отменяется последний коммит,

3, что последние три и т.д. Список всех коммитов и комментариев можно увидеть выполнив git log

Другой способ сделать то же

Ключ —soft означает, что данные удалены не будут, только коммит, если заменить его на —hard удалятся и данные

В удаленном репозитории откатить изменения можно таким же образом — убрав последние коммиты, затем выполнив git push с локальной системы на которой ведется разработка.

Конфликты при внесении изменений в git репозитории неизбежны — если какое-то действие не возможно система не даст его выполнить и будет выводить предупреждения. Они обычно весьма информативны и конфиликты в версиях разрешаются редактированием файлов вручную.

Если нужно удалить коммит, и его не опубликовали:
git reset —hard HEAD^

Если опубликовали, делаем коммит для отмены коммита. После делаем push.
git revert commit-sha1

Нужно аккуратно вернуться к старому состоянию через git reset —hard хэшкоммита
Потом руками повторить все коммиты, которые были после (и они будут под вашим именем)
А затем запушить все это в удаленную репу через git push —force
Это изменит историю. Конечно если у вас есть соответвующие права.

Но если это возможно, ограничьтесь обычным revert (он добавляет новый коммит, откатывающий ваши изменения) или просто сделайте коммит с ручными правками. Гит так устроен, он не приветствует изменение истории.
Косяки бывают у всех, зачастую попытка их скрыть обходится дороже честного признания.

Изменения истории обратимы пока не сделали git gc .

git reflog покажет вам все что вы творили с историей.

Я хочу вернуться к более раннему коммиту. Как мне это сделать?

Вот что показывает команда git log :

1 ответ 1

Этот вопрос можно понять по-разному:

  1. Что значит вернуться или откатиться: просто посмотреть, изменить содержимое рабочей области, изменить историю Git?
  2. Что именно откатить: рабочую область (worktree), индекс (область подготовки коммита, staging area), текущую ветку, удаленную ветку?
  3. К какой позиции откатить: к индексу, к последнему коммиту, к произвольному коммиту?

Обозначим начальную ситуацию на следующей схеме:

A , B , C , D — коммиты в ветке master .
(HEAD) — местоположение указателя HEAD.
(i) — состояние индекса Git. Если совпадает c (HEAD) — пуст. Если нет — содержит изменения, подготовленные к следующему коммиту.
(wt) — состояние рабочей области проекта (working tree). Если совпадает с (i) — нет неиндексированных изменений, если не совпадает — есть изменения.
↑ обозначает коммит, на который указывает определенная ветка или указатель.

Вот решения, в зависимости от задачи:

Если вам нужно просто переключиться на другой коммит, чтобы, например, посмотреть на его содержимое, достаточно команды git checkout :

Сейчас репозиторий находится в состоянии «detached HEAD». Чтобы переключиться обратно, используйте имя ветки (например, master ):

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

3.1 Безопасно — с помощью кармана (stash)

3.1.1 Только неиндексированные

Можно удалить прикарманить только те изменения, которые еще не были индексированы (командой add ):

3.1.2 Индексированные и нет

Эта команда отменяет все индексированные и неиндексированные изменения в рабочей области, сохраняя их в карман (stash).

Восстановление несохраненных изменений: легко и просто.

Если stash совсем не нужен, его можно удалить.

После этого восстановить изменения всё ещё можно, но сложнее: How to recover a dropped stash in Git?

3.2 Опасный способ

Осторожно! Эта команда безвозвратно удаляет несохраненные текущие изменения из рабочей области и из индекса Если они вам все-таки нужны, воспользуйтесь git stash .

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

Здесь мы будем использовать git reset —hard

Осторожно! Эта команда переписывает историю Git-репозитория. Если вы уже опубликовали ( git push ) свои изменения, то этот способ использовать нельзя (см. почему). Используйте вариант из пункта 5 ( git revert ).

4.1 При этом сохранить изменения в индекс репозитория:

После этого индекс репозитория будет содержать все изменения от cccccc до dddddd . Теперь вы можете сделать новый коммит (или несколько) на основе этих изменений.

4.2 Сохранить изменения в рабочей области, но не в индексе.

Эта команда просто перемещает указатель ветки, но не отражает изменения в индексе (он будет пустым).

4.3 Просто выбросить изменения.

Осторожно! Эта команда безвозвратно удаляет несохраненные текущие изменения. Если удаляемые коммиты не принадлежат никакой другой ветке, то они тоже будут потеряны.

Восстановление коммитов: Используйте git reflog и этот вопрос чтобы найти и восстановить коммиты; иначе сборщик мусора удалит их безвозвратно через некоторое время.

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

Воспользуйтесь командой git revert . Она создает новые коммиты, по одному на каждый отменяемый коммит. Таким образом, если нужно отменить все коммиты после aaaaaa :

Восстановление: Если revert-коммит оказался ошибочным, используйте этот ответ.


[an error occurred while processing the directive]
Карта сайта