Git (произносится «гит») — распределённая система управления версиями.
Git позволяет хранить несколько версий одного и того же проекта, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.
Репозиторий Git — это все файлы, находящиеся под контролем версий, вместе с историей их изменения и другой служебной информацией.
По сути это просто папка с файлами.
Коммит в Git — это команда, которая фиксирует изменения в репозитории.
Когда пользователь использует её, создаётся «снимок» текущего состояния проекта, включая все внесённые изменения.
Git не входит в стандартный набор программ Windows и macOS.
Чтобы проверить его наличие, введите в «Терминале» команду:
git --version
Если Git установлен, вы увидете номер доступной версии. В противном случае вы увидете сообщение "Unsupported command: git".
Скачайте установщик с git-scm.com
Во время установки оставляйте настройки по умолчанию. Убедитесь, что у вас отмечены следующие пункты:
Перейдите на git-scm.com и скопируйте в «Терминал» команду для менеджера пакетов вашего Linux-дистрибутива. Вот некоторые варианты:
# Для Debian/Ubuntu
apt-get install git
# Для Fedora
yum install git
# Для OpenSUSE
zypper install git
Если у вас Linux, то после установки Git запустите «Терминал».
Если Windows — Git Bash.
Каждое ваше изменение в репозитории будет подписано введённым ником и email-адресом.
Ник нужно писать латиницей, через пробел, в кавычках:
git config --global user.name "Name Surname"
Почту записываем в кавычках:
git config --global user.email "your@email"
Опционально можно настроить автоматическую поддержку цветов. Эта опция сделает так, чтобы разные типы файлов различались цветами в репозитории:
git config --global color.ui auto
Осталось убедиться, что данные добавлены и корректно отображаются:
git config --list
В ответ на запрос командная строка выведет настройки вашего профиля.
Переместитесь в папку с проектом и подключите Git:
cd /папка/с/проектом/
git init
С этого момента Git будет отслеживать файлы проекта и записывать изменения в скрытую папку .git, расположенную в папке проекта.
На одном компьютере может быть одновременно неограниченное количество репозиториев.
Если создать в проекте файл, то Git его посчитает неотслеживаемым (untracked).
Такие файлы нельзя перенести в репозиторий без предварительного добавления в индекс.
Индекс - это промежуточная зона перед репозиторием.
После попадания в индекс файлы становятся подготовленными к коммиту (staged).
# Добавляем в индекс один файл
git add имя_файла
# Добавляем в индекс несколько файлов
git add имя_файла_1 имя_файла_2 имя_файла_3
# Добавляем в индекс все изменённые файлы
git add .
# Добавляем в индекс все изменённые файлы с расширением .js
git add *.js
Чтобы получить подробную документацию о какой-либо команде — вызывайте справку:
git help имя_команды
git status
Эта команда показывает текущее состояние репозитория:
# Запрашиваем текущее состояние репозитория
git status
# Видим файлы, которые находятся в индексе и подготовлены для коммита
Changes to be committed:
(use "git restore --staged file..." to unstage)
modified: index.html
modified: styles.css
# Видим неотслеживаемые файлы, которые только попали в проект
Untracked files:
(use "git add file..." to include in what will be committed)
script.js # Файл script.js не отслеживается Git
# Видим изменённые файлы репозитория, которые ещё не добавлены в индекс
Changes not staged for commit:
(use "git add file..." to update what will be committed)
(use "git restore file..." to discard changes in working directory)
README.md # Файл README.md был изменён, но не добавлен в индекс
Когда все файлы подготовлены к сохранению, их можно перенести из индекса в репозиторий.
git commit -m "Сообщение"
Сообщения обязательны — по ним разработчики ориентируются в проекте.
Из сообщения коммита должно было понятно, какие изменения произошли.
Плохие примеры: "Добавил свой первый коммит.", "Работал над файлом index.html"
Хорошие примеры: "Исправил баг №ХХХХХ", "Сверстал header для главной страницы"
Если вы закоммитили файл и затем снова его изменяете, можно делать новый коммит, минуя индекс. Для этого необходима опция -a:
git commit -am "Сообщение"
Если вы ошиблись в сообщении коммит перезаписать сообщение последнего коммита:
git commit --amend -m "Новое_сообщение"
Команда git log показывает историю коммитов в обратном хронологическом порядке. Вы можете посмотреть хеш, сообщение, дату и ник автора коммита.
git log # Запрос на просмотр журнала коммитов
git log
# Информация о третьем сделанном коммите
commit 3f6f9e1f58e30e0d3a0d0ab764c0b30a5b621d4a # Хеш первого коммита
Author: John Doe johndoe@example.com # Автор первого коммита
Date: Thu Apr 21 10:26:52 2024 +0300 # Дата первого коммита
Update README.md # Сообщение первого коммита
# Информация о втором сделанном коммите
commit acd1e81729dc2ee2dc107ba345fa1ab7e6cfbff9
Author: Jane Smith janesmith@example.com
Date: Wed Apr 20 16:45:39 2024 +0300
Add new feature
# Информация о первом сделанном коммите
commit 7df1e8c33b0a617b3a72c785a67e45d0d932a180
Author: John Doe johndoe@example.com
Date: Mon Apr 18 09:12:21 2024 +0300
Initial commit
Информацию о каждом коммите можно отобразить сокращённо, в одну строку:
git log --oneline # Запрос на вывод истории коммитов в одну строку
3f6f9e1 Update README.md
acd1e81 Add new feature
7df1e8c Initial commit
git show abc12345 # Запрос на просмотр коммита с хешем abc12345
# Метаданные
commit abc12345 # Хеш коммита
Author: John Doe johndoe@example.com # Автор коммита
Date: Thu Apr 21 10:26:52 2024 +0300 # Дата и время коммита
Update README.md # Сообщение коммита
# Список изменений в файле README.md
diff --git a/README.md b/README.md
index abcdef1..1234567 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
-# My Project # Старое содержимое строки
+# My Awesome Project # Новое содержимое строки
Если ввести git show без хеша, то выведется содержимое последнего коммита.
Команда git diff показывает разницу между последним коммитом и текущим состоянием репозитория:
# Смотрим разницу между последним коммитом и текущим состоянием репозитория
git diff
# Разница между последним коммитом и текущим состоянием файла
git diff file_name
# Разница между последним коммитом и коммитом с указанным хешем
git diff commit_hash
# Разница между последним коммитом и отслеживаемым состоянием репозитория
git diff --staged