Получение изменений #
Предположим, что Джон и вы (или несколько человек) работаете над одной веткой.
- [СИТУАЦИЯ 1] У вас есть некоторые изменения, и Джон делает push. Теперь ваш локальный git на один коммит позади, т.е.
↓ 1- Попробуйте
git pull, чтобы синхронизировать вашу текущую ветку. Если успешно, вы закончили! - Если вы получите
Fatal: Not possible to fast-forward, aborting, переходите к СИТУАЦИИ 2.
- Попробуйте
- [СИТУАЦИЯ 2] Предположим, у вас уже есть несколько коммитов, и Джон делает push. Теперь ваш локальный репозиторий выглядит как
↓ 1 ↑ 3- Используйте
git pull --rebase. Подумайте об этом как о том, чтобы отложить ваши изменения, получить все изменения, отправленные с удаленного репозитория, а затем вернуть ваши изменения поверх этого. Это может вызвать конфликты слияния, если Джон изменил файлы, которые вы также изменили. - Если вы снова столкнетесь с
Fatal: Not possible to fast-forward, aborting, возможно, у вас есть незавершенные изменения, которые вы не закоммитили. Попробуйтеgit stash, чтобы сохранить ваши изменения, затемgit pull --rebase, чтобы получить коммит Джона, иgit stash pop, чтобы вернуть ваши изменения.
- Используйте
Отмена коммитов #
Мы будем называть ошибочные коммиты теми коммитами, которые вы хотите отменить.
- [СИТУАЦИЯ 1] Вы еще не отправили свои ошибочные коммиты в удаленный репозиторий.
- Отменить последний коммит:
git reset HEAD~ - Отменить последние n коммитов:
git reset HEAD~n, т.е.git reset HEAD~4
- Отменить последний коммит:
- [СИТУАЦИЯ 2] Вы отправили свои ошибочные коммиты, ваши ошибочные коммиты находятся поверх всех остальных коммитов, и вы хотите удалить свои ошибочные коммиты из истории.
git reset HEAD~ИЛИgit reset HEAD~n, а затемgit push --force- Убедитесь, что вы находитесь на правильной ветке, и ваша локальная ветка и удаленная ветка синхронизированы.
Синхронизация вашей ветки #
Вы пишете ветку с новой функцией или исправлением, и теперь в основной ветке есть изменения, которых нет в вашей ветке. Продолжайте к следующему шагу, если текущий шаг не удался или слишком сложен.
- [Шаг 1] Попытайтесь сделать rebase изменений из основной ветки в вашу ветку с функцией.
bash
git checkout feature # переключает вас на ветку feature git fetch origin # обновляет вас с удаленного репозитория git pull --rebase main # помещает ваши изменения поверх изменений основной ветки
- [Шаг 2] Просто выполните squash merge изменений в вашу ветку.
bash
git checkout feature # переключает вас на ветку feature git fetch origin # обновляет вас с удаленного репозитория git merge origin/main