Главная страница
Навигация по странице:

  • 2.16. Удаление файлов, команда git rm

  • 2.17. Восстановление файлов, команда git restore

  • Формат команды git restore

  • 2.18. Перемещение указателя HEAD, команда git checkout (продолжение)

  • 2.19. Удаление и объединение коммитов, команда git reset

  • Формат команды git reset

  • 2.19.1. Редактирование последнего коммита

  • 2.19.2. Удаление последних коммитов

  • 2.19.3. Объединение коммитов

  • Система управления версиями Git. Система управления версиями git и российский сервис хранения исходного кода gitflic


    Скачать 3.56 Mb.
    НазваниеСистема управления версиями git и российский сервис хранения исходного кода gitflic
    Дата03.05.2023
    Размер3.56 Mb.
    Формат файлаpdf
    Имя файлаСистема управления версиями Git.pdf
    ТипУчебное пособие
    #1107197
    страница6 из 12
    1   2   3   4   5   6   7   8   9   ...   12

    git diff HEAD:
    /c/Learn_git
    (Main_branch)
    $ git diff HEAD diff --git a/Learn_diff.txt b/Learn_diff.txt index 0f83f71..d687242 100644
    --- a/Learn_diff.txt
    +++ b/Learn_diff.txt
    @@ -1,3 +1,3 @@
    -Файл Изменения, добавленный в коммит.
    +Файл Изменения, не отслеживаемый.
    Неизменяемая строка.

    63
    -Изменяемая строка: коммит.
    \ No newline at end of file
    +Изменяемая строка: рабочая директория.
    \ No newline at end of file
    Проведя анализ результата сравнения, понимаем, что команда git diff
    HEAD сравнивает файлы, сохранённые в последнем коммите и в рабочей директории.
    Выполним команду
    git diff –stagged:
    /c/Learn_git
    (Main_branch)
    $ git diff --staged diff --git a/Learn_diff.txt b/Learn_diff.txt index 0f83f71..c0901fb 100644
    --- a/Learn_diff.txt
    +++ b/Learn_diff.txt
    @@ -1,3 +1,3 @@
    -Файл Изменения, добавленный в коммит.
    +Файл Изменения, добавленный в индекс.
    Неизменяемая строка.
    -Изменяемая строка: коммит.
    \ No newline at end of file
    +Изменяемая строка: индекс.
    \ No newline at end of file
    Анализ результатов сравнения показывает, что команда git diff –staged сравнивает файлы, хранящиеся в последнем коммите и в индексе.
    Приведённые три варианта команды git diff позволяют проводить сравнение файлов в пределах последнего коммита. Рассмотрим другие варианты:
    − git diff HEAD^ – cравнение файлов из предпоследнего коммита и из рабочей директории;
    − git diff <имя ветки1> <имя ветки 2> – сравнение файлов из коммитов, расположенных в головных коммитах указанных веток;
    − git diff <имя ветки> – сравнение файлов из головного коммита текущей ветки и головного коммита ветки, указанной в команде;
    − Git diff <хеш-значение 1> <хеш-значение 2> – сравнение файлов из коммитов, заданных их хеш-значениями.
    Указанные команды сравнивают ВСЕ файлы, расположенные в областях, указанных в команде git diff. Если необходимо сравнить только один файл, то его имя нужно добавить в конец соответствующей команды:
    − git diff <имя файла>
    − git diff HEAD < имя файла >
    − git diff –staged < имя файла >

    64
    − git diff HEAD^ < имя файла >
    − git diff < имя ветки1> < имя ветки 2> < имя файла >
    − git diff < имя ветки> < имя файла >
    − git diff < хеш-значение 1> < хеш-значение 2> < имя файла >
    Команда git show показывает содержимое указанного объекта.
    Формат команды git show:
    git show <объект>
    В зависимости от типа объекта будет показано:
    − для blob-объекта – текст сохранённого файла;
    − для дерева – список объектов, входящих в дерево;
    − для коммита – информация о коммите и различия между файлами из заданного в команде коммита и файлами из предшествующего коммита
    (для формирования списка различий используется команда git diff).
    Пример выполнения команды git show:
    /c/Learn_git
    (Main_branch)
    $ git show commit b5fd14da49b6c21759266118fd34ea78ff51d2d2 (
    HEAD ->
    Main_branch
    )
    Author: Git_Book
    Date: Mon Jul 25 21:55:20 2022 +0300
    Изучение клманды git diff diff --git a/Learn_diff.txt b/Learn_diff.txt new file mode 100644 index 0000000..0f83f71
    --- /dev/null
    +++ b/Learn_diff.txt
    @@ -0,0 +1,3 @@
    +Файл Изменения, добавленный в коммит.
    +Неизменяемая строка.
    +Изменяемая строка: коммит.
    \ No newline at end of file
    В приведённом примере в команде git show не указан объект. В этом слу- чае в качестве объекта используется коммит HEAD. Файлы, содержащиеся в головном коммите, будут сравниваться с файлами из предыдущего коммита.
    Поскольку в предыдущем коммите файла а не было (его хеш-значение равно
    0), в качестве разницы выведено содержимое файла b (нет удалённых и неизменных строк, есть только добавленные строки).

    65
    2.16. Удаление файлов, команда git rm
    Результат удаления файла из рабочей директории, с точки зрения Git, будет зависеть от того, в каком состоянии файл находился перед удалением.
    Рассмотрим варианты.
    1. Удаляемый файл находится в состоянии не отслеживаемый. Уда- ление такого файла никак не повлияет на состояние Git, поскольку Git ни- чего не «знает» об этом файле.
    2. Удаляемый файл находится в состоянии отслеживаемый, не изме- нённый. При выполнении ближайшего коммита файл будет исключён из де- рева рабочей директории, но его копия будет храниться в предыдущих ком- митах. Потери информации не произойдёт.
    3. Удаляемый файл находится в состоянии отслеживаемый, изменён- ный, не добавленный в индекс. Случай аналогичен рассмотренному в п. 2, за исключением того, что изменения, сделанные в файле, будут потеряны без возможности восстановления.
    4. Удаляемый файл находится в состоянии отслеживаемый, изменён- ный, добавленный в индекс. Копия удалённого файла хранится в индексе и будет добавлена в ближайший коммит. Удаление файла из рабочей дирек- тории не произойдёт.
    Удаление файла в ситуациях, описанных в первых трёх пунктах, не требует использования команд Git. Но необходимо быть внимательным, чтобы избежать возможных негативных последствий. Для удаления файла в четвёртой ситуации требуется специальная команда, которая позволит уда- лить файл из индекса и из рабочей директории. Последствия выполнения такой команды аналогичны последствиям действий, описанных в п. 3. Ко- манда, позволяющая удалить файл в ситуации п. 4, называется git rm.
    Формат команды git rm:
    git rm <ключ> <имя удаляемого файла>
    Возможные значения ключа:
    --forced – удаление с игнорированием всех предупреждений;
    --cached – удаление файла только из индекса. Файл становится не от- слеживаемым.

    66
    2.17. Восстановление файлов, команда git restore
    Git не оправдывал бы своё существование, если бы не позволял вос- станавливать случайно удалённые или некорректно изменённые файлы. Ра- зумеется, Git позволяет выполнять восстановление. Для этого предназна- чена команда git restore.
    Формат команды git restore:
    Git restore <ключ> <имя восстанавливаемого файла>
    Возможные значения ключа:
    --source=<коммит> – задаёт коммит, из которого будет взят восстанав- ливаемый файл;
    --worktree – записать восстановленную копию в рабочую директорию
    (действует как значение по умолчанию);
    --staged – записывает восстановленную копию в индекс и отменяет за- пись в рабочую директорию. Для записи в индекс и в рабочую директорию необходимо указать оба ключа: –worktree и –staged.
    Рассмотрим пример восстановления файла. В рабочей директории, в индексе и в последнем коммите хранится файл с именем File1.txt, содержа- щий текст «Example1_V1».
    В рабочей директории изменим текст в файле File1.txt на «Text for re- store» и выполним команду git add File1.txt. После этого удалим файл
    File1.txt из рабочей директории и восстановим его двумя способами.
    Первый способ: восстановление с помощью команды git restore
    File1.txt
    /c/Learn_git
    (Main_branch)
    $ dir
    Dir1 File1.txt File2.txt Learn_diff.txt
    /c/Learn_git
    (Main_branch)
    $ cat File1.txt
    Text for restore
    /c/Learn_git
    (Main_branch)
    $ rm File1.txt
    /c/Learn_git
    (Main_branch)
    $ dir
    Dir1 File2.txt Learn_diff.txt
    /c/Learn_git
    (Main_branch)
    $ git restore File1.txt
    /c/Learn_git
    (Main_branch)
    $ cat File1.txt
    Example1_for restore
    Файл File1.txt был восстановлен из индекса.

    67
    Второй способ: восстановление с помощью команды: git restore –
    source=HEAD File1.txt
    /c/Learn_git
    (Main_branch)
    $ dir
    Dir1 File1.txt File2.txt Learn_diff.txt
    /c/Learn_git
    (Main_branch)
    $ cat File1.txt
    Example1_for restore
    /c/Learn_git
    (Main_branch)
    $ rm File1.txt
    /c/Learn_git
    (Main_branch)
    $ dir
    Dir1 File2.txt Learn_diff.txt
    /c/Learn_git
    (Main_branch)
    $ git restore --source=HEAD File1.txt
    /c/Learn_git
    (Main_branch)
    $ dir
    Dir1 File1.txt File2.txt Learn_diff.txt
    /c/Learn_git
    (Main_branch)
    $ cat File1.txt
    Example1_V1
    Файл File1.txt был восстановлен из коммита.
    2.18. Перемещение указателя HEAD, команда git checkout
    (продолжение)
    Git даёт возможность не только восстанавливать файлы, но и возвра- щаться к прежним состояниям рабочей директории. Возврат может потре- боваться в следующих случаях:
    1. Необходимо просмотреть файлы проекта в том состоянии, в кото- ром проект был некоторое время назад.
    2. Необходимо вернуться к предыдущему состоянию проекта, со- здать ветку и проверить альтернативное решение.
    Для возврата к предыдущему коммиту необходимо изменить значе- ние, записанное в файл HEAD, так как этот файл ссылается на последний коммит. Изменение содержимого файла HEAD называют перемещением указателя. Файл HEAD может содержать или имя ветки или хеш-значение.
    В первом случае HEAD указывает на последний коммит в ветке, во втором случае HEAD указывает на любой коммит. На рисунке 2.11 показано состо- яние указателей при перемещении HEAD на произвольный коммит.

    68
    Рисунок 2.11 – Состояние “detached head”
    Файл с именем ветки в директории .git/refs/heads по-прежнему содер- жит хеш-значение последнего коммита в ветке (указывает на ветку). Файл
    HEAD содержит хеш-значение произвольного коммита. Такое состояние называется «Свободный указатель» (Detached head). В таком состоянии ко- манда git log выведет список не всех коммитов ветки, а только тех, которые расположены до коммита, на который указывает HEAD. Посмотреть все коммиты в ветке можно с помощью команды git log –all. Пример выполне- ния этой команды приведён ниже.
    /c/Learn_git
    ((b5fd14d...))
    $ git log --all --pretty=oneline
    6aa60021e322f099c14f8008d3ea8ce3f34dc5ef (
    Main_branch
    )
    Перемешение HEAD b5fd14da49b6c21759266118fd34ea78ff51d2d2 (
    HEAD
    )
    Изучение клманды git diff d240a8b99799c7921a99cb059b93be6c0c6d6917
    Изучение команды git diff d58ea9721672b176fdeda4a6550030a43f982d61
    Test commit 2 00edc80c522d4b79c517c7f377e99a3249e7b24b
    Try commit
    Из примера видно, что в ветке есть два указателя: Main_branch, указы- вающий на коммит 6aa600 и HEAD, указывающий на коммит b5fd1.
    Для того чтобы выйти из состояния «Свободный указатель», доста- точно выполнить команду git checkout ‘Main_branch’.
    /c/Learn_git
    ((b5fd14d...))
    $ git checkout 'Main_branch'
    Previous HEAD position was b5fd14d Изучение клманды git diff
    Switched to branch 'Main_branch'
    Andrey@DESKTOP-1RNVJK6
    MINGW64
    /c/Learn_git
    (Main_branch)
    $ git log --all --pretty=oneline
    6aa60021e322f099c14f8008d3ea8ce3f34dc5ef (
    HEAD ->
    Main_branch
    )
    Перемешение HEAD b5fd14da49b6c21759266118fd34ea78ff51d2d2
    Изучение клманды git diff d240a8b99799c7921a99cb059b93be6c0c6d6917
    Изучение команды git diff d58ea9721672b176fdeda4a6550030a43f982d61
    Test commit 2 00edc80c522d4b79c517c7f377e99a3249e7b24b
    Try commit
    Теперь HEAD указывает на файл с именем ветки, который содержит хеш-значение последнего коммита в ветке (всё, как мы привыкли видеть).
    Указатель HEAD можно перемещать в пределах одной ветки. Для его перемещения используется команда checkout, рассмотренная в разделе 2.12.
    Для создания состояния «Свободный указатель» в этой команде вместо

    69 имени ветки необходимо указать коммит. Сделать это можно либо с помо- щью прямой адресации, указав хеш-значение коммита, либо с помощью косвенной адресации, указав смещение относительно текущего значения
    HTAD:
    − HEAD^ – предыдущий коммит;
    − HEAD

    – смещение назад по ветке на n коммитов.
    − Рассмотрим пример выполнения команды git checkout HEAD^.
    /c/Learn_git
    (Main_branch)
    $ git checkout HEAD^
    Note: switching to 'HEAD^'.
    You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch.
    If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c
    Or undo this operation with: git switch -
    Turn off this advice by setting config variable advice.detachedHead to false
    HEAD is now at b5fd14d Изучение команды git diff
    В результате выполнения команды был не только перемещён указа- тель HEAD, но и получены подробные рекомендации по поводу возможных действий в состоянии ‘detached HEAD’. Рассмотрим эти рекомендации.
    1. Можно изучить состояние рабочей директории (look aroubd). Дело в том, что при изменении положения указателя HEAD рабочая директория восстанавливается из того коммита, на который в данный момент указывает
    HEAD.
    2. Можно поэкспериментировать (make experimental changes). Все изменения, внесённые в рабочую директорию, будут потеряны после вы- хода из состояния ‘detached hed’.
    3. Можно сохранить результаты экспериментов, создав новую ветку,
    «растущую» из коммита, на который указывает HEAD. Ветку можно создать как с помощью команды git switch –c ‘имя новой ветки’, так и с помощью команды git checkout –b ‘имя новой ветки’. Новую ветку можно создать как до начала серии коммитов, так и после окончания серии коммитов, перед выходом из состояния ‘detached head’.

    70
    2.19. Удаление и объединение коммитов, команда git reset
    Для того чтобы обозначить коммит, с которым в данный момент ра- ботает пользователь, в Git существуют два указателя: HEAD и файл с име- нем ветки. В предыдущем разделе была рассмотрена ситуация, когда изме- няется содержимое указателя HEAD. В настоящем разделе будет рассмот- рена ситуация, когда изменяется содержимое файла с именем ветки. Для та- кого изменения используется команда git reset.
    На рисунке 2.12 показано, как изменяется положение указателей по- сле применения команды git reset.
    Рисунок 2.12 – Положение указателей при выполнении команды git reset
    До выполнения команды git reset указатель HEAD ссылался на файл с именем ветки, а файл с именем ветки ссылался на хеш-значение последнего коммита в ветке. После выполнения команды git reset укзатель HEAD не из- менился, а файл с именем ветки стал указывать на хеш-значение коммита, который был указан в команде. Кроме того, появился ещё один указатель
    ORIG_HEAD, содержащий копию хеш-значения файла с именем ветки до его изменения. Команда git reset может выполняться в двух режимах:

    71
    − после перемещения указателя содержимое рабочей директории не изменяется;
    − после перемещения указателя рабочая директория восстанавлива- ется из коммита, на который указывает файл с именем ветки.
    От того, в каком режиме выполняется команда git reset, зависит алго- ритм её применения. Рассмотрим всё по порядку.
    Формат команды git reset:
    git reset <ключи> <адрес коммита>
    Возможные значения ключей:
    --soft – команда не изменяет ни рабочую директорию, ни индекс. Все файлы останутся неизменными, но указатель будет передвинут;
    --hard – будут удалены все файлы рабочей директории и индекса, по- сле чего состояние рабочей директории и индекса будет восстановлено из коммита, указанного в команде.
    Адрес коммита – абсолютный или относительный адрес коммита, на который необходимо передвинуть указатель.
    2.19.1. Редактирование последнего коммита
    Бывают ситуации, когда после выполнения коммита обнаруживается, что в него необходимо внести изменения. Это возможно сделать с исполь- зованием команды git reset. Команда git reset –soft HEAD^ переместит указа- тель на предпоследний коммит. Восстановления состояния рабочей дирек- тории из предпоследнего коммита не произойдёт. В результате состояние архива будет таким, каким оно было непосредственно перед выполнением последнего коммита. Можно внести исправления в подготавливаемый ком- мит (отредактировать файлы, добавить/удалить файлы в/из индекса, …).
    После того, как исправления будут завершены, необходимо выпол- нить команду:
    git commit –c ORIG_HEAD.
    Ключ –c говорит о том, что комментарий к коммиту должен быть вве- дён заново. Ключ –С позволит скопировать комментарий из исправляемого коммита.
    Возникающая в результате описанных действий ситуация показана на рисунке 2.13.

    72
    Рисунок 2.13 – Редактирование последнего коммита
    Коммит, который был исправлен, остался в архиве, на него возможно переключиться по указателю ORIG_HEAD до тех пор, пока ORIG_HEAD не поменяет своё значение после выполнения новой команды git reset. Но даже после этого к исправленному коммиту можно обратиться, если знать его хеш-значение.
    Существует другой путь внесения изменений в последний коммит.
    Вносятся необходимые изменения в рабочую директорию и индекс, после чего выполняется команда:
    git commit –amend.
    Эта команда эквивалентна последовательности команд:
    git reset –soft HEAD^
    git commit -C ORIG_HEAD
    Если необходимо ввести новый комментарий для исправленного ком- мита, то команда будет выглядеть так:
    git commit –amend –m <новый комментарий>
    2.19.2. Удаление последних коммитов
    Для удаления последнего коммита и возврата к предпоследнему ис- пользуется команда:
    git reset –hard HEAD^

    73
    Произойдёт восстановление рабочей директории и индекса из предпо- следнего коммита. После внесения изменений и очередного коммита ситуа- ция будет аналогичной, изображённой на рисунке 2.13. «Удалённый» ком- мит по-прежнему доступен по ссылке ORIG_HEAD.
    Для удаления нескольких коммитов используется команда:
    git reset –hard HEADn
    Здесь n – количество коммитов, которые необходимо удалить. Обра- титься к цепочке «удалённых» коммитов возможно по указателю
    ORIG_HEAD (до тех пор, пока он не изменится).
    2.19.3. Объединение коммитов
    Для объединения нескольких коммитов используется команда:
    git reset –soft HEADn
    Здесь n – количество коммитов, которые необходимо изменить.
    После выполнения команды произойдёт перемещение указателя на n коммитов назад. Состояние рабочей директории и индекса изменено не бу- дет. И рабочая директория, и индекс будут включать все изменения, кото- рые были зафиксированы в последних n коммитах, выполненных после того, на который произошло переключение.
    Команда git commit –c ORIG_HEAD зафиксирует все изменения, как бы собрав последние коммиты вместе. Ключ –С обычно не применяется, так как для объединённого коммита нужен новый комментарий.
    На цепочку объединённых коммитов можно переключиться с исполь- зованием указателя ORG_HEAD.
    1   2   3   4   5   6   7   8   9   ...   12


    написать администратору сайта