Git. Часть 1. Что такое Git? Пошаговая инструкция
![git-part-1](https://ykul.ru/storage/blog/posts/git-part-1/git1.png)
Знания Git ультимативно. Разработчик на любом языке и направлении обязан уметь им пользоваться, так как современная разработка требует такого навыка.
Что такое Git?
Git – это система контроля версий с распределенной архитектурой.
Разберем каждый пункт по отдельности:
- Система контроля версий;
Когда вы пишите приложение, в какой-то момент можете что-то сломать и захотите вернуться к предыдущему варианту. Придется потратить много времени и сил на восстановление предыдущей версии кода по памяти. А человеческая память ненадежна, да и не очень бы хотелось делать то же самое второй раз.
Git решает эту проблему. С ним у вас есть возможность сохранить прогресс и вернуться к предыдущей версии. - Распределенная архитектура.
Если вы это читаете, то скорее всего не знакомы с системой контроля версий. Вероятно, вы храните свой код прямо на локальном компьютере, а возможно скидываете его на внешний жесткий диск. Но что, если у вас сломается ПК и внешний жесткий диск? Конечно, шанс на это небольшой, но даже такой шанс очень рискован. Можно использовать облако, тогда исключим вариант с потерей приложения. Но при работе в команде, разработка превратится в сущий ад. Представьте, что придется каждый раз скачивать актуальную версию приложения, вносить в нее изменения, и загружать обратно.
Для того, чтобы облегчить жизнь придумали Git. В нем, у каждого члена команды будет репозиторий (хранилище с приложением) со всеми версиями и изменениями от всех участников. А распределенной ее называют потому, что у нее нет единого хранилища. Каждый член команды, у кого есть репозиторий, по сути является хранилищем, что позволяет восстановить все утраченные данные, если хотя бы у одного будет репозиторий.
Как работать с Git?
Не смотря на всю мощь инструмента, работать с ним очень легко. Разберем все по порядку.
Первым делом необходимо скачать Git с официального сайта.
Далее необходимо открыть скачанный Git Bash и в нем перейти в папку с проектом (его заранее необходимо создать), в моем случае это будет проект на Java, но сути это не меняет. Можно это сделать, используя команду
cd <путь_до_папки>
либо в проводнике windows, находясь в нужном пути, кликнуть правой кнопкой и выбрать «Git Bash Here». Так же выполним первоначальную настройку, укажем пользователя
git config –global user.name «Your Name»
и почту
git config –global user.email «Your email»
в кавычках укажите свои данные. Все настройки вы можете увидеть с помощью команды
git config –list
![image1.png](/storage/blog/posts/git-part-1/image1.png)
Теперь необходимо воспользоваться командой
git init
которая инициализирует репозиторий, иными словами, его создает. В результате, появится папка .git. Она у вас может быть не видна, так как создается скрытой. Чтобы ее увидеть, выполните все, что написано в гайде.
Если что-то сломаете и захотите заново проинициализировать репозиторий, то просто удалите папку .git.
![image2.png](/storage/blog/posts/git-part-1/image2.png)
Напишем команду
git status
В консоли вы можете видеть, что находитесь в ветке master, что еще нет коммитов (commit) и что есть файлы, которые не индексированы (untracked).
![image3.png](/storage/blog/posts/git-part-1/image3.png)
Первый commit
В Git у всех файлов есть три состояния, неиндексируемое, индексируемое, зафиксированное, мы будем постепенно перемешаться из одного состояния в другое.
- Неиндексируемое (untracked) – это состояние, при котором наши файлы не могут быть зафиксированы;
- Индексируемое (staged) – это состояние, при котором наши файлы могут быть зафиксированы;
- Зафиксированное (committed) – это состояние, при котором наши файлы сохранены и представляют собой отдельную версию, к которой всегда можно вернуться.
Для перевода из неиндексируемого состояния в индексированное необходимо написать команду
git add <относительный_путь_до_файла_или_папки>
Я же сделаю
git add *
Звездочка позволяет добавить сразу все файлы, не указывая каждый по отдельности.
![image4.png](/storage/blog/posts/git-part-1/image4.png)
Два файла перешло в состояние индексации, а папка .idea нет. Звездочка (*) не переводит файлы и папки начинающиеся с точки. Для того, чтобы одной командой перевести абсолютно все файлы, необходимо написать
git add .
Мы же укажем Git наши намерения через
git add .idea/
![image5.png](/storage/blog/posts/git-part-1/image5.png)
Теперь все хорошо. Осталось закоммитить (зафиксировать) изменения, в данном случае инициализацию.
Для этого необходимо написать команду
git commit -m «<описание_коммита>»
Вы можете написать просто git commit, без флага -m, но в этом случае вы не напишите комментарий, а это необходимо делать всегда.
![image6.png](/storage/blog/posts/git-part-1/image6.png)
Вот и все, мы создали первый коммит, с комментарием initial commit.
Напишем команду
git log
![image7.png](/storage/blog/posts/git-part-1/image7.png)
Здесь мы видим хеш коммита, ветку, кто сделал этот коммит, время и его описание.
Git в IDE
Теперь я перейду в IDE от компании JetBrains для Java (Intellij Idea). В ней я увижу все то же самое, что и в консоле, только представлено в более удобном виде.
![image8.png](/storage/blog/posts/git-part-1/image8.png)
На скриншоте выше, представлена вкладка (1), куда необходимо кликнуть, чтобы открыть это окно, описание коммита (2), затронутые файлы (3) и различные метаданные (4).
Давайте что-то изменим в файлах. Теперь Idea начала подчеркивать название файла синим цветом, что означает различие с предыдущей версией.
![image9.png](/storage/blog/posts/git-part-1/image9.png)
Для разнообразия, предлагаю сделать коммит через Idea.
![image10.png](/storage/blog/posts/git-part-1/image10.png)
Справа сверху есть галочка (3), нажав на которую мы переместимся в окно (1), где находятся все неиндексированные и индексированные файлы, которые имеют различие с предыдущей версией.
На скриншоте выделена галочка (2), которая сигнализирует о том, что файл индексирован. То есть выполнена команда git add. Если же мы уберем эту галочку, то файл будет не индексирован.
Так же IDE создала свой системный файл vcs.xml.
Осталось только добавить описание к коммиту, нажать на кнопку «Commit» и зафиксировать версию. Посмотрим, что получилось.
![image11.png](/storage/blog/posts/git-part-1/image11.png)
Как мы видим, теперь есть два коммита. Если кликнуть два раза на Main,java то увидим, какие изменения произошли в этом файле.
![image12.png](/storage/blog/posts/git-part-1/image12.png)
GitHub, GitLab, Bitbucket
Теперь у вас может возникнуть вопрос, а как же другому разработчику получить репозиторий с проектом? Для этих целей существуют веб-сервисы для хостинга вашего проекта. Самые популярные это:
- GitHub
- GitLab
- Bitbucket
Лучшей считается Bitbucket, по причине его интеграций с другими популярными системами от этой компании, но он платный. Поэтому воспользуемся GitHub.
Первым делом необходимо зарегистрироваться на сайте GitHub и создать новый репозиторий.
![image13.png](/storage/blog/posts/git-part-1/image13.png)
![image14.png](/storage/blog/posts/git-part-1/image14.png)
На этапе создания необходимо придумать название и выбрать видимость Public/Private. Если вы хотите, чтобы все могли увидеть проект, то ставьте Public. Если хотите сами решать кому можно видеть, а кому нет, ставьте Private.
Git Push/Clone/Pull
После создания репозитория, необходимо указать Git, где находиться удаленный репозиторий. Сделать это можно через консоль командой
git remote add origin <ссылка_на_ваш_репозиторий>
Либо воспользоваться Idea, нажать на вкладку Git -> Manage Remotes.
![image15.png](/storage/blog/posts/git-part-1/image15.png)
Далее нажимаем на плюсик и вставляем URL репозитория.
![image16.png](/storage/blog/posts/git-part-1/image16.png)
Теперь можно загрузить все коммиты в удаленный репозиторий на GitHub, выполнив команду
git push
Либо в Idea нажать на вкладку Git -> Push, и в появившемся окне выбрать «Push».
Во вкладке с репозиторием, в браузере, обновите страницу.
![image17.png](/storage/blog/posts/git-part-1/image17.png)
Все коммиты и вся история изменений лежат удаленно, и можно легко поделиться проектом с коллегой, просто отправив ему ссылку. Для того, чтобы получить экземпляр репозитория ему необходимо перейти в папку, где планируется храниться репозиторий, и в Bash написать команду
git clone <ссылка_на_репозиторий>
Давайте сымитируем это. Я создам отдельную папку для второго экземпляра репозитория и выполню эту команду.
![image18.png](/storage/blog/posts/git-part-1/image18.png)
Мы успешно клонировали репозиторий, открою его в Idea.
Теперь представим, что коллега поработал, внес изменения, загрузил их на GitHub. Была добавлена строка
System.out.println("Hello World!2");
![image19.png](/storage/blog/posts/git-part-1/image19.png)
Если вернуться в первый изначальный репозиторий, то увидим, что на удаленном репозитории произошли какие-то изменения, а у нас неактуальная версия проекта. Необходимо синхронизироваться. Сделать это можно, выполнив команду
git pull
Или же в Idea нажать на «Update Project» и в появившемся окне нажать «OK».
![image20.png](/storage/blog/posts/git-part-1/image20.png)
Теперь видно, что в проекте есть строка, которую мы добавили в клонированном репозитории (имитация того, что коллега что-то сделал в коде), и в истории появился соответствующий коммит.
![image21.png](/storage/blog/posts/git-part-1/image21.png)
.gitignore
Если мы посмотрим на приложение на GitHub, то увидим, что есть папка .idea, которой быть не должно. Это системная папка, которая создает Idea.
Системные папки и файлы класть в коммит не нужно.
Для того, чтобы не добавлять те файлы, которые не должны быть зафиксированы, мы можем просто их не индексировать, но это очень неудобно. Поэтому можно создать файл .gitignore, и в нем указать те файлы и папки, которые Git будет игнорировать.
![image22.png](/storage/blog/posts/git-part-1/image22.png)
Теперь в GitHub мы видим, что наша папка .idea все равно осталась. Это связано с тем, что мы ее зафиксировали до того, как добавили исключение в файл .gitignore, необходимо ее удалить из Git. Воспользуемся bash и напишем команду
git rm -r –cached .idea
Сейчас Git удалил у себя эту папку, осталось только зафиксировать и загрузить изменения.
![image23.png](/storage/blog/posts/git-part-1/image23.png)
Теперь в GitHub папка .idea не отображается.
Итог
Данная статья была направлена на то, чтобы вы смогли сделать свои первые шаги в использовании инструмента Git. Многие вещи здесь не были затронуты, речь про них пойдет уже в следующих частях.
Важно уметь использовать Git не только через ide или специализированных клиентов по типу git-fork, но и через консоль Bash. Все программы с визуально красивым интерфейсом никогда не дадут вам той гибкости, которую может дать самая обычная консоль. Но стандартные, рутинные вещи, лично я, предпочитаю выполнять в IDE.