1. Что такое Git?
Git — это популярная система управления версиями файлов, используемая многими разработчиками для своих проектов. Он легкий и быстрый по производительности по сравнению с лайками. Благодаря ряду инструментов на основе пользовательского интерфейса, помогающих в создании версий на основе Git, разработчикам стало чрезвычайно удобно использовать систему управления версиями Git. Git представляет такие функции, как дешевое локальное ветвление, удобные промежуточные области и несколько конфигураций рабочего процесса.
В этой статье мы специально сосредоточимся на начале работы с Git и рассмотрим некоторые основные команды, которые понадобятся для простого проекта. В статье рассматриваются все детали возможных ситуаций, которые могут возникнуть во время управления версиями. Однако, прежде чем начать с него, необходимо установить систему контроля версий Git (VCS) в вашей системе.
2. Установка Git
Чтобы установить Git в вашу систему, выполните следующие действия:
2.1 Установка Git в Windows и MacOS
- Перейти на домашнюю страницу Git VCS
- Вы должны быть в состоянии найти кнопку загрузки для последней доступной версии Git
- Скачать и установить то же самое
Чтобы проверить установку, введите приведенную ниже команду в командной строке (Windows) или в терминале (Mac OS).
|
1
|
$ git --version |
Вывод, как показано ниже, должен появиться, если установка прошла нормально.
2.2 Установка Git Core в Linux
Git не предоставляет готовые установочные файлы для Linux. Следовательно, есть альтернативный способ установить его вместо. Выполните приведенную ниже команду из терминала, чтобы установить пакет git-core .
|
1
|
$ sudo apt-get install git-core |
Это сделает все необходимые шаги, и как только он будет готов, выполните следующие шаги, чтобы проверить установку.
Введите приведенную ниже команду в окне терминала.
|
1
|
$ git --version |
Вывод, как показано выше, должен появиться, если установка прошла нормально.
3. Начиная с версии Git
После того, как установка завершена и проверена, мы все готовы начать с первого контроля версий проекта с использованием Git. Мы бы поработали с фиктивным Java-проектом, чтобы лучше понять управление версиями файлов для проекта. Вы можете использовать любую популярную среду разработки для создания проекта Java и начать работу. Здесь используется IDE Eclipse IDE. Однако для выполнения команд мы строго ограничимся инструментами командной строки.
3.1 Создание и инициализация Git-репозитория
Чтобы настроить проект для использования системы управления версиями на основе Git, все, что вам нужно сделать, это инициализировать каталог проекта как GIT-репозиторий. Создайте проект Java в нужном вам каталоге, используя предпочитаемую среду IDE.
Теперь откройте свой терминал и измените каталог на каталог проекта с помощью популярной команды cd .
|
1
|
$ cd /path/to/project |
Чтобы инициализировать репозиторий Git, выполните команду git init . Вывод, как показано ниже, должен быть видимым.
|
1
2
|
$ git initInitialized empty Git repository in /Users/abhishekkothari/Desktop/JavaCodeGeeks/GitBeginners/GitBeginner/.git/ |
Как видно, в папке проекта создается каталог .git . Эта папка отслеживает все изменения, которые происходят локально. Вы можете проверить состояние каталога с помощью команды git status . Он должен обеспечить вывод, аналогичный показанному ниже. Это может измениться, если вы используете другую IDE.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$ git statusOn branch masterNo commits yetUntracked files: (use "git add ..." to include in what will be committed) .classpath .project .settings/ bin/ src/ |
3.2 Начиная с версии файла
Теперь в проекте создайте файл Java, как показано ниже.
SayHello.java
|
1
2
3
4
5
6
7
|
package com.javacodegeeks;public class SayHello { public static void main(String[] args) { System.out.println("Hello there!"); }} |
В среде IDE может отображаться ошибка для пакета. Не стесняйтесь удалить декларацию пакета, если не требуется. Как только файл создан, нам нужно добавить файл в индекс GIT. Это позволит установить, что изменения в файлах отслеживаются после этого. Чтобы добавить файл в индекс, выполните команду git add /path-to-file/SayHello.java . Там не будет никакой обратной связи с командой. Однако вы можете проверить статус, чтобы убедиться, что файл добавлен в индекс.
При проверке состояния будет виден вывод, подобный показанному ниже.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
$ git add src/com/javacodegeeks/SayHello.java $ git statusOn branch masterNo commits yetChanges to be committed: (use "git rm --cached ..." to unstage) new file: src/com/javacodegeeks/SayHello.javaUntracked files: (use "git add ..." to include in what will be committed) .classpath .project .settings/ bin/ |
Следующим шагом в потоке является фактическая фиксация файла в хранилище. Зафиксированный файл означает, что текущая версия файла в хранилище будет перезаписана. Файл может быть зафиксирован с помощью команды git commit . Также возможно добавить комментарии, описывающие изменения, которые совершаются. Для этого выполните команду, как показано ниже.
|
1
|
$ git commit -m "First File Committed" |
Это приведет к фиксации файла с упоминанием комментария First File Committed в трассе. Вывод, аналогичный показанному ниже, должен быть видимым.
|
1
2
3
4
|
$ git commit -m "First File Committed"[master (root-commit) 9cce524] First File Committed 1 file changed, 7 insertions(+) create mode 100644 src/com/javacodegeeks/SayHello.java |
3.3 Работа с несколькими файлами
Управление версиями файлов обычно используется, когда есть несколько файлов для работы. Следовательно, безусловно, должны быть способы легко работать с несколькими файлами, а не выполнять git add file-name для каждого файла для индексации каждый раз. Чтобы понять то же самое, давайте создадим еще два простых файла Java, как показано ниже.
EvenNumbers.java
|
1
2
3
4
5
6
7
8
9
|
package com.javacodegeeks;public class EvenNumbers { public static void printEvenNumber(int i) { System.out.println("Even numbers upto "+i); for(int x=0;x<i;x=x+2) System.out.println(x); }} |
OddNumbers.java
|
1
2
3
4
5
6
7
8
9
|
package com.javacodegeeks;public class OddNumbers { public static void printOddNumber(int i) { System.out.println("Odd numbers upto "+i); for(int x=1;x<i;x=x+2) System.out.println(x); }} |
Теперь нам нужно добавить эти два файла в индекс без выполнения команды для каждого файла. Для этого есть два пути. Один из них полезен, когда вы хотите добавить файлы с определенным расширением. Например,
|
1
|
$ git add *.java |
Приведенная выше команда добавит все файлы с расширением .java в сцену. Постановка — это область, в которой хранится версия файла до момента его фиксации. Другой возможный способ — добавить все файлы, которые существуют в проекте, используя команду ниже.
|
1
|
$ git add -A |
Эта команда позаботится обо всех файлах — новых, измененных и удаленных. Давайте теперь изменим файл SayHello.java как показано ниже.
SayHello.java
|
1
2
3
4
5
6
7
8
9
|
package com.javacodegeeks;public class SayHello { public static void main(String[] args) { System.out.println("Hello there!"); EvenNumbers.printEvenNumber(11); OddNumbers.printOddNumber(12); }} |
Теперь выполните любую из приведенных выше команд, чтобы добавить все файлы Java в промежуточную область, а затем проверьте состояние. Статус должен быть похож на тот, который показан ниже:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
$ git statusOn branch masterChanges to be committed: (use "git reset HEAD ..." to unstage) new file: src/com/javacodegeeks/EvenNumbers.java new file: src/com/javacodegeeks/OddNumbers.java modified: src/com/javacodegeeks/SayHello.javaUntracked files: (use "git add ..." to include in what will be committed) .classpath .project .settings/ bin/ |
Если бы вы использовали команду git add -A , она бы также добавила все пустые каталоги в индекс. Если это не так, как вы ожидали, вы можете легко отменить движение к сцене, выполнив git reset . Это сбросит выполненное действие добавления и вернет этап к предыдущему коммиту. Будет доступен вывод, аналогичный показанному ниже.
|
1
2
3
|
$ git resetUnstaged changes after reset:M src/com/javacodegeeks/SayHello.java |
После сброса вы можете добавить ожидаемые файлы в промежуточную и зафиксировать, когда все будет хорошо.
3.4 Подключение к удаленному хранилищу
Изменения, отслеживаемые и сохраняемые на вышеуказанных этапах, отслеживаются локально. На данный момент файлы недоступны в сети для работы других разработчиков. Чтобы другие разработчики могли получить доступ или клонировать код, важно подключить локальную базу кода к удаленному хранилищу. Для этого вам нужно начать с создания онлайн-хранилища на популярных платформах Git-хостинга, таких как GitHub. Для этой статьи я создал репозиторий GitBeginner на Github. Для подключения локальных файлов к хранилищу выполните команду ниже.
|
1
|
$ git remote add origin https://github.com/datsabk/GitBeginner.git |
Там не будет никакой обратной связи для команды. Однако вы можете проверить успешное соединение, используя приведенную ниже команду.
|
1
2
3
4
5
|
$ git remote show origin* remote origin Fetch URL: https://github.com/datsabk/GitBeginner.git Push URL: https://github.com/datsabk/GitBeginner.git HEAD branch: (unknown) |
Теперь, когда локальные файлы подключены к удаленному хранилищу, пришло время отправить файлы в хранилище. Для этого выполните команду, показанную ниже:
|
1
2
3
4
5
6
7
8
9
|
$ git push -u origin masterCounting objects: 6, done.Delta compression using up to 4 threads.Compressing objects: 100% (2/2), done.Writing objects: 100% (6/6), 471 bytes | 157.00 KiB/s, done.Total 6 (delta 0), reused 0 (delta 0)To https://github.com/datsabk/GitBeginner.git * [new branch] master -> masterBranch 'master' set up to track remote branch 'master' from 'origin'. |
Incase, вы не настроили Git для данных пользователя, вам будет предложено ввести учетные данные для соответствующей учетной записи хостинга. Вы можете настроить свое имя пользователя и пароль в Git, выполнив шаги по этой ссылке .
3.5 Git Ветвление и Слияние
В большом проекте разработчики обычно не работают над общей веткой. Каждый разработчик создает ветку в отношении функции, которую он разрабатывает, или ошибки, которую они пытаются устранить. В этом разделе описывается процесс создания ветви и ее слияния с основной веткой.
Прежде всего, давайте создадим локальную ветвь. Чтобы создать новую локальную ветвь, выполните команду git checkout -b newbranch . Это создаст новую локальную ветку и переключится на нее. Будет доступен вывод, аналогичный показанному ниже.
|
1
2
3
|
$ git checkout -b newbranchM src/com/javacodegeeks/SayHello.javaSwitched to a new branch 'newbranch' |
Теперь давайте изменим код в SayHello.java как показано ниже:
SayHello.java
|
01
02
03
04
05
06
07
08
09
10
11
|
package com.javacodegeeks;public class SayHello { public static void main(String[] args) { System.out.println("Hello there!"); System.out.println("Printing even numbers"); EvenNumbers.printEvenNumber(11); System.out.println("Printing odd numbers"); OddNumbers.printOddNumber(12); }} |
Разработчикам иногда нужно проверять различия между файлами в удаленном хранилище. Когда это требуется, просто выполните команду git diff чтобы проверить все изменения. Вывод, аналогичный показанному ниже, включится.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
$ git diffdiff --git a/bin/com/javacodegeeks/SayHello.class b/bin/com/javacodegeeks/SayHello.classindex 0e9d8e3..6c45444 100644Binary files a/bin/com/javacodegeeks/SayHello.class and b/bin/com/javacodegeeks/SayHello.class differdiff --git a/src/com/javacodegeeks/SayHello.java b/src/com/javacodegeeks/SayHello.javaindex 815b53a..4276f44 100644--- a/src/com/javacodegeeks/SayHello.java+++ b/src/com/javacodegeeks/SayHello.java@@ -3,7 +3,9 @@ package com.javacodegeeks; public class SayHello { public static void main(String[] args) { System.out.println("Hello there!");+ System.out.println("Printing Even numbers"); EvenNumbers.printEvenNumber(11);+ System.out.println("Printing Odd numbers"); OddNumbers.printOddNumber(12); } } |
Как можно заметить, есть знаки +, указывающие, что две строки были добавлены. Для файлов .class Git не может прочитать их как текст, поскольку они представляют собой двоичные байтовые коды. Следовательно, это просто говорит о том, что они отличаются от того, что было совершено ранее. Теперь пришло время протолкнуть эти изменения и объединить их с главной веткой. Процедура отправки изменений в удаленный репозиторий остается прежней. Выполните команды, как показано ниже:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$ git commit -m "Added two lines"[newbranch 3f7d0cb] Added two lines 1 file changed, 2 insertions(+)MacBook-Air:GitBeginner abhishekkothari$ git push -u origin newbranchCounting objects: 24, done.Delta compression using up to 4 threads.Compressing objects: 100% (18/18), done.Writing objects: 100% (24/24), 3.09 KiB | 791.00 KiB/s, done.Total 24 (delta 5), reused 0 (delta 0)remote: Resolving deltas: 100% (5/5), done.To https://github.com/datsabk/GitBeginner.git * [new branch] newbranch -> newbranchBranch 'newbranch' set up to track remote branch 'newbranch' from 'origin'. |
Теперь новая ветка создана в удаленном хранилище, и изменения передаются в ветку. Однако изменения пока недоступны в основной ветке. Чтобы перенести эти изменения в основную ветку, создайте запрос на слияние с помощью интерфейса пользователя Github, как показано ниже.
После получения запроса на слияние уполномоченное лицо может принять запрос и перенести изменения в главный репозиторий и сделать его доступным для других. В большом проекте часто возникают конфликты во время слияния. Конфликты возникают, когда другой разработчик уже объединяет изменения в файле, который вы пытаетесь объединить. В таком случае Git не может решить, должны ли изменения быть перезаписаны или объединены.
Конфликтующий сценарий был создан в вышеупомянутом запросе на удаление, отредактировав файл SayHello.java в основной ветке, как показано ниже:
SayHello.java
|
1
2
3
4
5
6
7
|
package com.javacodegeeks;public class SayHello { public static void main(String[] args) { System.out.println("Hi there!"); }} |
Как только это изменение было выполнено, запрос на извлечение показывает конфликт, как показано ниже:
Эти конфликты можно разрешить в интерактивном режиме, щелкнув Разрешить конфликты и выбрав код, который необходимо записать в файл после объединения. Такие конфликты могут быть сложными время от времени. Следовательно, рекомендуется извлекать последние изменения в файлы постепенно, чтобы избежать большого количества конфликтующего кода. Последние изменения в любой конкретной ветке можно получить с помощью команд, показанных ниже:
|
1
2
|
$ git fetch origin$ git merge origin/master |
Первая команда извлечет последние изменения соответствующей ветки. Следующая команда выполняет слияние извлеченных изменений в локальные файлы.
3.6 Игнорирование определенных файлов
В предыдущих операциях мы придерживались команды git add *.java . Однако это не всегда так. Может возникнуть необходимость, когда мы хотим игнорировать только определенные файлы, а не все. В таком случае нижеприведенная команда пригодится.
|
1
|
$ git rm -r --cached *.class |
Выполнив приведенную выше команду и затем проверив состояние хранилища, вы обнаружите, что файлы классов теперь игнорируются, и вывод состояния git status аналогичен показанному ниже.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
$ git statusOn branch newbranchYour branch is up to date with 'origin/newbranch'.Changes to be committed: (use "git reset HEAD ..." to unstage) deleted: bin/com/javacodegeeks/EvenNumbers.class deleted: bin/com/javacodegeeks/OddNumbers.class deleted: bin/com/javacodegeeks/SayHello.classUntracked files: (use "git add ..." to include in what will be committed) bin/ |
Это указывает на то, что файлы классов удалены из списка отслеживания и папка bin теперь не отслеживается. Таким образом, файлы теперь находятся в списке игнорируемых. Этот список можно найти в файле .gitignore, расположенном в каталоге проекта.
4. Вывод
В статье подробно описан весь процесс создания и управления Git-репозиторием для начинающего проекта. Он отражает основные проблемы или функции, с которыми может столкнуться разработчик. Впереди будут сложные проблемы. Тем не менее, Git является популярной системой управления версиями, и для этого должно быть достаточно помощи.


