# GIT и все, что с ним связано

## При работе с GIT возникает ошибка "fatal: LF would be replaced by CRLF"

Чтобы избежать этой ошибки на этапе обучения рекомендуется установить у GIT настройку `core.safecrlf` в один из вариантов:

```shell
git config --global core.safecrlf false # Вариант 1. Отключает режим safecrlf
git config --global core.safecrlf warn  # Вариант 2. переключает на режим выдачи предупреждения
```

Внесение одного из вариантов настройки сейчас\задним числом не помешает\не навредит вашей работе, а только упростит ее.

Если использовать настройку `true`, как в видеоуроке, могут быть ошибки при выполнении различных операций гит из-за того, что сразу не сделали правильные настройки перевода строк для гита и уже выполнили операции клонирования репозитория, коммиты, пулы и пуши.

Значение параметра в `true` заблокирует часть операций гита (коммиты, слияния, пулы из внешних репо и т.п.), в т.ч. и работу гитсинка и нужно будет отдельно разбираться с ними.

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

Правильнее всего разруливать настройки гитатрибутами (файл `.gitattrutes` в корне проекта), тогда гит сам будет расставлять правильные варианты окончаний строк в независимости от ОС.

## Как при разрешении конфликта в git после слияния веток в VSC выбрать разные решения для разных строк кода? Или это нужно делать руками?

В VSC есть встроенная возможность анализа\управления конфликтами. Нужно открыть файл с конфликтами, открыть панел команд (клавиши Ctrl+Shift+P) и набрать в поле ввода команды conflict/конфликт, затем выбрать Перейти к следующему конфликту.

Редактор переключится на очередной конфликт в файле над первой конфликтной строкой будет выбор решения по конфликту.

## В файле `git-global-init.cmd` в составе шаблона `vanessa-bootstrap` есть команды `git config --global alias.unstage 'reset HEAD --'` и `git config --global alias.last 'log -1 HEAD'`. Что они означают?

Это просто добавления алиасов (псевдонимов) команд, чтобы их можно было выполнять из ком. строки более кратким вызовом, например:

Команда `git config --global alias.unstage 'reset HEAD --'` создает алиас unstage для команды  `git reset HEAD --`.

Это значит, что вместо команды `git reset HEAD --` можно будет просто в консоли написать`git unstage`.

Сама команда помогает убрать из индекса добавленный файл.

Например, вы изменили файл `readme.txt` и добавили изменения в индекс `git add readme.txt`, а потом поняли, что сделали это ошибочно, нельзя сейчас эти изменения в коммит включать. Тогда вы выполняете `git unstage readme.txt` и файл убирается из индекса.

Второй алиас - показать последниее сообщение о коммите.


## По гиту из первого видео не понятно что делать. Показали файлики с настройками на сайте, а потом уже в командной строке что-то проверяем. А как файлик с настройкой попадает ко мне?

Их в свой гит-репозиторий помещать не нужно, их нужно один раз выполнить при настройке гита у себя локально, предварительно заменив в `git-global-init.cmd` из шаблона `vanessa-bootstrap` имя пользователя и почту на свои.

Принципиально эти команды можно и вручную выполнить, для удобства их собрали в один командный файл в составе `vanessa-bootstrap`.

Там на самом деле ДВА файла, которые нужно выполнять.

- можно их просто скачать с указанного сайта, или по [ссылке](https://github.com/vanessa-opensource/vanessa-bootstrap/blob/master/tools/git-global-init.cmd)
- предварительно заменив в `git-global-init.cmd` имя пользователя и почту на свои.
- а далее запустить.

## В видео "1.2.3 Базовые операции Git", на 43 секунде создаётся каталог "MyTestRepo" по пути "W:\repo\_artbear\". У меня нет никаких репозиториев. Где мне каталог создавать?

Это на ваш откуп, где вам удобно. В вашем каталоге проекта, например. Где вы размещаете исходники ваших проектов сейчас? Например, это может быть каталог `D:\Projects`, или `%USERPROFILE%\Projects` и т.п., а внутри уже создавайте уже папки с репозиториями.

## Гит выводит пути к файлам, содержащим кириллицу в закодированном виде. Что делать?

Вручную выполните команду `git config --global core.quotepath false`.

## В видео 1.2.8 используется приложение Git Extensions, его не было в списке рекомендованных. Что за приложение? Надо ли его использовать?

Git Extensions - это тоже самое что и SourceTree (Замечательный графический клиент Git), он есть в рекомендованных.

## Удаленный репозиторий и то, куда помещается из VS Code, это одно и тоже или разные репы?

То, с чем работает VS Code - это локальный репозиторий проекта.

GIT - распределенная система контроля версий, поэтому у каждого разработчика всегда полная копия репозитория (хранится внутри папки `.git` проекта) и он может коммитить (помещать) в нее файлы НЕ монопольно. И такой же репозиторий на удаленном сервере. Точно такой же репозиторий хранится на удаленном сервере (например, в gitlab'е). Обычно он считается основным и с ним синхронизируются все разработчики и таким образом обмениваются изменениями. (На самом деле к одной вашей рабочей копии проекта можно подключить сразу несколько таких удаленных репозиториев и со всеми ними синхронизироваться.)

Сравните с 1С:Хранилищем: у него репозиторий (хранилище конкретной конфигурации) централизованный, и для работы с модулем или каким-либо другим объектом вам нужно захватить его монопольно. Пока не отпустите, никто другой его отредактировать не сможете. Вы напрямую коммитите сразу в удаленный репозиторий.

В GIT вы коммитете себе в локальный репозиторий. Сколько угодно коммитите (команда commit).
Но потом, когда наступит момент, вы все коммиты можете поместить на удаленный сервер (в нашем случае в GitLab) - команда push. Эта команда отправляет все ваши локальные коммиты в удаленный репозиторий.

Кратко:
- коммит (commit) - это помещение в ваш локальный репозиторий
- пуш (push) - отправка из вашего локального репозитория в удаленный (pull - соответственно, получение из удаленного репозитория)


## В уроке 1.3.1 говорят "у меня файл check.bat в .gitignore". Как добавить туда файлы?

Откройте файл `.gitignore` (если не существует - создать его, это простой текстовый файл, обращаю внимание на точку в начале имени, расширение у него отсутствует).

Файл должен в каждой строке содержать имя файла или маску.
Добавьте в него имя `check.bat`.

Файлы, подходящие под маску или совпадающие с указанными в файле `.gitignore` игнорируются git'ом во время выполнения команд.


## Не понимаю как можно исправить конфликты по пункту 7 задания. Как разрешить конфликт? Вручную отредактировать файлы в VS Code, в GitLab?

Конфликты нужно вручную разрешить, например, приняв оба и затем скорректировав вручную."Разрешить конфликт" - это привести файл к состоянию, которое требуется по заданию.
В данном случае фактически это делается вручную: удаляются лишние строки, добавляются/редактируются новые.

После этого сохраняете файл, `git add . && git ci -m "Кофликт решен"` ну и пушите изменения в репозиторий. Делать это нужно в своей рабочей копии, где конфликт возник. Какой текстовый редактор использовать (VS Code или что-то еще) роли не играет.


## Подскажите как переключить гит на другую папку - по ошибке выбрал глобальный каталог `C:\tools` и в нем выполнил `git init`?

Удалите папку `.git` в корне `C:\tools` и инициализируйте репо в нужной папке заново.


## Где выполнять комадны git из урока "Блок 1.2 Git и связанные инструменты"? На хост машине (у меня виндовс) или на вирт. машине линукс, где установлен GitLab?

Вам нужно выполнить пункты 1-9 ДЗ в локальном репозитории при помощи консольной утилиты git, либо встроенного в VS Code гит-клиента, либо любого GUI-клиента для GIT (например, SourceTree) — на ваш вкус. После этого вам предстоит выполнить пункт 10:

>  10.выложить репозиторий в удаленный репозиторий на Гитлабе из ДЗ 1

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


## При выполнении команды git clone получаю ошибку "SSL certificate problem: unable get local issuer certificate". Что делать?

Попробуйте переустановить Git и на шаге "Choosing HTTPS transport backend" выберите "Use the native Windows Secure Channel library", как рекомендовано по ссылке https://github.com/desktop/desktop/issues/3684#issuecomment-586926876


## При попытке клонировать репо с GitHub в VS Code выдается запрос на ввод логина и пароля. Это правильно?

Это правильное поведение при клонировании по http, введите свои логин и пароль от гитхаба и после авторизации команда выполнится успешно (при наличии у вас прав на репозиторий, который пытаетесь клонировать).


# Подскажите по заданию исправить конфликты где часть надо оставить у источника часть взять у получателя изменений — какой—то инструмент в vs code есть по аналогии с тем же конфигуратором (когда мы на уровне процедур или строк определяем что взять и что оставить)?

Если открыть файл с конфликтами в VSCode, он автоматически вам подсветит место конфликта, отобразит оба измененных фрагмента кода и предложит выбрать какой-либо или все или отказаться от обоих.

На уровне логических конструкций (процедур/функций) — нет, не умеет.

## Каким инструментом  в рамках обучения выполнять #ДЗ для решения конфликтов объединения?

Можно любым способом, но проще использовать варианты из VSCode как в видеоуроке - быстрый переход к конфликтам, быстрая правка простых конфликтов, ручное исправление сложных конфликтов.


