# Шпаргалка по Git

Быстрый доступ к основным командам git.

## Получение изменений

Предположим, что Джон и вы (или несколько человек) работаете над одной веткой.

1. **[СИТУАЦИЯ 1]** У вас есть некоторые изменения, и Джон делает push. Теперь ваш локальный git на один коммит позади, т.е. `↓ 1`
   1. Попробуйте `git pull`, чтобы синхронизировать вашу текущую ветку. Если успешно, вы закончили!
   2. Если вы получите `Fatal: Not possible to fast-forward, aborting`, переходите к СИТУАЦИИ 2.
2. **[СИТУАЦИЯ 2]** Предположим, у вас уже есть несколько коммитов, и Джон делает push. Теперь ваш локальный репозиторий выглядит как `↓ 1 ↑ 3`
   1. Используйте `git pull --rebase`. Подумайте об этом как о том, чтобы отложить ваши изменения, получить все изменения, отправленные с удаленного репозитория, а затем вернуть ваши изменения поверх этого. Это может вызвать конфликты слияния, если Джон изменил файлы, которые вы также изменили.
   2. Если вы снова столкнетесь с `Fatal: Not possible to fast-forward, aborting`, возможно, у вас есть незавершенные изменения, которые вы не закоммитили. Попробуйте `git stash`, чтобы сохранить ваши изменения, затем `git pull --rebase`, чтобы получить коммит Джона, и `git stash pop`, чтобы вернуть ваши изменения.

---

## Отмена коммитов

Мы будем называть ошибочные коммиты теми коммитами, которые вы хотите отменить.

1. **[СИТУАЦИЯ 1]** Вы еще не отправили свои ошибочные коммиты в удаленный репозиторий.
   1. Отменить последний коммит: `git reset HEAD~`
   2. Отменить последние n коммитов: `git reset HEAD~n`, т.е. `git reset HEAD~4`
2. **[СИТУАЦИЯ 2]** Вы отправили свои ошибочные коммиты, ваши ошибочные коммиты находятся поверх всех остальных коммитов, и вы хотите удалить свои ошибочные коммиты из истории.
   1. `git reset HEAD~` ИЛИ `git reset HEAD~n`, а затем `git push --force`
   2. Убедитесь, что вы находитесь на правильной ветке, и ваша локальная ветка и удаленная ветка синхронизированы.

---

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

Вы пишете ветку с новой функцией или исправлением, и теперь в основной ветке есть изменения, которых нет в вашей ветке. Продолжайте к следующему шагу, если текущий шаг не удался или слишком сложен.

1. **[Шаг 1]** Попытайтесь сделать rebase изменений из основной ветки в вашу ветку с функцией.

```bash
git checkout feature      # переключает вас на ветку feature
git fetch origin          # обновляет вас с удаленного репозитория
git pull --rebase main    # помещает ваши изменения поверх изменений основной ветки
```

2. **[Шаг 2]** Просто выполните squash merge изменений в вашу ветку.

```bash
git checkout feature      # переключает вас на ветку feature
git fetch origin          # обновляет вас с удаленного репозитория
git merge origin/main
```