# Git cheatsheet

**Шпаргалка для тех, кто так и не может разобраться с гитом**

#### Основные операции с Git <a href="#osnovnye-operacii-s-git" id="osnovnye-operacii-s-git"></a>

**Подключение SSH ключа к Github/Gitlab**

**ВАЖНО**: подвязать SSH под гит - делается один раз на каждой машине, после этого больше не нужно вводить логин/пароль.

**Создаем SSH ключ**

1. Открываем терминал (git bash или любой другой).
2. Выполняем команду `ssh-keygen -t rsa -b 4096 -C "your_email@example.com"`.
3. Когда спросят "_Enter a file in which to save the key_" просто нажмите `Enter`, ключ будет лежать в файле по умолчанию.
4. После этого попросят написать секретную фразу и повторить ее.

**Копируем ключ и подвязываем под гитхаб/гитлаб**

1. Выполняем команду `pbcopy < ~/.ssh/id_rsa.pub`
2. Если не сработает, пишем `cat ~/.ssh/id_rsa.pub` и копируем то что нам вернулось.
3. Ищем в настройках аккаунта на Github/Gitlab `SSH keys`, выбираем в этой вкладке `new key`, вставляем то что скопировали.
4. Сохраняем.
5. Теперь можно (и нужно) клонировать и стягивать все нужные репозитории через SSH.

**Бонус: перевод всех https репозиториев на ssh**

1. Как проверить какой репозиторий у вас? `git remote -v`.
2. Если адрес начинается на `https://`, необходимо выполнить команду `git remote set-url origin git@github.com:USERNAME/REPOSITORY.git`, где указать хост (github/gitlab), ваше имя пользователя и имя репозитория.
3. Еще раз `git remote -v` чтобы убедиться, что все сработало.

**Создание нового репозитория и закидывание туда своих файлов (если они есть)**

1. Создаем новый репозиторий в GitHub/GitLab/BitBucket.
2. В папке с проектом выполняем `git init`.
3. `git add .`
4. `git commit -m "initial commit"`
5. `git remote add origin git@git-where-you-are.com:your-name/your-awesome-git-project.git`
6. `git push -u origin master`

**Готово**

**Объединение нескольких гит комманд в одну**

Например, мы хотим сделать коммит и запушить одной командой. Для этого используется оператор последовательного выполнения команд `&&`:

`git commit -am "new commit" && git push`

**Отмена всего непотребства, которое написали и еще (к счастью) не закоммитили**

`git checkout -- .`

**Отмена последнего коммита, который случайно залили не в ту ветку**

1. В ветке, в которой вы сделали коммит, необходимо выполнить `git reset HEAD~1 --soft`.
2. Последний коммит будет отменен, все изменения вернутся в нужные файлы (не пропадут).
3. `git stash` (спрятать все изменения в хранилище гита).
4. `git checkout correct-branch`
5. `git stash apply` (возвращаем изменения в нужную ветку).
6. `git commit -am "Your commit message"`

**Отмена последнего коммита и удаление всех изменений, которые были в нем сделаны**

`git reset HEAD~1 --hard`

***

#### Работа с ветками <a href="#rabota-s-vetkami" id="rabota-s-vetkami"></a>

**ВАЖНО!** При работе в командах создавайте как минимум свои собственные ветки.

**Создание новой ветки и переход на нее**

`git checkout -b your-new-awesome-branch`

**Pull/push изменений**

`git pull/push origin your-branch`

**Слияние (merge) ветки master с вашей веткой с новыми фичами**

1. Закинуть все изменения в гит на свою ветку(`git add . && git commit -m "new-commit" && git push origin your-branch`).
2. `git checkout master`
3. `git pull`
4. `git checkout your-branch`
5. `git merge master`
6. Фиксим конфликты (консоль будет говорить в каких файлах конфликты, ищите много знаков >>>>>>>> и <<<<<<<<<), либо с помощью IDE.
7. `git commit -am "merging changes from my branch" && git push`
8. Теперь в вашей ветке есть слитые ваши изменения и последняя версия мастера, теперь нужно закинуть все это дело в мастер.
9. `git checkout master`
10. `git merge your-branch`
11. Конфликтов уже не должно быть, все должно слиться автоматически.
12. Profit

**Как переключаться с ветки на ветку локально, чтобы постоянно не возникал конфликт с git?.**

Если вы работаете в какой то ветке (имеете незакомиченные файлы), при переключении на другую ветку git попробует смерджить всю вашу текущую работу с этой другой веткой. При этом могут возникнуть конфликты, а часть работы при переключении обратно позже вообще может быть утеряна. Поэтому, если хотите переключиться на другую ветку (например чтобы проверить пулл реквест соседа), сделайте одно из следующих действий:

1. Перед переключением закомитьте все файлы. Переключайтесь только когда у вас локально нет никаких изменений.
2. Если ваш код не до конца рабочий и вы не хотите его коммитить, вы можете его временно "спрятать", используя команду `git stash`. В гите есть специальный "карман", в котором можно хранить куски кода. После выполнения этой команды все ваши изменения локально исчезнут, и будут помещены в этот карман. То есть код откатится до изначального состояния. Теперь можно смело переходить на другие ветки. Когда вы вернетесь обратно на свою ветку и захотите снова увидеть свои изменения, выполните команду `git stash apply` - это вернет последние изменения из кармана обратно в вашу ветку.
