пятница, 13 февраля 2015 г.

Основы Git - Отмена изменений

Отмена изменений

На любой стадии может возникнуть необходимость что-либо отменить. Здесь мы рассмотрим несколько основных инструментов для отмены произведённых изменений. Будьте осторожны, ибо не всегда можно отменить сами отмены. Это одно из немногих мест в Git'е, где вы можете потерять свою работу если сделаете что-то неправильно.
Изменение последнего коммита

Одна из типичных отмен происходит тогда, когда вы делаете коммит слишком рано, забыв добавить какие-то файлы, или напутали с комментарием к коммиту. Если вам хотелось бы сделать этот коммит ещё раз, вы можете выполнить commit с опцией --amend:

$ git commit --amend

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

Появится всё тот же редактор для комментариев к коммитам, но уже с введённым комментарием к последнему коммиту. Вы можете отредактировать это сообщение так же, как обычно, и оно перепишет предыдущее.

Например я сделал первый коммит файлика в Git и сразу же после этого решил поменять комментарий к нему. Мой первый комментарий был – “Первый коммит”, заменим его

U00001

Теперь изменим наш комментарий

U00002

Закрываем редактор

U00003

И видим что наш комментарий к коммиту был изменен.

Или для примера добавим к этому же последнему коммиту еще один файл. Я его создал и решил добавить к первому коммиту

U00004

Меняем наш коммент на другой

U00005

Вот и добавили все в тот же первый коммит еще один файл и поменяли комментарий к первому коммиту снова

U00006

Отмена индексации файла

Приведём пример. Допустим, вы внесли изменения в два файла и хотите записать их как два отдельных коммита, но случайно набрали git add . и проиндексировали оба файла. Как теперь отменить индексацию одного из двух файлов? Команда git status напомнит вам об этом:

U00007

Сразу после надписи “Changes to be committed”, написано использовать git reset HEAD <файл>... для исключения из индекса. Так что давайте последуем совету и отменим индексацию файла Test.txt:

U00008

Как видим файл Test.txt изменён, но снова не в индексе.

Отмена изменений файла

Что, если вы поняли, что не хотите оставлять изменения, внесённые в файл Test.txt? Как быстро отменить изменения, вернуть то состояние, в котором он находился во время последнего коммита (или первоначального клонирования, или какого-то другого действия, после которого файл попал в рабочий каталог)? К счастью, git status говорит, как добиться и этого. В выводе для последнего примера, неиндексированная область выглядит следующим образом:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

Здесь довольно ясно сказано, как отменить сделанные изменения. Давайте сделаем это.

U00009

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

В данном случае файл Test.txt был переписан сверху своей копией из предыдущего коммита.

Помните, что всё, что является частью коммита в Git'е, почти всегда может быть восстановлено. Даже коммиты, которые находятся на ветках, которые были удалены, и коммиты переписанные с помощью --amend могут быть восстановлены. Несмотря на это, всё, что никогда не попадало в коммит, вы скорее всего уже не увидите снова.

Комментариев нет:

Отправка комментария