Статьи

Git Учебник для начинающих

1. Что такое Git?

Git — это популярная система управления версиями файлов, используемая многими разработчиками для своих проектов. Он легкий и быстрый по производительности по сравнению с лайками. Благодаря ряду инструментов на основе пользовательского интерфейса, помогающих в создании версий на основе Git, разработчикам стало чрезвычайно удобно использовать систему управления версиями Git. Git представляет такие функции, как дешевое локальное ветвление, удобные промежуточные области и несколько конфигураций рабочего процесса.

В этой статье мы специально сосредоточимся на начале работы с Git и рассмотрим некоторые основные команды, которые понадобятся для простого проекта. В статье рассматриваются все детали возможных ситуаций, которые могут возникнуть во время управления версиями. Однако, прежде чем начать с него, необходимо установить систему контроля версий Git (VCS) в вашей системе.

2. Установка Git

Чтобы установить Git в вашу систему, выполните следующие действия:

2.1 Установка Git в Windows и MacOS

  1. Перейти на домашнюю страницу Git VCS
  2. Вы должны быть в состоянии найти кнопку загрузки для последней доступной версии Git
  3. Скачать и установить то же самое

Чтобы проверить установку, введите приведенную ниже команду в командной строке (Windows) или в терминале (Mac OS).

1
$ git --version

Вывод, как показано ниже, должен появиться, если установка прошла нормально.

Проверка версии Git

2.2 Установка Git Core в Linux

Git не предоставляет готовые установочные файлы для Linux. Следовательно, есть альтернативный способ установить его вместо. Выполните приведенную ниже команду из терминала, чтобы установить пакет git-core .

1
$ sudo apt-get install git-core

Это сделает все необходимые шаги, и как только он будет готов, выполните следующие шаги, чтобы проверить установку.

Введите приведенную ниже команду в окне терминала.

1
$ git --version

Вывод, как показано выше, должен появиться, если установка прошла нормально.

Проверка версии Git

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!");
    }
}

Как только это изменение было выполнено, запрос на извлечение показывает конфликт, как показано ниже:

Конфликт слияния в Git

Эти конфликты можно разрешить в интерактивном режиме, щелкнув Разрешить конфликты и выбрав код, который необходимо записать в файл после объединения. Такие конфликты могут быть сложными время от времени. Следовательно, рекомендуется извлекать последние изменения в файлы постепенно, чтобы избежать большого количества конфликтующего кода. Последние изменения в любой конкретной ветке можно получить с помощью команд, показанных ниже:

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 является популярной системой управления версиями, и для этого должно быть достаточно помощи.

5. Ссылки