Немного про Git. Чтобы не забыть и долго не искать. В виде маленькой лабораторной работы.
Git — это одна из систем контроля версий проекта. Она позволяет фиксировать все изменения файлов выбранной директории (проекта) и при желании откатить эти изменения до выбранной версии. Это не единственная система контроля версий, но одна из самых популярных.
Git используется разработчиками и дизайнерами. Я добавлю — и админами. Программисты управляют версиями своего программного проекта, им важно иметь возможность откатить код до стабильной версии в случае критичного бага. Дизайнеры могут запоминать состояния своего шедевра и, при необходимости, вернуть прежнюю версию. А системные администраторы хранят в гите конфигурационные файлы и восстанавливать их в случае проблем.
А ещё Git незаменимый инструмент при командной разработке. Git является распределённой системой контроля версий. Разные разработчики могут делать свои ветки проекта (бранчи) от основного (мастер) и после окончания разработки вливать (мердж) свой бранч в основную ветку.
Git стал ещё популярнее с появлением внешних репозиториев для хранения кода, таких как GitHub и GitLab. Кстати, вы можете столкнуться с тем, что вместо слова master некоторые репозитории, стыдящиеся своего рабовладельческого прошлого, используется main. Возможно, при создании этих репозиториев использовался труд IT-негров.
Установка Git
От слов к делу. Дистрибутивы Git есть для разных ОС.
Можно установить из командной строки. MacOS:
# Homebrew
brew install git
#Если нет Homebrew
git --version
#Предложит установить Command Line Tools (CLT)
Linux:
# Debian или Ubuntu
sudo apt install git
# CentOS
sudo yum install git
Новый проект
Я буду работать с Git в Linux. Точнее в Ubuntu. А ещё точнее в Ubuntu на WSL2 в Windows. Под рутом.
Начинаем новый проект. Создаём для него директорию, например, /opt/megacode/.
Для инициализации нового репозитория переходим в корень проекта и выполняем команду:
cd /opt/megacode/
git init
Создаётся новый пустой репозиторий.
Initialized empty Git repository in /opt/megacode/.git/
Первый коммит
Начинаем программировать. Создадим в проекте текстовый файл:
touch file1.txt
echo 'I know the kung fu' >> file1.txt
cat file1.txt
Первый файл проекта создан, посмотрим что нам скажет Git. Просмотр текущего состояния файлов локального репозитория:
git status
Команда отображает текущий статус репозитория. Мы находимся в ветке master, Коммитов нет. В репозитории найден один неотслеживаемый файл file1.txt. Чтобы внести изменения в текущую ветку проекта нужно добавить новые файлы в трекинг или изменить уже добавленные ранее, затем выполнить коммит.
Добавить новый файл в трекинг:
git add <файл/папка>
Добавить все новый файлы в трекинг:
git add .
# или
git add --all
# или
gid add -A
Добавляю все файлы и смотрю состояние локального репозитория.
git add .
git status
Новый файл подготовлен к коммиту. Можно дальше изменять проект. В определённый момент наш код готов к внесению в основную ветку проекта, делаем коммит.
git commit -m "Мой первый коммит, добавил файл file1.txt"
Ошибочка. Нужно себя как-то обозвать. Ладно, дадим им почту какую-нибудь:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
Делаем коммит:
git commit -m "Мой первый коммит, добавил файл file1.txt"
Смотрю состояние локального репозитория.
git status
Мы находимся в ветке master. Отличий от текущей ветки нет, коммитить нечего.
Просмотреть список коммитов:
git log
В проекте один коммит, ему присвоен уникальный GUID. Видно кто коммитил, куда, когда и с каким комментарием. Вот зачем нужны были данные пользователя.
Файл конфигурации
По хорошему, настроить конфигурацию нужно было в самом начале, но хотелось сначала явно показать для чего.
Для изменения конфигурации:
git config --global --edit
Для начала достаточно отредактировать параметры:
- name
Настройки можно делать прямо в файле конфигурации .gitconfig в домашней директории пользователя. Или явно указывать значения в отдельной команде, как мы сделали ранее:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
Первый бранч
Хочется ещё попрограммировать. Боюсь случайно испортить то что сейчас есть, соответственно, нужно создать отдельную ветку проекта и работать уже в ней. А мы вообще в каком бранче находимся сейчас? Команда для отображения текущего бранча:
git branch
О, мы находимся в бранче master, т.е. в основной ветке проекта. Создадим новую ветку проекта с названием megafix1 из текущей ветки master:
git branch megafix1
git branch
О, круто. Теперь у нас два бранча, master и megafix1. Но мы сейчас находимся в master, как показывает звёздочка. Переключаемся на новую ветку:
git checkout megafix1
git branch
Мы сейчас находимся в megafix1, как показывает звёздочка. Одновременно создать бранч и переключиться на него можно было командой:
git checkout -b megafix1
Создадим в проекте второй текстовый файл:
touch file2.txt
echo 'There is no spoon.' >> file2.txt
cat file2.txt
ll
Просмотр текущего состояния файлов локального репозитория:
git status
В репозитории найден один неотслеживаемый файл file2.txt. Добавим его в коммит, да и закоммитим сразу:
git add .
git commit -m "Мой второй коммит, добавил файл file2.txt в бранч megafix1"
git status
ll
Отличий от текущей ветки нет, коммитить нечего. В ветке два файла.
git log
В проекте два коммита, каждому присвоен уникальный GUID. Видно кто коммитил, в какую ветку, когда и с каким комментарием. HEAD — последний коммит.
Если нужно откатить последние коммиты:
# без удаления файлов
get reset HEAD~1
# с удалением файлов
get reset HEAD~1 --hard
# здесь 1 — сколько коммитов откатить
Мне откатывать ничего не нужно, я программирую без ошибок же, всегда.
Слияние веток
А что там в предыдущей ветке, в master, ничего не сломалось? Переключимся на ветку master:
git checkout master
git branch
Теперь мы в ветке master. Смотрим сколько у нас файлов:
ll
У нас в проекта только один файл file1.txt. Правильно, второй файл в master никто не добавлял, он в ветке megafix1. Мы находимся в master, "вольём" в неё ветку megafix1. Это слияние или merge:
git merge megafix1
ll
И файлов в ветке master теперь два, все изменения из ветки megafix1 были применены к master. Ветка megafix1 никуда не делась, в ней и дальше можно продолжать разработку.
Просмотр изменений
Добавим немного текста в первый файл. Пока не коммитим. Задача — посмотреть чем отличается содержимое текущей директории от рабочего бранча.
git diff
Видим, что в file1.txt есть незакоммиченные изменения, а именно добавлена строка "I ♥ internet-lab.ru". Можно в аргументе передавать директорию или файл, где нужно отобразить отличия от ветки.
git diff file1.txt
Отобразятся только отличия первого файла.
Удалённые репозитории
Если нужно склонировать репозиторий с сервера git, используем команду:
git clone http://gitlab.local/repo_name
При этом адрес репозитория запоминается под именем origin.
Запушить локальные коммиты на origin сервер git:
git push
Заключение
Мы выполнили небольшую лабораторную работу, дающую первоначальные представления о работе с Git. Мы рассмотрели не все команды, полная документация доступна по ссылкам: