Перейти к основному содержанию

Введение в Git — основные команды

git

Немного про Git. Чтобы не забыть и долго не искать. В виде маленькой лабораторной работы.

Git — это одна из систем контроля версий проекта. Она позволяет фиксировать все изменения файлов выбранной директории (проекта) и при желании откатить эти изменения до выбранной версии. Это не единственная система контроля версий, но одна из самых популярных.

Git используется разработчиками и дизайнерами. Я добавлю — и админами. Программисты управляют версиями своего программного проекта, им важно иметь возможность откатить код до стабильной версии в случае критичного бага. Дизайнеры могут запоминать состояния своего шедевра и, при необходимости, вернуть прежнюю версию. А системные администраторы хранят в гите конфигурационные файлы и восстанавливать их в случае проблем.

А ещё Git незаменимый инструмент при командной разработке. Git является распределённой системой контроля версий. Разные разработчики могут делать свои ветки проекта (бранчи) от основного (мастер) и после окончания разработки вливать (мердж) свой бранч в основную ветку.

Git стал ещё популярнее с появлением внешних репозиториев для хранения кода, таких как GitHub и GitLab. Кстати, вы можете столкнуться с тем, что вместо слова master некоторые репозитории, стыдящиеся своего рабовладельческого прошлого, используется main. Возможно, при создании этих репозиториев использовался труд IT-негров.

Установка Git

От слов к делу. Дистрибутивы Git есть для разных ОС.

https://git-scm.com/downloads

Можно установить из командной строки. 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/.

git

Для инициализации нового репозитория переходим в корень проекта и выполняем команду:

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. Просмотр текущего состояния файлов локального репозитория:

git status

git

Команда отображает текущий статус репозитория. Мы находимся в ветке master, Коммитов нет. В репозитории найден один неотслеживаемый файл file1.txt. Чтобы внести изменения в текущую ветку проекта нужно добавить новые файлы в трекинг или изменить уже добавленные ранее, затем выполнить коммит.

Добавить новый файл в трекинг:

git add <файл/папка>

Добавить все новый файлы в трекинг:

git add .
# или
git add --all
# или
gid add -A

Добавляю все файлы и смотрю состояние локального репозитория.

git add .
git status

git

Новый файл подготовлен к коммиту. Можно дальше изменять проект. В определённый момент наш код готов к внесению в основную ветку проекта, делаем коммит.

git commit -m "Мой первый коммит, добавил файл file1.txt" 

git

Ошибочка. Нужно себя как-то обозвать. Ладно, дадим им почту какую-нибудь:

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

Делаем коммит:

git commit -m "Мой первый коммит, добавил файл file1.txt" 

git

Смотрю состояние локального репозитория.

git status

git

Мы находимся в ветке master. Отличий от текущей ветки нет, коммитить нечего.

Просмотреть список коммитов:

git log

git

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

Файл конфигурации

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

Для изменения конфигурации:

git config --global --edit

git

Для начала достаточно отредактировать параметры:

  • email
  • name

Настройки можно делать прямо в файле конфигурации .gitconfig в домашней директории пользователя. Или явно указывать значения в отдельной команде, как мы сделали ранее:

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

Первый бранч

Хочется ещё попрограммировать. Боюсь случайно испортить то что сейчас есть, соответственно, нужно создать отдельную ветку проекта и работать уже в ней. А мы вообще в каком бранче находимся сейчас? Команда для отображения текущего бранча:

git branch

git

О, мы находимся в бранче master, т.е. в основной ветке проекта. Создадим новую ветку проекта с названием megafix1 из текущей ветки master:

git branch megafix1
git branch

git

О, круто. Теперь у нас два бранча, master и megafix1. Но мы сейчас находимся в master, как показывает звёздочка. Переключаемся на новую ветку:

git checkout megafix1
git branch

git

Мы сейчас находимся в megafix1, как показывает звёздочка. Одновременно создать бранч и переключиться на него можно было командой:

git checkout -b megafix1

Создадим в проекте второй текстовый файл:

touch file2.txt
echo 'There is no spoon.' >> file2.txt
cat file2.txt
ll

git

Просмотр текущего состояния файлов локального репозитория:

git status

git

В репозитории найден один неотслеживаемый файл file2.txt. Добавим его в коммит, да и закоммитим сразу:

git add .
git commit -m "Мой второй коммит, добавил файл file2.txt в бранч megafix1" 
git status
ll

git

Отличий от текущей ветки нет, коммитить нечего. В ветке два файла.

git log

git

В проекте два коммита, каждому присвоен уникальный GUID. Видно кто коммитил, в какую ветку, когда и с каким комментарием. HEAD — последний коммит.

Если нужно откатить последние коммиты:

# без удаления файлов
get reset HEAD~1

# с удалением файлов
get reset HEAD~1 --hard

# здесь 1 — сколько коммитов откатить

Мне откатывать ничего не нужно, я программирую без ошибок же, всегда.

Слияние веток

А что там в предыдущей ветке, в master, ничего не сломалось? Переключимся на ветку master:

git checkout master
git branch

git

Теперь мы в ветке master. Смотрим сколько у нас файлов:

ll

git

У нас в проекта только один файл file1.txt. Правильно, второй файл в master никто не добавлял, он в ветке megafix1. Мы находимся в master, "вольём" в неё ветку megafix1. Это слияние или merge:

git merge megafix1

git

ll

git

И файлов в ветке master теперь два, все изменения из ветки megafix1 были применены к master. Ветка megafix1 никуда не делась, в ней и дальше можно продолжать разработку.

Просмотр изменений

Добавим немного текста в первый файл. Пока не коммитим. Задача — посмотреть чем отличается содержимое текущей директории от рабочего бранча.

git diff

git

Видим, что в file1.txt есть незакоммиченные изменения, а именно добавлена строка "I ♥ internet-lab.ru". Можно в аргументе передавать директорию или файл, где нужно отобразить отличия от ветки.

git diff file1.txt

Отобразятся только отличия первого файла.

Удалённые репозитории

Если нужно склонировать репозиторий с сервера git, используем команду:

git clone http://gitlab.local/repo_name

git

При этом адрес репозитория запоминается под именем origin.

Запушить локальные коммиты на origin сервер git:

git push

Заключение

Мы выполнили небольшую лабораторную работу, дающую первоначальные представления о работе с Git. Мы рассмотрели не все команды, полная документация доступна по ссылкам:

https://git-scm.com/book/ru/v2

Теги

 

Похожие материалы

Про Docker

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

Теги

Backup или Snapshot: что лучше?

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

Теги