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 init Initialized 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 status On branch master No commits yet Untracked 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 status On branch master No commits yet Changes to be committed: (use "git rm --cached ..." to unstage) new file : src /com/javacodegeeks/SayHello .java Untracked 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 status On branch master Changes 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 .java Untracked files: (use "git add ..." to include in what will be committed) .classpath .project .settings/ bin/ |
Если бы вы использовали команду git add -A
, она бы также добавила все пустые каталоги в индекс. Если это не так, как вы ожидали, вы можете легко отменить движение к сцене, выполнив git reset
. Это сбросит выполненное действие добавления и вернет этап к предыдущему коммиту. Будет доступен вывод, аналогичный показанному ниже.
1
2
3
|
$ git reset Unstaged 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 master Counting 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 -> master Branch '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 newbranch M src /com/javacodegeeks/SayHello .java Switched 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 diff diff --git a /bin/com/javacodegeeks/SayHello .class b /bin/com/javacodegeeks/SayHello .class index 0e9d8e3..6c45444 100644 Binary files a /bin/com/javacodegeeks/SayHello .class and b /bin/com/javacodegeeks/SayHello .class differ diff --git a /src/com/javacodegeeks/SayHello .java b /src/com/javacodegeeks/SayHello .java index 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 newbranch Counting 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 -> newbranch Branch '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 status On branch newbranch Your 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 .class Untracked files: (use "git add ..." to include in what will be committed) bin/ |
Это указывает на то, что файлы классов удалены из списка отслеживания и папка bin теперь не отслеживается. Таким образом, файлы теперь находятся в списке игнорируемых. Этот список можно найти в файле .gitignore, расположенном в каталоге проекта.
4. Вывод
В статье подробно описан весь процесс создания и управления Git-репозиторием для начинающего проекта. Он отражает основные проблемы или функции, с которыми может столкнуться разработчик. Впереди будут сложные проблемы. Тем не менее, Git является популярной системой управления версиями, и для этого должно быть достаточно помощи.