Git - исправить ошибки
Человеку свойственно ошибаться. Таким образом, каждая VCS предоставляет возможность исправлять ошибки до определенного момента. Git предоставляет функцию, которую мы можем использовать для отмены изменений, внесенных в локальный репозиторий.
Предположим, пользователь случайно вносит некоторые изменения в свой локальный репозиторий, а затем хочет отменить эти изменения. В таких случаяхrevert операция играет важную роль.
Отменить незафиксированные изменения
Предположим, Джерри случайно изменяет файл из своего локального репозитория. Но он хочет отменить свою модификацию. Чтобы справиться с этой ситуацией, мы можем использовать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
Note - Мы можем выполнить все эти операции до коммита.
Удалить изменения из области подготовки
Мы видели, что когда мы выполняем операцию добавления, файлы перемещаются из локального репозитория в область констатации. Если пользователь случайно изменяет файл и добавляет его в промежуточную область, он может отменить свои изменения, используя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
Перемещение указателя HEAD с помощью Git Reset
Сделав несколько изменений, вы можете решить удалить эти изменения. Команда сброса Git используется для сброса или отмены изменений. Мы можем выполнить три различных типа операций сброса.
На диаграмме ниже показано графическое представление команды сброса Git.
Мягкий
Каждая ветка имеет указатель HEAD, указывающий на последнюю фиксацию. Если мы используем команду сброса Git с параметром --soft, за которым следует идентификатор фиксации, то он сбросит только указатель HEAD, ничего не разрушая.
.git/refs/heads/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/heads/master file.
[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 reset, она очистит промежуточную область; он сбросит указатель 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 также показывает, что операция сброса удалила и локальные изменения.