Назад

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

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

  • git
  • rebase

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

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

  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 изменений из основной ветки в вашу ветку с функцией.
git checkout feature      # переключает вас на ветку feature
git fetch origin          # обновляет вас с удаленного репозитория
git pull --rebase main    # помещает ваши изменения поверх изменений основной ветки
  1. [Шаг 2] Просто выполните squash merge изменений в вашу ветку.
git checkout feature      # переключает вас на ветку feature
git fetch origin          # обновляет вас с удаленного репозитория
git merge origin/main