Человеку свойственно ошибаться. Таким образом, каждая VCS предоставляет функцию исправления ошибок до определенного момента. Git предоставляет функцию, которую мы можем использовать для отмены изменений, внесенных в локальный репозиторий.
Предположим, пользователь случайно вносит некоторые изменения в свой локальный репозиторий, а затем хочет отменить эти изменения. В таких случаях операция возврата играет важную роль.
Отменить незафиксированные изменения
Предположим, что Джерри случайно изменил файл из своего локального хранилища. Но он хочет отменить свою модификацию. Чтобы справиться с этой ситуацией, мы можем использовать команду git checkout . Мы можем использовать эту команду, чтобы вернуть содержимое файла.
[jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git status -s M string_operations.c [jerry@CentOS src]$ git checkout string_operations.c [jerry@CentOS src]$ git status –s
Кроме того, мы можем использовать команду git checkout для получения удаленного файла из локального хранилища. Предположим, Том удаляет файл из локального репозитория, и мы хотим вернуть этот файл. Мы можем добиться этого, используя ту же команду.
[tom@CentOS src]$ pwd /home/tom/top_repo/project/src [tom@CentOS src]$ ls -1 Makefile string_operations.c [tom@CentOS src]$ rm string_operations.c [tom@CentOS src]$ ls -1 Makefile [tom@CentOS src]$ git status -s D string_operations.c
Git показывает букву D перед именем файла. Это указывает на то, что файл был удален из локального хранилища.
[tom@CentOS src]$ git checkout string_operations.c [tom@CentOS src]$ ls -1 Makefile string_operations.c [tom@CentOS src]$ git status -s
Примечание. Мы можем выполнить все эти операции перед фиксацией.
Удалить изменения из области подготовки
Мы видели, что когда мы выполняем операцию добавления, файлы перемещаются из локального репозитория в указанную область. Если пользователь случайно изменил файл и добавил его в область подготовки, он может отменить свои изменения с помощью команды git checkout .
В Git есть один указатель HEAD, который всегда указывает на последний коммит. Если вы хотите отменить изменение из промежуточной области, то вы можете использовать команду git checkout, но с командой checkout вы должны предоставить дополнительный параметр, то есть указатель HEAD. Дополнительный параметр указателя фиксации дает команду git checkout сбросить рабочее дерево, а также удалить подготовленные изменения.
Предположим, Том изменяет файл из своего локального хранилища. Если мы просмотрим статус этого файла, он покажет, что файл был изменен, но не добавлен в промежуточную область.
tom@CentOS src]$ pwd /home/tom/top_repo/project/src # Unmodified file [tom@CentOS src]$ git status -s # Modify file and view it’s status. [tom@CentOS src]$ git status -s M string_operations.c [tom@CentOS src]$ git add string_operations.c
Состояние Git показывает, что файл присутствует в промежуточной области, теперь отмените его, используя команду git checkout, и просмотрите статус возвращенного файла.
[tom@CentOS src]$ git checkout HEAD -- string_operations.c [tom@CentOS src]$ git status -s
Переместить указатель головы с помощью Git Reset
После внесения нескольких изменений вы можете удалить эти изменения. Команда сброса Git используется для сброса или отмены изменений. Мы можем выполнить три различных типа операций сброса.
На диаграмме ниже показано графическое представление команды сброса Git.
Мягкий
Каждая ветвь имеет указатель HEAD, который указывает на последний коммит. Если мы используем команду сброса Git с параметром —soft, за которым следует идентификатор фиксации, то он будет сбрасывать только указатель HEAD, не разрушая ничего.
Файл .git / refs /head / master хранит идентификатор фиксации указателя HEAD. Мы можем проверить это с помощью команды git log -1 .
[jerry@CentOS project]$ cat .git/refs/heads/master 577647211ed44fe2ae479427a0668a4f12ed71a1
Теперь просмотрите последний идентификатор фиксации, который будет соответствовать вышеуказанному идентификатору фиксации.
[jerry@CentOS project]$ git log -2
Приведенная выше команда даст следующий результат.
commit 577647211ed44fe2ae479427a0668a4f12ed71a1 Author: Tom Cat <[email protected]> Date: Wed Sep 11 10:21:20 2013 +0530 Removed executable binary commit 29af9d45947dc044e33d69b9141d8d2dad37cc62 Author: Jerry Mouse <[email protected]> Date: Wed Sep 11 10:16:25 2013 +0530 Added compiled binary
Давайте сбросим указатель HEAD.
[jerry@CentOS project]$ git reset --soft HEAD~
Теперь мы просто сбрасываем указатель HEAD обратно на одну позицию. Давайте проверим содержимое файла .git / refs /head / master .
[jerry@CentOS project]$ cat .git/refs/heads/master 29af9d45947dc044e33d69b9141d8d2dad37cc62
Идентификатор коммита из файла изменен, теперь проверьте его, просмотрев сообщения коммита.
jerry@CentOS project]$ git log -2
Приведенная выше команда даст следующий результат.
commit 29af9d45947dc044e33d69b9141d8d2dad37cc62 Author: Jerry Mouse <[email protected]> Date: Wed Sep 11 10:16:25 2013 +0530 Added compiled binary commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a Author: Jerry Mouse <[email protected]> Date: Wed Sep 11 10:08:01 2013 +0530 Added Makefile and renamed strings.c to string_operations.c
смешанный
Git reset с опцией —mixed возвращает те изменения из области подготовки, которые еще не были зафиксированы. Он отменяет изменения только из области подготовки. Фактические изменения, внесенные в рабочую копию файла, не затрагиваются. Сброс Git по умолчанию эквивалентен сбросу Git — смешанный.
жесткий
Если вы используете опцию —hard с командой сброса Git, она очистит область подготовки; он сбросит указатель HEAD на последний коммит с определенным идентификатором коммита и также удалит изменения локального файла.
Давайте проверим идентификатор коммита.
[jerry@CentOS src]$ pwd /home/jerry/jerry_repo/project/src [jerry@CentOS src]$ git log -1
Приведенная выше команда даст следующий результат.
commit 577647211ed44fe2ae479427a0668a4f12ed71a1 Author: Tom Cat <[email protected]> Date: Wed Sep 11 10:21:20 2013 +0530 Removed executable binary
Джерри изменил файл, добавив однострочный комментарий в начале файла.
[jerry@CentOS src]$ head -2 string_operations.c /* This line be removed by git reset operation */ #include <stdio.h>
Он проверил это с помощью команды git status.
[jerry@CentOS src]$ git status -s M string_operations.c
Джерри добавляет измененный файл в область подготовки и проверяет его с помощью команды git status.
[jerry@CentOS src]$ git add string_operations.c [jerry@CentOS src]$ git status
Приведенная выше команда даст следующий результат.
# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: string_operations.c #
Состояние Git показывает, что файл присутствует в промежуточной области. Теперь сбросьте HEAD с помощью опции — hard.
[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1 HEAD is now at 5776472 Removed executable binary
Команда сброса Git выполнена успешно, что вернет файл из промежуточной области, а также удалит все локальные изменения, внесенные в файл.
[jerry@CentOS src]$ git status -s
Состояние Git показывает, что файл был возвращен из области подготовки.
[jerry@CentOS src]$ head -2 string_operations.c #include <stdio.h>
Команда head также показывает, что операция сброса также удалила локальные изменения.