Что такое Git простыми словами
Git — это система контроля версий. Или другими словами — хранилище, база данных истории разработки проекта. Такая система нужна для учета всех версий файлов когда-либо созданных в проекте и содержащихся в Git (базе данных).
Базовый принцип Git, если не вдаваться в детали, достаточно прост — мы добавляем туда начальную версию файлов и если что-то отредактировали, то добавляем вторую и так далее до бесконечности. Если нам вдруг понадобилось «откатиться» до предыдущей версии, то Git без проблем позволяет это сделать.
Git незаменим при командной разработке, когда любой человек из команды может получить все уже созданные ранее версии файлов и при необходимости внести в них изменения. Система снабжена обнаружением конфликтов при попытке изменить один и тот же файл разными людьми. В этом случае Git предложит пути решения, чтобы внести тот или иной результат в редактируемый файл.
Многие путают Git и GitHub, но это не одно и то же. Git, как мы уже выяснили — это система (хранилище) контроля версий, а GitHub — интернет-сервис (его еще называют социальной сетью для программистов), по сути использующийся Git как удаленный Git-сервер, с которого можно получить все версии файлов проекта при удаленной разработке.
Git для новичков (часть 1)
Git — это консольная утилита, для отслеживания и ведения истории изменения файлов, в вашем проекте. Чаще всего его используют для кода, но можно и для других файлов. Например, для картинок — полезно для дизайнеров.
С помощью Git-a вы можете откатить свой проект до более старой версии, сравнивать, анализировать или сливать свои изменения в репозиторий.
Репозиторием называют хранилище вашего кода и историю его изменений. Git работает локально и все ваши репозитории хранятся в определенных папках на жестком диске.
Так же ваши репозитории можно хранить и в интернете. Обычно для этого используют три сервиса:
Каждая точка сохранения вашего проекта носит название коммит (commit). У каждого commit-a есть hash (уникальный id) и комментарий. Из таких commit-ов собирается ветка. Ветка — это история изменений. У каждой ветки есть свое название. Репозиторий может содержать в себе несколько веток, которые создаются из других веток или вливаются в них.
Как работает
Если посмотреть на картинку, то становиться чуть проще с пониманием. Каждый кружок, это commit. Стрелочки показывают направление, из какого commit сделан следующий. Например C3 сделан из С2 и т. д. Все эти commit находятся в ветке под названием main . Это основная ветка, чаще всего ее называют master . Прямоугольник main* показывает в каком commit мы сейчас находимся, проще говоря указатель.
В итоге получается очень простой граф, состоящий из одной ветки ( main ) и четырех commit. Все это может превратиться в более сложный граф, состоящий из нескольких веток, которые сливаются в одну.
Об этом мы поговорим в следующих статьях. Для начала разберем работу с одной веткой.
Установка
Основой интерфейс для работы с Git-ом является консоль/терминал. Это не совсем удобно, тем более для новичков, поэтому предлагаю поставить дополнительную программу с графическим интерфейсом (кнопками, графиками и т.д.). О них я расскажу чуть позже.
Но для начала, все же установим сам Git.
- Windows. Проходим по этой ссылке, выбираем под вашу ОС (32 или 64 битную), скачиваем и устанавливаем.
- Для Mac OS. Открываем терминал и пишем:
#Если установлен Homebrew brew install git #Если нет, то вводим эту команду. git --version #После этого появится окно, где предложит установить Command Line Tools (CLT). #Соглашаемся и ждем установки. Вместе с CLT установиться и git
- Linux. Открываем терминал и вводим следующую команду.
# Debian или Ubuntu sudo apt install git # CentOS sudo yum install git
Настройка
Вы установили себе Git и можете им пользоваться. Давайте теперь его настроим, чтобы когда вы создавали commit, указывался автор, кто его создал.
Открываем терминал (Linux и MacOS) или консоль (Windows) и вводим следующие команды.
#Установим имя для вашего пользователя #Вместо можно ввести, например, Grisha_Popov #Кавычки оставляем git config --global user.name "" #Теперь установим email. Принцип тот же. git config --global user.email ""
Создание репозитория
Теперь вы готовы к работе с Git локально на компьютере.
Создадим наш первый репозиторий. Для этого пройдите в папку вашего проекта.
#Для Linux и MacOS путь может выглядеть так /Users/UserName/Desktop/MyProject #Для Windows например С://MyProject cd #Инициализация/создание репозитория git init
Теперь Git отслеживает изменения файлов вашего проекта. Но, так как вы только создали репозиторий в нем нет вашего кода. Для этого необходимо создать commit.
#Добавим все файлы проекта в нам будующий commit git add . #Или так git add --all #Если хотим добавить конкретный файл то можно так git add #Теперь создаем commit. Обязательно указываем комментарий. #И не забываем про кавычки git commit -m ""
Отлично. Вы создали свой первый репозиторий и заполнили его первым commit.
Процесс работы с Git
Не стоит после каждого изменения файла делать commit. Чаще всего их создают, когда:
- Создан новый функционал
- Добавлен новый блок на верстке
- Исправлены ошибки по коду
- Вы завершили рабочий день и хотите сохранить код
Это поможет держать вашу ветки в чистоте и порядке. Тем самым, вы будете видеть историю изменений по каждому нововведению в вашем проекте, а не по каждому файлу.
Визуальный интерфейс
Как я и говорил ранее, существуют дополнительные программы для облегчения использования Git. Некоторые текстовые редакторы или полноценные среды разработки уже включают в себя вспомогательный интерфейс для работы с ним.
Но существуют и отдельные программы по работе с Git. Могу посоветовать эти:
Я не буду рассказывать как они работают. Предлагаю разобраться с этим самостоятельно.
Создаем свой первый проект и выкладываем на GitHub
Давайте разберемся как это сделать, с помощью среды разработки Visual Studio Code (VS Code).
Перед началом предлагаю зарегистрироваться на GitHub.
Создайте папку, где будет храниться ваш проект. Если такая папка уже есть, то создавать новую не надо.
После открываем VS Code .
- Установите себе дополнительно анализаторы кода для JavaScript и PHP
- Откройте вашу папку, которую создали ранее
После этого у вас появится вот такой интерфейс
- Здесь будут располагаться все файлы вашего проекта
- Здесь можно работать с Git-ом
- Кнопка для создания нового файла
- Кнопка для создания новой папки
Если ваш проект пустой, как у меня, то создайте новый файл и назовите его index.html . После этого откроется окно редактирование этого файла. Напишите в нем ! и нажмите кнопку Tab . Автоматически должен сгенерироваться скелет пустой HTML страницы. Не забудьте нажать ctrl+s чтобы файл сохранился.
Давайте теперь перейдем во вкладу для работы с Git-ом.
Откроется вот такое окно:
- Кнопка для публикации нашего проекта на GitHub
- После нажатия на кнопку 1 , появится всплывающее окно. Нужно выбрать второй вариант или там где присутствует фраза . public repository
Если вы хотите создать локальный репозиторий и опубликовать код в другой сервис, то необходимо нажать на кнопку Initialize Repository . После этого, вручную выбрать сервис куда публиковать.
После того, как выбрали «Опубликовать на GitHub публичный репозиторий» (пункт 2), программа предложит вам выбрать файлы, которые будут входить в первый commit. Проставляем галочки у всех файлов, если не проставлены и жмем ОК . Вас перекинет на сайт GitHub, где нужно будет подтвердить вход в аккаунт.
Вы создали и опубликовали репозиторий на GitHub.
Теперь сделаем изменения в коде и попробуем их снова опубликовать. Перейдите во вкладку с файлами, отредактируйте какой-нибудь файл, не забудьте нажать crtl+s (Windows) или cmd+s (MacOS), чтобы сохранить файл. Вернитесь обратно во вкладу управления Git.
Если посмотреть на значок вкладки Git, то можно увидеть цифру 1 в синем кружке. Она означает, сколько файлов у нас изменено и незакоммичено. Давайте его закоммитим и опубликуем:
- Кнопка для просмотра изменений в файле. Необязательно нажимать, указал для справки
- Добавляем наш файл для будущего commit
- Пишем комментарий
- Создаем commit
- Отправляем наш commit в GitHub
Поздравляю, вы научились создавать commit и отправлять его в GitHub!
Итог
Это первая вводная статья по утилите Git. Здесь мы рассмотрели:
- Как его устанавливать
- Как его настраивать
- Как инициализировать репозиторий и создать commit через консоль
- Как на примере VS Code, опубликовать свой код на GitHub
Забегая вперед, советую вам погуглить, как работают следующие команды:
git help # справка по всем командам git clone git status git branch git checkout git merge git remote git fetch git push git pull
P.S. Для облегчения обучения, оставлю вам ссылку на бесплатный тренажер по Git.
В телеграмм канале Step by Step , я публикую еще больше материала и провожу обучающие стримы, для всех желающих.
A2.3 Приложение B: Встраивание Git в ваши приложения — JGit
Если вы хотите использовать Git из Java-программ, существует библиотека для работы с Git, называемая JGit. Она достаточно полно реализует функциональность Git, написана на чистом Java и широко используется Java сообществом. Проект JGit находится под опекой Eclipse и расположен по адресу https://www.eclipse.org/jgit.
Приступая к работе
Существует несколько способов добавить JGit в проект и начать писать код с использованием предоставляемого API. Возможно, самый простой путь — использование Maven: подключение библиотеки происходит путём добавления следующих строк в секцию в вашем pom.xml:
org.eclipse.jgit org.eclipse.jgit 3.5.0.201409260305-r
С момента выхода книги скорее всего появились новые версии JGit, проверьте обновления на https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit. После обновления конфигурации Maven автоматически скачает JGit нужной версии и добавит её к проекту.
Если вы управляете зависимостями вручную, собранные бинарные пакеты JGit доступны на https://www.eclipse.org/jgit/download. Использовать их в своём проекте можно следующим способом:
javac -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App.java java -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App
Служебный API
У JGit есть два уровня API: служебный («plumbing» API, «трубопровод») и пользовательский («porcelain» API, «фарфор»). Эта терминология заимствована из самого Git и JGit разделён на две части: «фарфоровый» API предоставляет удобные методы для распространённых задач прикладного уровня (тех, для решения которых вы бы использовали обычные Git-команды) и «сантехнический» API для прямого взаимодействия с низкоуровневыми объектами репозитория.
Начальная точка большинства сценариев использования JGit — класс Repository и первое, что необходимо сделать — это создать объект данного класса. Для репозиториев основанных на файловой системе (да, JGit позволяет использовать другие модели хранения) эта задача решается с помощью класса FileRepositoryBuilder :
// Создание нового репозитория; каталог должен существовать Repository newlyCreatedRepo = FileRepositoryBuilder.create( new File("/tmp/new_repo/.git")); newlyCreatedRepo.create(); // Открыть существующий репозиторий Repository existingRepo = new FileRepositoryBuilder() .setGitDir(new File("my_repo/.git")) .build();
Вызовы методов билдера можно объединять в цепочку чтобы указать всю информацию для поиска репозитория независимо от того, знает ли ваша программа его точное месторасположение или нет. Можно читать системные переменные ( .readEnvironment() ), начать поиск с произвольного места в рабочем каталоге ( .setWorkTree(…).findGitDir() ), или просто открыть каталог .git по указанному пути.
После создания объекта типа Repository , вам будет доступен широкий набор операций над ним. Краткий пример:
// Получение ссылки Ref master = repo.getRef("master"); // Получение объекта, на который она указывает ObjectId masterTip = master.getObjectId(); // Использование синтаксиса rev-parse ObjectId obj = repo.resolve("HEAD^"); // Получение «сырых» данных ObjectLoader loader = repo.open(masterTip); loader.copyTo(System.out); // Создание ветки RefUpdate createBranch1 = repo.updateRef("refs/heads/branch1"); createBranch1.setNewObjectId(masterTip); createBranch1.update(); // Удаление ветки RefUpdate deleteBranch1 = repo.updateRef("refs/heads/branch1"); deleteBranch1.setForceUpdate(true); deleteBranch1.delete(); // Работа с конфигурацией Config cfg = repo.getConfig(); String name = cfg.getString("user", null, "name");
Тут происходит много интересного, давайте разберёмся по порядку.
Первая строка получает указатель на ссылку master . JGit автоматически получает актуальную информацию о master , хранимую по пути refs/heads/master , и возвращает объект, предоставляющий доступ к информации о ссылке. Вы можете получить имя ( .getName() ), а также целевой объект прямой ссылки ( .getObjectId() ) или ссылку, на которую указывает другая символьная ссылка ( .getTarget() ). Объекты типа Ref также служат для представления ссылок на теги и самих тегов; вы можете узнать, является ли тег «конечным» («peeled»), т. е. ссылается ли он на целевой объект потенциально длинной цепи тегов.
Вторая строка получает объект на который указывает ссылка master в виде ObjectId. ObjectId представляют SHA-1-хеш объекта, который, возможно, сохранён внутри базы данных объектов Git. Следующая строка похожа на предыдущую, но используется синтаксис rev-parse (см. детали в разделе Ссылки на ветки главы 7); вы можете использовать любой, подходящий формат и JGit вернёт либо валидный ObjectId для указанного объекта, либо null .
Следующие две строки показывают, как можно получить содержимое объекта. В этом примере мы используем ObjectLoader.copyTo() чтобы передать содержимое файла прямиком в stdout, но у ObjectLoader есть методы для чтения типа и размера объекта, а также для считывания объекта в виде массива байтов. Для больших объектов (у которых .isLarge() возвращает true ) можно использовать метод .openStream() для открытия потока последовательного чтения объекта без полной загрузки в память.
Следующие строки показывают, как создать новую ветку. Мы создаём объект типа RefUpdate, устанавливаем некоторые параметры и вызываем метод .update() чтобы инициировать изменение. После этого мы удаляем эту же ветку. Обратите внимание на необходимость вызова .setForceUpdate(true) для корректной работы; иначе вызов .delete() вернёт REJECTED и ничего не произойдёт.
Последний кусок кода показывает как получить параметр user.name из файлов конфигурации Git. Созданный объект Config будет использовать открытый ранее репозиторий для чтения локальной конфигурации, также он автоматически находит файлы глобальной и системной конфигурации и использует их для чтения значений.
Это лишь малая часть служебного API JGit; в вашем распоряжении окажется гораздо больше классов и методов. Мы не показали как JGit обрабатывает ошибки. JGit использует механизм исключений Java; иногда он бросает стандартные исключения (типа IOException ), иногда — специфичные для JGit (например NoRemoteRepositoryException , CorruptObjectException и NoMergeBaseException ).
Пользовательский API
Служебные API достаточно всеобъемлющи, но сложны в использовании для простых задач вроде добавления файла в индекс или создания нового коммита. У JGit есть API более высокого уровня, входная точка в который — это класс Git :
Repository repo; // создание репозитория. Git git = new Git(repo);
В классе Git можно найти отличный набор высокоуровневых «текучих» методов (builder-style / fluent interface). Давайте взглянем на пример — результат выполнения этого кода напоминает git ls-remote :
CredentialsProvider cp = new UsernamePasswordCredentialsProvider("username", "p4ssw0rd"); Collection remoteRefs = git.lsRemote() .setCredentialsProvider(cp) .setRemote("origin") .setTags(true) .setHeads(false) .call(); for (Ref ref : remoteRefs) < System.out.println(ref.getName() + " ->" + ref.getObjectId().name()); >
Тут показан частый случай использования класса Git: методы возвращают тот же объект, на котором вызваны, что позволяет чередовать их друг за другом, устанавливая параметры, а выполнение происходит при вызове .call() . В этом примере мы запрашиваем с удалённого репозитория origin список тегов, исключая ветки. Обратите внимание на использование класса CredentialsProvider для аутентификации.
Множество команд доступно в классе Git, включая такие как add , blame , commit , clean , push , rebase , revert , reset и другие.
Дополнительные материалы
Это лишь небольшой пример всех возможностей JGit. Если вы заинтересованы в более детальной работе с JGit, вот список источников информации для старта:
- Официальная документация по JGit API доступна в Интернете на https://www.eclipse.org/jgit/documentation. Это обыкновенный Javadoc, так что ваша любимая IDE может скачать её и использовать оффлайн.
- «Поваренная книга» JGit, расположенная по адресу https://github.com/centic9/jgit-cookbook, включает в себя много готовых рецептов использования JGit для решения тех или иных задач.
Что такое GIT
GIT (читается как «гит») — это бесплатная программа, которую создал тот же человек, что придумал Linux — Линус Торвальд.
Конкретнее, GIT — это «система контроля версий». Так что же такое «система контроля версий»? Давайте посмотрим на примере.
Представим, что мы работаем в текстовом редакторе:
Допустим — о ужас! — Вы только что случайно удалили целую главу документа, над которой Вы работали целую неделю. Но не беда — Вы можете в любой момент отменить свое последнее действие, и вот, ничего не пропало!
Тем не менее, если Вы случайно удалите весь файл, или захотите вернуться к версии документа «на 6.09.20ХХ», у Вас ничего не выйдет. Почему? Потому что обычно текстовые редакторы хранят только изменения, сделанные в промежутке времени после того, как вы открыли документ, и до того как Вы его не закроете.
Но если для курсовой это может быть не так критично, то для разработки программного обеспечения это куда более важная проблема. Например, Вы работаете в Facebook — а им ежедневно пользуются миллионы людей. И вот были внесены какие-то правки, и через час половина пользователей не может получить доступ к своим учетным записям. Раз, и все сломалось! Нужно срочно вернуть предыдущую версию программы.
Или, возможно Вы долго работали над правками к своей собственной программе — и в какой-то момент решили, что они Вам не нужны. Вам придется «откатить» (вернуть) до версии программы, которая была у Вас до того, как Вы начали вносить правки.
Все эти примеры — с текстовым редактором или с кодом — объединяет то, что Вы работали с «версиями» документа. Вам может понадобиться версия кода состоянием на какую-то дату, последняя рабочая версия или просто предыдущая версия. И Вы можете все это делать, т.е. «контролировать» версии — с помощью Git.
Поэтому, Git называется «системой контроля версий».
Кроме того, у Git есть еще одна функция — он помогает команде разработчиков вместе работать над созданием ПО. Они могут вместе дополнять один и тот же проект. Git также позволяет управлять правами доступа — например, их можно настроить так что Вы не сможете внести правки, пока их не одобрит более опытный член команды.
Ого, круто придумали!
Да, Git — это очень удобно.
Тем не менее, Git — не первая система контроля версий в истории человечества Такие программы появились еще в 1980-х годах.
Это компьютер IBM 1981-го года.
1980-е — это когда люди программировали на Паскале, C и C++, а про Java, Python и JavaScript даже речи не было. Т.е. давно.
До Git были, например, такие системы контроля версий как SVN и Mercurial. Тем не менее, сейчас именно Git занимает лидирующие позиции.
А что это на заставке?
Как мы говорили выше, Git позволяет контролировать версии, а также работать команде разработчиков над одним проектом.
Именно для того, чтобы код был доступен «отовсюду» всем, сам проект и все изменения хранятся где-нибудь на облаке. Обычно это называется «удаленный репозиторий».
Удаленный — потому что данные хранятся не у Вас на компьютере, а где-то на сервере. А репозиторий — от англ. repository , т.е. какой-то сервер на котором хранится ПО, и откуда можно свободно скачивать написанный код. Часто сокращенно репозиторий называют «репо«, или «репа» И по-англ. сокращают тоже — repo.
Ну так вот, есть несколько сайтов, где Вы можете размещать свой код бесплатно. Ну, как в Instagram можно зарегистрировать бесплатный аккаунт и хранить там свои фотографии, или как на MySpace можно вести бесплатный блог — точно так же есть сайты, где Вы бесплатно можете хранить свой код.
Наверное, самым крупным таким сайтом является GitHub. Картинка, с которой начинается статья — это октокот (от анг. octocat) , символ GitHub. Октокот — это сочетание осьминога и кота. Но кроме GitHub есть и другие платформы, которыми Вы можете воспользоваться (например, GitLab или Bitbucket).
Так что не надо путать Git и GitHub. Это не одно и то же!
Git — это система контроля версий, которая помогает Вас сохранять разные версии Вашего проекта во время его разработки. И таким образом, Вы всегда легко можете вернуться к любой нужной Вам версии.
GitHub — это одна из платформ, где Вы можете размещать код проекта. Для коммуникации с GitHub вы используете Git.
Итак, мы надеемся что теперь Вы понимаете, что такое Git и зачем он нужен. Чтоб прочитать следующую статью, где мы рассскажем как работает Git, жмите на ссылочку «Как работает Git»
Надеемся, что наша статья была Вам полезна. Можно записаться к нам на курсы по Java на сайте.
- ← Reflection API в Java. Класс Method. Часть 3
- Как работает GIT →