Git in a NutShell

В данной статье будут рассмотрены примеры работы с Git часто используемые на практике.


Настройка git на локальной машине

Перед началом работы с git необходимо настроить информацию об авторе, в противном случае git не позволит делать коммиты. Используем своё имя, фамилию и адрес электронной почты.

git config --global user.name "Ivan Ivanov"
git config --global user.email ivaninvanov@gmail.com

Информация будет записана в файл .gitconfig в домашней директории пользователя. После этого можем создать директорию с проектом git, перейти в неё и выполнить следующую команду, чтобы инициализировать пустой репозиторий.

git init

После этого будет создана скрытая директория .git.


Работа с git

Отслеживание истории

  1. Cоздаем текстовый файл:
echo "My first line in project" > file.txt
  1. Выполним git status.
На ветке master

Начальный коммит

Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

	file.txt

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)

Файл file.txt отмечен, как untracked, так как файл не проиндексирован в репозитории.

  1. Добавляем файл в индекс:
git add file.txt
  1. Снова выполним git status.
На ветке master

Начальный коммит

Изменения, которые будут включены в коммит:
  (используйте «git rm --cached <файл>…», чтобы убрать из индекса)

	новый файл:    file.txt
  1. Cмотрим проиндексированные изменения следующей командой:
git diff --cached

Результат:

diff --git a/file.txt b/file.txt
new file mode 100644
index 0000000..ee2ae0c
--- /dev/null
+++ b/file.txt
@@ -0,0 +1 @@
+My first line in project

Сохранение изменений в истории

  1. Создадим коммит.
git commit -m "My first commit"
  1. Проверим коммит в логе командой git log.
commit 5f8bbeb54191e8ae625e808596b7ec3e72f0a1d3
Author: rmntrvn <urometh3@gmail.com>
Date:   Wed May 27 15:47:14 2020 +0400

    My first commit
  1. Посмотрим информацию о последнем коммите командой git show.
commit 5f8bbeb54191e8ae625e808596b7ec3e72f0a1d3
Author: rmntrvn <urometh3@gmail.com>
Date:   Wed May 27 15:47:14 2020 +0400

    My first commit

diff --git a/file.txt b/file.txt
new file mode 100644
index 0000000..ee2ae0c
--- /dev/null
+++ b/file.txt
@@ -0,0 +1 @@
+My first line in project
  1. Добавим строку в существующий файл.
echo "London is the capital of GB" >> file.txt
  1. Посмотрим непроиндексированные изменения командой git diff.
diff --git a/file.txt b/file.txt
index ee2ae0c..f90d253 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@
 My first line in project
+London is the capital of GB

Сравним вывод команды git diff и git diff --cached. Вывод git diff --cached пуст, потому что в историю изменений не добавлена новая информация о произведеленных изменений.

  1. Создадим коммит изменений git commit -am "Capital added" и проверим, что коммит был создан командой git log.
commit 9a571f753450034dd8a153b89bb5489efa3f06b0
Author: rmntrvn <urometh3@gmail.com>
Date:   Wed May 27 16:01:02 2020 +0400

    Capital added

commit 5f8bbeb54191e8ae625e808596b7ec3e72f0a1d3
Author: rmntrvn <urometh3@gmail.com>
Date:   Wed May 27 15:47:14 2020 +0400

    My first commit

Исправление предыдущего коммита

В последнем коммите мы зафиксировали добавление строки London is the capital of GB в файл file.txt, но забыли добавить Moscow is the capital of Russia. Необходимо исправить последний коммит, не добавляя новый и в сообщении коммита указать, что добавлена не одна столица, а две.

  1. Добавим новую строку в файл.
echo "Moscow is the capital of Russia" >> file.txt
  1. Добавим изменения в stage.
git add file.txt
  1. Добавим обновленный stage и изменим сообщение.
git commit --amend
  1. В текстовом редакторе изменим сообщение коммита на Capitals added и проверим, что коммита 2 и обновленное сообщение командой git log.
commit 123e5a218c453e3b7be19ef0f9e0d0933b16dfed
Author: rmntrvn <urometh3@gmail.com>
Date:   Wed May 27 16:01:02 2020 +0400

    Capitals added

commit 5f8bbeb54191e8ae625e808596b7ec3e72f0a1d3
Author: rmntrvn <urometh3@gmail.com>
Date:   Wed May 27 15:47:14 2020 +0400

    My first commit
  1. Проверим изменения в последнем коммите командой git show.
commit 123e5a218c453e3b7be19ef0f9e0d0933b16dfed
Author: rmntrvn <urometh3@gmail.com>
Date:   Wed May 27 16:01:02 2020 +0400

    Capitals added

diff --git a/file.txt b/file.txt
index ee2ae0c..5bc1d52 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,3 @@
 My first line in project
+London is the capital of GB
+Moscow is the capital of Russia

Отмена коммита

  1. Добавим в конец файла file.txt строку Paris is the capital of France и зафиксируем эти изменения, сделав коммит. В сообщении коммита укажем Another capital was added.
echo "Paris is the capital of France" >> file.txt
git add .
git commit -m "Another capital was added"
  1. Проверим созданный коммит.
$ git log
commit 955798f35763095a5d9653a524a4f58756e6b4f5 (HEAD -> master)
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:57:11 2020 +0400

    Another capital was added

commit 8befd7923e110af090d8a3aa6e21e276705216f3
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:45:08 2020 +0400

    Capitals added

commit 8def242cd0049e907839971076fcca38646fccaf
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:44:37 2020 +0400

    My first commit
$ git show
commit 955798f35763095a5d9653a524a4f58756e6b4f5 (HEAD -> master)
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:57:11 2020 +0400

    Another capital was added

diff --git a/file.txt b/file.txt
index 5bc1d52..ed34dff 100644
--- a/file.txt
+++ b/file.txt
@@ -1,3 +1,4 @@
 My first line in project
 London is the capital of GB
 Moscow is the capital of Russia
+Paris is the capital of France
  1. Отменим второй коммит:
  • Найдем хэш второго коммита из git log.
  • Используем комманду git revert <hash_commit>, чтобы отменить коммит. Используем первые символы своего хэша (рекомендуется указывать первые 7 символов). Также можно воспользоваться HEAD~1.
$ git revert 8befd7923e110af090d8a3aa6e21e276705216f3
error: не удалось обратить изменения коммита 8befd79… Capitals added
подсказка: после разрешения конфликтов, пометьте исправленные пути
подсказка: с помощью «git add <пути>» или «git rm <пути>»
подсказка: и сделайте коммит с помощью «git commit»

Как видно, произошел конфликт.

Решение конфликта

  1. Смотрим где произошел конфликт командой git status.
$ git status
На ветке master
Вы сейчас обращаете изменения коммита 8befd79.
  (разрешите конфликты, затем запустите «git revert --continue»)
  (используйте «git revert --abort», чтобы отменить операцию обращения изменений коммита)

Не слитые пути:
  (используйте «git reset HEAD <файл>…», чтобы убрать из индекса)
  (используйте «git add <файл>…», чтобы пометить разрешение конфликта)

	оба изменены:   file.txt

нет изменений добавленных для коммита
(используйте «git add» и/или «git commit -a»)
  1. Смотрим конфликтующие строки в файле командой cat file.txt.
$ cat file.txt 
My first line in project
<<<<<<< HEAD
London is the capital of GB
Moscow is the capital of Russia
Paris is the capital of France
=======
>>>>>>> parent of 8befd79... Capitals added

Git помечает специальными маркерами строки, в которых произошел конфликт.

  1. Смотрим, какие строки нужно удалить при решении конфликта, чтобы отменить изменения второго коммита.
$ git show HEAD~1
commit 8befd7923e110af090d8a3aa6e21e276705216f3
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:45:08 2020 +0400

    Capitals added

diff --git a/file.txt b/file.txt
index ee2ae0c..5bc1d52 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,3 @@
 My first line in project
+London is the capital of GB
+Moscow is the capital of Russia
  1. Для решения конфликта необходимо удалить строки, которые были добавлены во втором коммите - London is the capital of GB и Moscow is the capital of Russia, а также удалить маркеры Git в файле. Файл должен быть приведен к следующему виду:
My first line in project
Paris is the capital of France
  1. Сообщим Git, что конфлит решен, добавив файл в stage следующей командой:
git add file.txt
  1. Продолжим процесс отмены коммита:
git revert --continue
  1. Проверим, что создался новый коммит.
$ git log
commit 2867e48d5dcbd5c899ec33bd6d93b344fb57a4be (HEAD -> master)
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 10:24:33 2020 +0400

    Revert "Capitals added"
    
    This reverts commit 8befd7923e110af090d8a3aa6e21e276705216f3.

commit 955798f35763095a5d9653a524a4f58756e6b4f5
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:57:11 2020 +0400

    Another capital was added

commit 8befd7923e110af090d8a3aa6e21e276705216f3
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:45:08 2020 +0400

    Capitals added

commit 8def242cd0049e907839971076fcca38646fccaf
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 09:44:37 2020 +0400

    My first commit
  1. Проверим, что поменялось в последнем коммите.
$ git show
commit 2867e48d5dcbd5c899ec33bd6d93b344fb57a4be (HEAD -> master)
Author: Roman <urometh3@gmail.com>
Date:   Sat Jun 20 10:24:33 2020 +0400

    Revert "Capitals added"
    
    This reverts commit 8befd7923e110af090d8a3aa6e21e276705216f3.

diff --git a/file.txt b/file.txt
index ed34dff..2994147 100644
--- a/file.txt
+++ b/file.txt
@@ -1,4 +1,2 @@
 My first line in project
-London is the capital of GB
-Moscow is the capital of Russia
 Paris is the capital of France

Конфликт был распространен на 3 строки в файле, так как в последнем коммите в файле существовало 3 строки.

Работа с .gitignore

  1. Создадим 2 файла с одинаковым расширением.
echo "this is a garbage file" | tee garbage1.tmp garbage2.tmp
  1. Проверим, что Git видит 2 новых файла.
$ git status
На ветке master
Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

	garbage1.tmp
	garbage2.tmp

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)
  1. Создадим файл .gitignore и укажем в нем, чтобы Git игнорировал все файлы с расширением .tmp, так как мы не ходим их отслеживать.
echo "*.tmp" >> .gitignore
  1. Проверим, что теперь Git не видит файла с расширением .tmp.
$ git status
На ветке master
Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

	.gitignore

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)
  1. Закоммитим файл .gitignore.
git add .gitignore
git commit -m "added .gitignore"

Git in a NutShell

Создать новую ветку.

git checout -b <имя_ветки>

Переключиться на другую ветку.

git checout <имя_ветки>

Слияние ветки hotfix в ветку master.

git checkout master
git merge hotfix

Пуш в ветку hotfix

git push --set-upstream origin hotfix
Сведения о статье:
Дата публикации: 12/12/2019 10:37PM
Последнее обновление: 10/08/2020 3:51PM (rmntrvn)
Поделиться статьей: 
Автор: rmntrvn
Постоянная ссылка: http://kb.rmntrvn.ru/kb/git-in-a-nutshell
git | checkout | github | gitlab | clone | push | merge |