
Привет, Хабр! Меня зовут Николай Пискунов, я руководитель направления Big Data, и в блоге beeline cloud я делюсь практическими советами по программированию. В этой статье погрузимся в увлекательный мир Git и узнаем, как он поможет эффективно управлять версиями наших проектов.
Немного теории для понимания
Git — это распределенная система управления версиями, которая состоит из множества команд, позволяющих эффективно работать с историей изменений в проекте. Однако, помимо прочего, Git помогает отслеживать историю создания файлов и директорий, что делает процесс разработки более прозрачным и удобным.
История создания Git началась в 2005 году, когда разработчик Линус Торвальдс столкнулся с проблемами при использовании других систем контроля версий для управления исходным кодом ядра Linux. Он решил создать свою собственную систему, которая была бы быстрой, простой в использовании и способной эффективно обрабатывать очень большие проекты.
Таким образом, в 2005 году был выпущен Git, который стал широко используемой системой контроля версий, позволяющей разработчикам эффективно работать над проектами любого размера. С течением времени Git стал стандартным инструментом для управления исходным кодом во многих проектах и компаниях по всему миру.
Несколько преимуществ использования Git
- Управление изменениями: Git позволяет создавать историю изменений, которая помогает отслеживать изменения в коде. 
- Распределенная система: Git может быть использован на нескольких серверах, что обеспечивает высокую доступность и безопасность. 
- Многопользовательский доступ: Git позволяет нескольким пользователям работать над одним проектом одновременно. 
Но поговорить сегодня я хочу не столько о самом Git, сколько об одном его стандарте — Gitflow.
И если Git — это система контроля версий, которая позволяет отслеживать изменения в коде, создавать ветки для разработки и объединять их, то Gitflow — это модель ветвления, основанная на Git, которая определяет лучшие практики для работы с ветками. Она предлагает использовать основные ветки master и develop, а также создавать отдельные ветки для разработки новых функций, исправления ошибок и выпуска версий.
Небольшое саммари, чтобы двигаться дальше
Итак, мы с вами поняли, что:
- Git — это инструмент для контроля версий. 
- Gitflow — это модель ветвления, которая помогает организовать процесс разработки и управления версиями в проекте. 
- Git — это технология. 
- Gitflow — это методология или, если хотите, правила использования этой технологии. 
Gitflow очень помогает в командной разработке, когда над проектом трудится несколько человек. Коллеги могут пилить одновременно несколько фич, при этом не мешая друг другу. Этому очень помогает структура ветвления по Gitflow.
.gitignore без игнора: создаем проект и погружаемся в детали
Для упрощения понимания давайте создадим проект, например на Spring Boot, а для хранения кода и командной работы будем использовать Git-репозиторий на gitverse.ru.Также можно использовать bitbucket.org, github.com и пр., различия в работе минимальны.
Итак, допустим, у нас есть какой-либо пустой гипотетический проект, который мы планируем разрабатывать командно. Для этого его надо разместить в общем репозитории в одном из представленных выше Git-сервисов.
Для этого обязательно создайте в одном из представленных сервисов выше проект и добавьте в него своих коллег.
Для начала внутри проекта предлагаю создать и настроить файл .gitignore.
.gitignore — это файл, который указывает Git, какие файлы или директории игнорировать при добавлении изменений в репозиторий.
Файл .gitignore содержит список паттернов (шаблонов) файлов и директорий, которые не должны быть включены в репозиторий. Это позволяет вам отслеживать только изменения в файлах, которые действительно важны для вашего проекта.
Пример .gitignore-файла:
 # игнорировать все файлы с расширением .log
*.log
# игнорировать директорию node_modules
node_modules/
# игнорировать файл config.json
config.json
# игнорировать все файлы в директории tmp
tmp/В этом примере Git будет игнорировать все файлы с расширением .log, директорию node_modules, файл config.json и все файлы в директории tmp.
Вы можете добавлять паттерны в файл .gitignore для каждого репозитория, чтобы указать, какие файлы или директории не должны быть включены в репозиторий.
Пример .gitignore-файла, который используется в проекте:
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
 
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
 
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
 
### VS Code ###
.vscode/Теперь надо проинициализировать проект. Это можно сделать командой git init. Эта команда — одна из основных команд Git, которая создает новый репозиторий Git.
Когда вы запускаете команду git init, Git создает новую папку .git в текущей директории, которая содержит информацию о репозитории. В ней хранится история изменений, информация о ветках и других данных, необходимых для управления репозиторием.
Команда git init также создает несколько дополнительных файлов и директорий:
.gitignore — файл, который мы создали выше. Он содержит список паттернов файлов и директорий, которые не должны быть включены в репозиторий.
- .git/objects — директория, которая хранит объекты Git, такие как коммиты, деревья и другие данные. 
- .git/ref — директория, которая хранит ссылки на коммиты и ветки. 
Когда вы запускаете команду git init, Git создает новый репозиторий в текущей директории. Это означает, что все файлы и изменения в этой директории будут отслеживаться Git.
Итак, мы с вами создали новый репозиторий в этой директории.
Фиксируем изменения
Для этого нам требуется выполнить команды git add и git commit.
Команда git add используется для добавления изменений в индекс (или staging area) перед тем, как они будут зафиксированы с помощью команды git commit, которую рассмотрим ниже. Это позволяет выбирать конкретные изменения, которые вы хотите включить в следующий коммит, а также предварительно просматривать свои изменения перед фиксацией. Это помогает подготовить ваш коммит более тщательно и избежать включения ненужных изменений.
Выполним команду bash
$ git add 
С помощью этой команды мs добавили в staging area все изменения, которые находились у нас в папке. Символ «.» дает понять Git, что требуется добавить все изменения. Того же эффекта можно добиться с помощью команды git add -A.
Если требуется добавить некоторые конкретные файлы, то этого можно добиться, добавив вместо точки название файла или путь до файла. Например:
$ git add FileName.class
$ git add /service/ServiceName.classКоманда git commit используется для фиксации изменений в репозитории Git. После того как вы внесли изменения в ваш рабочий каталог и добавили их в индекс с помощью команды git add, вы можете использовать команду git commit, чтобы сохранить эти изменения в локальном репозитории.
Чтобы выполнить команду git commit, вы должны указать сообщение коммита, которое обязательно должно быть детальным и описывать суть произведенных изменений. Давайте наш первый коммит так и назовем — first commit. Для этого выполним команду:
git commit -m "first commit"
После выполнения команды git commit ваши изменения будут сохранены в локальном репозитории и получат уникальный идентификатор коммита. Важно помнить, что коммиты в Git являются неизменяемыми, поэтому важно сделать все необходимые изменения перед фиксацией коммита.
Теперь, чтобы наш код стал доступен всей команде, требуется залить его в удаленный Git-репозиторий. Для этого достаточно выполнить следующие команды:
$ git remote add origin [НАЗВАНИЕ РЕПОЗИТОРИЯ, например ssh://git@gitverse.ru:2222/[NAMESPACE]/[PROJECT_NAME].git]
$ git branch -M master
$ git push -u origin masterЭти команды описаны во всех представленных выше сервисах при создании в них нового проекта.
Как видите, основная ветка называется master, но ей можно дать любое другое название.
Ветка master: что это и зачем
Ветка master — это основная ветка в Git, которая содержит последнюю стабильную версию проекта. Она является начальной точкой для большинства разработчиков и обычно содержит код, который готов к выпуску.
Ветка master играет важную роль в Gitflow, потому что она обеспечивает стабильность и надежность проекта. Она не должна содержать изменения, которые могут повлиять на функциональность и безопасность проекта.
Для каких целей использовать ветку master
- Хранение последней стабильной версии проекта. 
- Ветка для выпуска готовой продукции. 
- Начальная точка для большинства разработчиков. 
Ветка master также может быть использована для хранения исторических версий проекта, которые больше не поддерживаются. Это позволяет обеспечить доступ к старым версиям кода и помогает отслеживать изменения, сделанные в проекте с течением времени.
Залив код в репозиторий, мы получим следующую картинку в IDE IDEA:

А так это выглядит в веб-браузере при использовании одного из репозиториев, представленных выше (на скрине представлен gitverse.ru):

Таким образом, у нас имеется репозиторий и первая ветка master, в которую мы залили код. Обязательно добавьте коллег в один из выбранных вами сервисов, чтобы они также имели доступ к коду и возможности вносить изменения в него. В итоге у нас имеется удаленный репозиторий и возможность вносить в него изменения не только самостоятельно, но и всей вашей командой.
В следующей статье мы рассмотрим модель ветвления и поймем, как можно работать над одним общим кодом, при этом не мешая друг другу.
beeline cloud — secure cloud provider. Разрабатываем облачные решения, чтобы вы предоставляли клиентам лучшие сервисы.
Комментарии (7)
 - inkelyad16.07.2024 08:29- Ветка master — это основная ветка в Git, которая содержит последнюю стабильную версию проекта. Она является начальной точкой для большинства разработчиков и обычно содержит код, который готов к выпуску. - Нужно помнить, что gitflow с такими определениями - система, более заточенная (более удобная и создает меньше вопросов), когда используется несколько репозитариев. А не как сейчас почти повсеместно - один центральный на всех плюс локальные. - Чтобы master, который видят разработчики, который 'начальная точка' и 'готов к выпуску' - мог отличаться от того master, который видит система тестирования, когда приступает к проверке "а точно готов?". И только после тестирования - второй push-ается в первый. 
 - CPUBug16.07.2024 08:29+1- Я думаю в статье следовало упомянуть что уже довольно давно основная ветка в репозитории git называется не master а main.  - Lainhard16.07.2024 08:29+1- Думаете? Помнится недавно создавал пустой репозиторий через cli там была master (после создания первого коммита)  - CPUBug16.07.2024 08:29- Вы правы. Лучше сформулировать так: - Стоило упомянуть что основная ветка в репозитории git может иметь имя отличное от master и популярные хостинги кода уже довольно давно используют ветку main вместо master. - При создании репозитория через cli имя основной ветки можно изменить задав значение опции init.defaultBranch. 
 
 
 
           
 
kozlov_de
Это всё интегрировано в ide, в частности visual studio.
Командная строка git нужна очень редко
Ну разве что скриптов писать вроде поиска наиболее много менявшихся файлов
Absent
Работаю с git уже 10 лет, практически ежедневно. Визуальные инструменты (Fork) сильно помогают в простых операциях, но "непростые" все равно случаются довольно часто. Без командной строки пока никак не получается.
Serjio-IT
Может подскажете хорошие/удобные расширения для VS для работы с Git , которые реально используются для работы ?
Везде в обучалках/курсах используется командная строка .