Skip to content

Latest commit

 

History

History
301 lines (215 loc) · 15.9 KB

commits-second-part.md

File metadata and controls

301 lines (215 loc) · 15.9 KB

Коммиты, продолжение

А теперь разберем, из чего состоит коммит.

commit 087b541c6ce7d06b7af70f831dcc434e06c8743b (HEAD -> master)
Author: Muhammad Imangazaliev <imangazaliev.md@gmail.com>
Date:   Mon Apr 11 23:07:58 2022 +0300

    Первый коммит
  • 087b541c6ce7d06b7af70f831dcc434e06c8743b - это т. н. хеш коммита. Хеш коммита - это строка, которая является уникальным идентификатором коммита. Хеш коммита используется для указания на него при выполнении различных операция.
  • Muhammad Imangazaliev - имя автора коммита
  • imangazaliev.md@gmail.com - Email автора
  • Mon Apr 11 23:07:58 2022 +0300 - дата создания коммита (с указанием часового пояса)
  • Первый коммит - сообщение к коммиту. Обычно в нем описывается, какие изменения были сделаны в этом коммите.

Просмотр изменений, сделанных в коммите

Мы можем посмотреть, какие изменения мы сделали в коммите с помощью команды git show:

commit 087b541c6ce7d06b7af70f831dcc434e06c8743b (HEAD -> master)
Author: Muhammad Imangazaliev <imangazaliev.md@gmail.com>
Date:   Mon Apr 11 23:07:58 2022 +0300

    Первый коммит

diff --git a/index.html b/index.html
new file mode 100644
index 0000000..3318f19
--- /dev/null
+++ b/index.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+ <html>
+ <head>
+     <title>Список дел</title>
...

Данная команда показывает, какие файлы были добавлены, изменены, удалены и т. д. Для текстовых файлов будет показано, что именно было изменено, для бинарных файлов - только их названия. Под текстовыми файлами имеются в виду файл, содержащий текст, независимо от расширения, будь то .txt, .html, .php и т. д., либо вообще без расширения. Более подробно вывод это команды мы разберем в одной из следующих глав.

Для навигации вверх и вниз используйте стрелки, для выхода нажмите кнопку q (quit). Можно также использовать кнопки Page Up, Page Down, Home и End, как в текстовых редакторах.

Добавляем новые коммиты

Давайте внесем несколько изменений в наши файлы: изменим заголовок страницы в файле index.html, основной цвет в файле styles.css, после чего посмотрим состояние репозитория:

На ветке master
Изменения, которые не в индексе для коммита:
  (используйте «git add <файл>…», чтобы добавить файл в индекс)
  (используйте «git restore <файл>…», чтобы отменить изменения в рабочем каталоге)
        изменено:      index.html
        изменено:      styles.css

нет изменений добавленных для коммита
(используйте «git add» и/или «git commit -a»)

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

Git говорит нам, что мы изменили два файла. Как теперь посмотреть, что именно было изменено? Для этого есть команда git diff (difference - различие):

diff --git a/index.html b/index.html
index 3318f19..31396d8 100644
--- a/index.html
+++ b/index.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
  <html>
  <head>
-     <title>Список дел</title>
+     <title>Список дел - ToDo List</title>
 
      <link rel="stylesheet" type="text/css" href="styles.css">
  </head>
diff --git a/styles.css b/styles.css
index 448e7cc..0924a49 100644
--- a/styles.css
+++ b/styles.css
@@ -11,7 +11,7 @@ body {
 }
 
 :root {
-    --primary: #db4c3f;
+    --primary: #2196f3;
 }
 
 [data-template] {

Данная комманда показывает разницу между текущим состоянием репозитория и последним коммитом (последним зафиксированным состоянием).

Эти изменения мы разобьем на два коммита, т. к. это независимые изменения. В первом коммите мы зафиксируем изменение заголовка, а во втором - изменение цвета.

# добавляем index.html в индекс
git add index.html
# создаем коммит, индекс очищается
git commit -m "Изменил заголовок страницы"
# добавляем index.css в индекс
git add styles.css
# создаем еще один коммит
git commit -m "Изменил основной цвет"

Сообщения к коммиту обычно пишут от первого лица в прошедшем времени, но ничто не мешает написать “Изменен заголовок страницы” или “Изменен основной цвет”. Если сообщение на английском, то его обычно пишут, либо в прошедшем времени (”Changed the page title”), либо в повелительном наклонении (”Change the page title”).

Смотрим статус:

На ветке master
нечего коммитить, нет изменений в рабочем каталоге

Теперь в репозитории три коммита. Смотрим историю изменений:

commit 4e7fc64cd4b9d10d140b2e2a1e7fb43aeb809457 (HEAD -> master)
Author: Muhammad Imangazaliev <imangazaliev.md@gmail.com>
Date:   Tue Apr 12 05:55:22 2022 +0300

    Изменил основной цвет

commit 751eaa603bee76e106019bf5454e88ab352011a6
Author: Muhammad Imangazaliev <imangazaliev.md@gmail.com>
Date:   Tue Apr 12 05:55:13 2022 +0300

    Изменил заголовок страницы

commit 087b541c6ce7d06b7af70f831dcc434e06c8743b
Author: Muhammad Imangazaliev <imangazaliev.md@gmail.com>
Date:   Mon Apr 11 23:07:58 2022 +0300

    Первый коммит

Коммиты идут снизу вверх, наверху находится самый последний коммит.

Краткий лог

У команды git log есть флаг --oneline, который позволяет вывести историю изменений в краткой форме: только хеш и сообщение к коммиту.

git log --oneline
4e7fc64 (HEAD -> master) Изменил основной цвет
751eaa6 Изменил заголовок страницы
087b541 Первый коммит

Краткий хеш можно использовать так же, как и полный, но работать с ним намного удобнее.

Просмотр изменений в определенном коммите

Чуть выше мы использовали команду git show, чтобы посмотреть изменения в первом сделанном нами коммите. На самом деле эта команда показывает изменения показывает изменения в последнем коммите, но т. к. он был у нас всего один, он и был показан. Но что, если мы хотим сейчас посмотреть изменения в первом, либо во втором коммитах? Для этого необходимо необходимо указать хеш коммита (полный или короткий):

git show 751eaa6
commit 751eaa603bee76e106019bf5454e88ab352011a6
Author: Muhammad Imangazaliev <imangazaliev.md@gmail.com>
Date:   Tue Apr 12 05:55:13 2022 +0300

    Изменил заголовок страницы

diff --git a/index.html b/index.html
index 3318f19..31396d8 100644
--- a/index.html
+++ b/index.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
  <html>
  <head>
-     <title>Список дел</title>
+     <title>Список дел - ToDo List</title>
 
      <link rel="stylesheet" type="text/css" href="styles.css">
  </head>

Изменение последнего коммита

Кроме создания нового коммита, команда git commit позволяет изменить последний коммит с помощью флага --amend. Это может быть полезно, если вы ошиблись при написании сообщении к коммиту, либо хотите дополнить изменения в файлах.

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

Вариант 1

Просто изменяем сообщение к коммиту:

git commit --amend -m "Новое сообщение"

Вариант 2

Добавляем текущие изменения в последний коммит вместо создания нового и изменяем сообщения:

git add -A
git commit --amend -m "Новое сообщение"

Вариант 3

Добавляем текущие изменения в последний коммит без изменения сообщения:

git commit --amend --no-edit

Флаг --no-edit указывает, что не нужно изменять сообщение последнего коммита, нужно просто добавить в него изменения в файлах.

После выполнения команды проверьте историю изменений с помощью команды git log и содержимое самого коммита с помощью команды git show. Обратите внимание, что хеш коммита изменился. Почему так произошло, можно понять, прочитав в конце урока о том, как этот хеш формируется.

Отмена добавления в индекс

Что, если мы по ошибке добавили какой-либо файл в индекс? Убрать файл их индекса (т. е. отменить действие команды git add) можно с помощью команды git reset:

git add index.html
git add styles.css
git add script.js
# отменяем добавление
git reset index.html
# можно укзаать несколько файлов
git reset index.html script.js

В данном примере в индексе останется только файл styles.css.

Можно вообще очистить индекс целиком, если вызвать git reset без параметров:

# убираем все файлы из индекса
git reset

Отмена коммита

Чтобы отменить создание коммита, можно воспользоваться командой git reset с параметром HEAD~:

git reset HEAD~

При этом изменения, которые были сделаны в коммите, не пропадут, просто исчезнет сам коммит (фиксация изменения). Можно, к примеру, создать новый коммит с этими изменениями. Что означает HEAD~ мы разберем в дальнейшем.

Как работает git diff

Разберем на примере.

  1. Измените один или несколько файлов в репозитории.
  2. Проверьте изменения (git diff).
  3. Добавьте изменения в индекс (git add .).
  4. Снова проверьте изменения.

После добавления в индекс изменения не будут отображаться. Почему? Потому что команда git diff сравнивает текущее состояние (структуру и содержимое файлов) сначала с индексом, а если там ничего нет, то с последним коммитом.

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

При это есть возможность разницу между индексом и последним коммитом с помощью флага --staged:

git diff --staged

Попробуйте выполнить ее и вы увидите то же самое, что видели при выполнении git diff до добавления файлов в индекс. Напомню, что индекс по-английски называется staging area, отсюда, собственно и название флага.

Что еще можно делать с коммитами?

  • Изменить сообщение к произвольному коммиту
  • Изменить порядок коммитов
  • Объединить несколько коммитов в один
  • Удалить коммит
  • И много другое, что мы разберем в следующих главах.

Дополнительная информация

Хеш коммита генерируеся на основе следующих параметров:

  • Сообщения к коммиту
  • Имя и Email автора коммита
  • Имя и Email создателя коммита. Обычно они совпадают с именем и Email автора, можно пока не обращать внимания, но упомянуть это необходимо.
  • Изменения в файлах
  • Времея коммита
  • Структура файлов в репозитории
  • Хеш предыдущего коммита

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

Практическое задание

  1. Создайте несколько коммитов в вашем репозитории.
  2. Попробуйте использовать все три варианта изменения коммита.
  3. Отмените последний коммит.

← Фиксация изменений. Первый коммит | Отслеживаемые и неотслеживаемые файлы →