|
@@ -585,7 +585,142 @@ git merge название_ветки
|
|
|
|
|
|
|
|
Выше мы разобрали консольные команды для работы с репозиторием и знать их надо, чтобы уметь работать с репозиторием, если в используемой IDE нет нужных плагинов. Но можно использовать визуальные инструменты, например __Visual Studio Code__. Про него я уже упоминал - это кросплатформенный текстовый редактор с системой плагинов, которые позволяют использовать __VSC__ как полноценную IDE для разработки. Именно его используют при разработке на __MacOS__ или __Linux__.
|
|
Выше мы разобрали консольные команды для работы с репозиторием и знать их надо, чтобы уметь работать с репозиторием, если в используемой IDE нет нужных плагинов. Но можно использовать визуальные инструменты, например __Visual Studio Code__. Про него я уже упоминал - это кросплатформенный текстовый редактор с системой плагинов, которые позволяют использовать __VSC__ как полноценную IDE для разработки. Именно его используют при разработке на __MacOS__ или __Linux__.
|
|
|
|
|
|
|
|
|
|
+## Основные варианты работы с GIT
|
|
|
|
|
|
|
|
|
|
+### Создание проекта
|
|
|
|
|
+
|
|
|
|
|
+Вы начинаете новый проект и, естественно, его репозитория ещё не существует. Последовательность действий в этом случае такая:
|
|
|
|
|
+
|
|
|
|
|
+1. создать проект средствами используемой IDE или командной строки, например, консольная задача в __Visual Studio__
|
|
|
|
|
+
|
|
|
|
|
+ Дело в том, что не все IDE умеют создавать проект в не пустом каталоге (Android Studio точно этим грешил)
|
|
|
|
|
+
|
|
|
|
|
+1. создать на сервере GIT новый __пустой__ репозиторий, то есть не надо на этом шаге в него добавлять `readme.md` и `.gitignore`
|
|
|
|
|
+
|
|
|
|
|
+1. перейти в корневой каталог проекта (для c# это каталог в котором лежит файл `*.sln`)
|
|
|
|
|
+
|
|
|
|
|
+1. инициализировать репозиторий командой `git init`
|
|
|
|
|
+
|
|
|
|
|
+1. добавить ссылку на репозиторий командой `git remote add ...`
|
|
|
|
|
+
|
|
|
|
|
+Дальше вы работаета с проектом и в итоге публикуете коммиты на сервер командой `git push ...`
|
|
|
|
|
+
|
|
|
|
|
+Ваш репозиторий на этом этапе выглядит примерно так:
|
|
|
|
|
+
|
|
|
|
|
+```mermaid
|
|
|
|
|
+---
|
|
|
|
|
+title: Ваш новый репозиторий
|
|
|
|
|
+---
|
|
|
|
|
+gitGraph
|
|
|
|
|
+ commit id: "Первый"
|
|
|
|
|
+ commit id: "Второй (HEAD)"
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Прежде чем двигаться дальше, нужно рассказать про __HEAD__ (голову) репозитория. В GIT-е __HEAD__ всегда указывает на последний коммит в ветке и добавлять новые коммиты вы можете только в __HEAD__
|
|
|
|
|
+
|
|
|
|
|
+Если в репозитории несколько веток, то и голов тоже несколько:
|
|
|
|
|
+
|
|
|
|
|
+```mermaid
|
|
|
|
|
+---
|
|
|
|
|
+title: Многоголовый репозиторий
|
|
|
|
|
+---
|
|
|
|
|
+gitGraph
|
|
|
|
|
+ commit
|
|
|
|
|
+ commit
|
|
|
|
|
+ branch dev
|
|
|
|
|
+ commit
|
|
|
|
|
+ commit
|
|
|
|
|
+ commit id: "HEAD (dev)"
|
|
|
|
|
+ checkout main
|
|
|
|
|
+ commit
|
|
|
|
|
+ commit id: "HEAD (main)"
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Клонирование проекта на новое рабочее место
|
|
|
|
|
+
|
|
|
|
|
+Допустим вы пришли с работы домой и решили продолжить работу над проектом (в первый раз) или в колледже сели за другой компьютер. В этом случае вам нужно получить свою работу на новый компютер. Для этого используем команду `git clone <url>`, которая скачает весь проект на локальный компьютер. В этом варианте пока ничего сложного.
|
|
|
|
|
+
|
|
|
|
|
+### Актуализация проекта
|
|
|
|
|
+
|
|
|
|
|
+Вы вернулись на работу и теперь вам необходимо скачать все те доработки, которые вы делали дома.
|
|
|
|
|
+
|
|
|
|
|
+Клонировать снова весь репозиторий можно, но не нужно. Дело в том, что в локальном каталоге могут быть файлы, которые не отслеживаются GIT-ом (например, бинарные или временные файлы).
|
|
|
|
|
+
|
|
|
|
|
+В этом случае используют команду `git pull`, которая скачивает коммиты, которых у вас еще нет и приводит проект в актуальное состояние.
|
|
|
|
|
+
|
|
|
|
|
+### Работа в команде
|
|
|
|
|
+
|
|
|
|
|
+Ситуация следующая: вы скачали актуальную версию, сделали какую-то работу и хотите опубликовать доработки. Но пока вы делали свою работу ваш коллега успел залить свои изменения:
|
|
|
|
|
+
|
|
|
|
|
+```mermaid
|
|
|
|
|
+---
|
|
|
|
|
+title: Конфликт при работе в команде
|
|
|
|
|
+---
|
|
|
|
|
+gitGraph
|
|
|
|
|
+ commit id: "Первый"
|
|
|
|
|
+ branch "Ваш локальный репозиторий"
|
|
|
|
|
+ commit id: "Ваш HEAD"
|
|
|
|
|
+ checkout main
|
|
|
|
|
+ commit id: "Коллега"
|
|
|
|
|
+ checkout "Ваш локальный репозиторий"
|
|
|
|
|
+ merge main
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+При попытке залить изменения GIT выдаст ошибку, что вы публикуете данные не в HEAD (ваш локальный репозиторий пока не знает о наличии коммита "Коллега" и пытается дописать в "Первый")
|
|
|
|
|
+
|
|
|
|
|
+В этом случае вы должны скачать новые коммиты командой `git pull` и слить со своей локальной головой командой `git merge`
|
|
|
|
|
+
|
|
|
|
|
+```mermaid
|
|
|
|
|
+---
|
|
|
|
|
+title: Конфликт при работе в команде
|
|
|
|
|
+---
|
|
|
|
|
+gitGraph
|
|
|
|
|
+ commit id: "Первый"
|
|
|
|
|
+ branch "Ваш локальный репозиторий"
|
|
|
|
|
+ commit id: "Ваш HEAD"
|
|
|
|
|
+ checkout main
|
|
|
|
|
+ commit id: "Коллега"
|
|
|
|
|
+ checkout "Ваш локальный репозиторий"
|
|
|
|
|
+ merge main
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+После этого можно заливать полученный коммит на сервер
|
|
|
|
|
+
|
|
|
|
|
+```mermaid
|
|
|
|
|
+---
|
|
|
|
|
+title: Конфликт при работе в команде
|
|
|
|
|
+---
|
|
|
|
|
+gitGraph
|
|
|
|
|
+ commit id: "Первый"
|
|
|
|
|
+ branch "Ваш локальный репозиторий"
|
|
|
|
|
+ commit id: "Ваш HEAD"
|
|
|
|
|
+ checkout main
|
|
|
|
|
+ commit id: "Коллега"
|
|
|
|
|
+ checkout "Ваш локальный репозиторий"
|
|
|
|
|
+ merge main
|
|
|
|
|
+ checkout main
|
|
|
|
|
+ merge "Ваш локальный репозиторий"
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Использование "кармана"
|
|
|
|
|
+
|
|
|
|
|
+Иногда случается, что вы забыли переключиться на нужную ветку или скачать обновления с сервера и успели внести несколько правок но еще не создали коммит. Или вам срочно нужно переключиться на другую ветку и исправить критические баги.
|
|
|
|
|
+
|
|
|
|
|
+>Делать в таких случаях коммит не рекомендуется, дело в том, что в коммите обычно публикуется работающий код, то есть вы полностью дописали какую-то фичу и только потом делаете коммит.
|
|
|
|
|
+
|
|
|
|
|
+Новые изменения еще не готовы к тому, чтобы их коммитить и добавлять в репозиторий, — при этом терять их нельзя. В таком случае, как и во многих других, полезной окажется команда `git stash`.
|
|
|
|
|
+
|
|
|
|
|
+__Git stash__ перемещает текущие изменения (так называемые local changes) в локальную директорию, которая выполняет роль специального хранилища, то есть скрывает эти изменения, сохраняя их отдельно, с опцией вернуть позже, когда это понадобится. Таким образом, файлы рабочей копии возвращаются к своему исходному состоянию (к HEAD). Внесенные изменения помещаются в стек, после чего их можно легко оттуда извлечь. Важно отметить, что в рабочей копии исчезнут все измененные файлы, — независимо от того, добавлены они в индекс или нет.
|
|
|
|
|
+
|
|
|
|
|
+После выполнения этой команды все несохраненные изменения будут сохранены, но не закоммичены. Эти отложенные участки будут сохранены в локальном репозитории и при выполнении команды `git push` не будут переданы на сервер.
|
|
|
|
|
+
|
|
|
|
|
+Итак, вы спрятали свои изменения, (возможно переключились на другую ветку) и пофиксили баг. Теперь вам нужно вернуть отложенные изменения. Для этого используется команда `git stash pop` - она восстанавливает спрятанные изменения и удаляет "карман". Если же вам необходимо применить спрятанные изменения к нескольким веткам, то можно использовать команду `git stash apply`, в этом случае "карман" не очищается. Если вдруг забыли, что для последней ветки нужно выполнить `git stash pop` для очистки "кармана", то можно просто очистить "карман" командой `git stash drop`.
|
|
|
|
|
+
|
|
|
|
|
+GIT поддерживает несколько карманов, подробнее можно почитать в документации, но удобнее работать с карманами в __VSCode__ используя плагины. Например, я использую плагин __Git Graph__
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
|
|
|
Предыдущая лекция | | Следующая лекция
|
|
Предыдущая лекция | | Следующая лекция
|
|
|
:----------------:|:----------:|:----------------:
|
|
:----------------:|:----------:|:----------------:
|