В данной статье будут рассмотрены примеры работы с Git часто используемые на практике.
Перед началом работы с git необходимо настроить информацию об авторе, в противном случае git не позволит делать коммиты. Используем своё имя, фамилию и адрес электронной почты.
git config --global user.name "Ivan Ivanov"
git config --global user.email ivaninvanov@gmail.com
Информация будет записана в файл .gitconfig
в домашней директории пользователя.
После этого можем создать директорию с проектом git, перейти в неё и выполнить следующую команду, чтобы инициализировать пустой репозиторий.
git init
После этого будет создана скрытая директория .git
.
echo "My first line in project" > file.txt
git status
.На ветке master
Начальный коммит
Неотслеживаемые файлы:
(используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
file.txt
ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)
Файл file.txt
отмечен, как untracked, так как файл не проиндексирован в репозитории.
git add file.txt
git status
.На ветке master
Начальный коммит
Изменения, которые будут включены в коммит:
(используйте «git rm --cached <файл>…», чтобы убрать из индекса)
новый файл: file.txt
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
git commit -m "My first commit"
git log
.commit 5f8bbeb54191e8ae625e808596b7ec3e72f0a1d3
Author: rmntrvn <urometh3@gmail.com>
Date: Wed May 27 15:47:14 2020 +0400
My first commit
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
echo "London is the capital of GB" >> file.txt
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
пуст, потому что в историю изменений не добавлена новая информация о произведеленных изменений.
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. Необходимо исправить последний коммит, не добавляя новый и в сообщении коммита указать, что добавлена не одна столица, а две.
echo "Moscow is the capital of Russia" >> file.txt
git add file.txt
git commit --amend
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
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
echo "Paris is the capital of France" >> file.txt
git add .
git commit -m "Another capital was added"
$ 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
git log
.git revert <hash_commit>
, чтобы отменить коммит. Используем первые символы своего хэша (рекомендуется указывать первые 7 символов). Также можно воспользоваться HEAD~1
.$ git revert 8befd7923e110af090d8a3aa6e21e276705216f3
error: не удалось обратить изменения коммита 8befd79… Capitals added
подсказка: после разрешения конфликтов, пометьте исправленные пути
подсказка: с помощью «git add <пути>» или «git rm <пути>»
подсказка: и сделайте коммит с помощью «git commit»
Как видно, произошел конфликт.
git status
.$ git status
На ветке master
Вы сейчас обращаете изменения коммита 8befd79.
(разрешите конфликты, затем запустите «git revert --continue»)
(используйте «git revert --abort», чтобы отменить операцию обращения изменений коммита)
Не слитые пути:
(используйте «git reset HEAD <файл>…», чтобы убрать из индекса)
(используйте «git add <файл>…», чтобы пометить разрешение конфликта)
оба изменены: file.txt
нет изменений добавленных для коммита
(используйте «git add» и/или «git commit -a»)
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 помечает специальными маркерами строки, в которых произошел конфликт.
$ 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
My first line in project
Paris is the capital of France
git add file.txt
git revert --continue
$ 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
$ 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 строки.
echo "this is a garbage file" | tee garbage1.tmp garbage2.tmp
$ git status
На ветке master
Неотслеживаемые файлы:
(используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
garbage1.tmp
garbage2.tmp
ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)
echo "*.tmp" >> .gitignore
$ git status
На ветке master
Неотслеживаемые файлы:
(используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)
.gitignore
ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)
git add .gitignore
git commit -m "added .gitignore"
Создать новую ветку.
git checout -b <имя_ветки>
Переключиться на другую ветку.
git checout <имя_ветки>
Слияние ветки hotfix в ветку master.
git checkout master
git merge hotfix
Пуш в ветку hotfix
git push --set-upstream origin hotfix