Евгений Колесников преди 2 дни
родител
ревизия
efd9e19f98
променени са 3 файла, в които са добавени 135 реда и са изтрити 0 реда
  1. BIN
      articles/skv/image-1.png
  2. BIN
      articles/skv/image.png
  3. 135 0
      articles/skv/readme.md

BIN
articles/skv/image-1.png


BIN
articles/skv/image.png


+ 135 - 0
articles/skv/readme.md

@@ -585,7 +585,142 @@ git merge название_ветки
 
 Выше мы разобрали консольные команды для работы с репозиторием и знать их надо, чтобы уметь работать с репозиторием, если в используемой 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__
+
+![создание кармана](./image.png)
+
+![восстановление из кармана](./image-1.png)
 
 Предыдущая лекция | &nbsp; | Следующая лекция
 :----------------:|:----------:|:----------------: