# git

- [git](#git)
  - [Отображение статуса репозитория в приглашении](#отображение-статуса-репозитория-в-приглашении)
  - [Аутентификация на GitHub с помощью SSH-ключа](#аутентификация-на-github-с-помощью-ssh-ключа)
  - [Добавление SSH-ключа на GitHub](#добавление-ssh-ключа-на-github)
  - [Работа с удаленным репозиторием](#работа-с-удаленным-репозиторием)
  - [Указание конкретного ключа для репозитория](#указание-конкретного-ключа-для-репозитория)
  - [Синхронизация своей ветки с изменениями master](#синхронизация-своей-ветки-с-изменениями-master)
    - [Полная последовательность для Rebase:](#полная-последовательность-для-rebase)

## Отображение статуса репозитория в приглашении

Это дополнительный функционал, который не требуется для работы с Git, но очень помогает в этом. При работе с Git очень удобно, когда можно сразу определить, находитесь вы в обычном каталоге или в репозитории Git. Кроме того, было бы хорошо понимать статус текущего репозитория. Для этого нужно установить специальную утилиту, которая будет показывать статус репозитория. Для установки утилиты надо скопировать её репозиторий в домашний каталог пользователя, под которым вы работаете:

```shell
    cd ~
    git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
```

А затем добавить в конец файла .bashrc такие строки:

```shell
    GIT_PROMPT_ONLY_IN_REPO=1
    source ~/.bash-git-prompt/gitprompt.sh
```

Для того, чтобы изменения применились, перезапустить bash:

```shell
    exec bash
```

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

[вверх](#git)

***

## Аутентификация на GitHub с помощью SSH-ключа

Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):

```shell
    ssh-keygen -t rsa -b 4096 -C "github_email@gmail.com"
```

На всех вопросах достаточно нажать Enter (более безопасно использовать ключ с passphrase, но можно и без, если нажать Enter при вопросе, тогда passphrase не будет запрашиваться у вас постоянно при операциях с репозиторием).
Запуск SSH-агента (пропускаем на Windows):

```shell
    eval "$(ssh-agent -s)"
```

Добавить ключ в SSH-агент (пропускаем на Windows):

```shell
    ssh-add ~/.ssh/id_rsa
```

[вверх](#git)

***

## Добавление SSH-ключа на GitHub

Для добавления ключа надо его скопировать.
Например, таким образом можно отобразить ключ для копирования:

```shell
    cat ~/.ssh/id_rsa.pub
```

После копирования надо перейти на GitHub. Находясь на любой странице GitHub, в правом верхнем углу нажмите на картинку вашего профиля и в выпадающем списке выберите «Settings». В списке слева надо выбрать поле «SSH and GPG keys». После этого надо нажать «New SSH key» и в поле «Title» написать название ключа (например «Home»), а в поле «Key» вставить содержимое, которое было скопировано из файла ~/.ssh/id_rsa.pub
Чтобы проверить, всё ли прошло успешно, попробуйте выполнить команду:

```shell
    ssh -T git@github.com
```

Вывод должен быть таким:

```shell
    $ ssh -T git@github.com
    Hi username! You've successfully authenticated, but GitHub does not provide shell access.
```

[вверх](#git)

***

## Работа с удаленным репозиторием

Клонируем удаленный репозиторий в локальную папку

```shell
    git clone ssh://git@github.com/pyneng/online-2-natasha-samoylenko.git
```

После внесения измений в локальные файлы проверяем состояние локального репозитория

```shell
    git status
```

Необходимо добавить файлы в отслеживаемые

```shell
    git add <имя файла>
```

Создадим коммит

```shell
    git commit -m "описание изменений"
```

Синхронизируем локальный и удаленный репозитории

```shell
    git push
```

[вверх](#git)

***

## Указание конкретного ключа для репозитория

1. Клонировать репозиторий с указанием необходимого ключа

```shell
git clone -c core.sshCommand="/usr/bin/ssh -i /home/da2001/.ssh/sape_a.dolgiy" ssh://git@gitlab.sapient.ru:7999/devops/salt.git
```

2. Указать в настройках локального репозитория необходимый ключ

```shell
git config --local core.sshCommand "/usr/bin/ssh -i /home/da2001/.ssh/sape_a.dolgiy"
```

[вверх](#git)

***

## Синхронизация своей ветки с изменениями master

### Полная последовательность для Rebase:

```shell
# 1. Переключиться на основную ветку
git switch master

# 2. Обновить локальную основную ветку с удаленного репозитория
git pull origin master

# 3. Вернуться на свою рабочую ветку
git switch your_branch

# 4. Перебазировать ваши коммиты на актуальный master
git rebase master
```

При возникновении конфликтов

```shell
# Во время rebase Git сообщит о конфликтах
# 1. Редактируете файлы, устраняете конфликты
# 2. Добавляете исправленные файлы:
git add <исправленные-файлы>

# 3. Продолжаете rebase:
git rebase --continue

# Или отменяете rebase если что-то пошло не так:
git rebase --abort
```

[вверх](#git)

***