Если операция Git rebase остановилась во время работы на Mac, сначала проверьте, продолжается ли она, с помощью git status. Чтобы возобновить процесс, разрешите каждый конфликт, добавьте в индекс (stage) только разрешенные файлы и выполните git rebase --continue. Чтобы вернуться к состоянию ветки до начала rebase, выполните git rebase --abort. Эти действия приводят к разным результатам, поэтому перед вводом команды убедитесь, какой именно исход вам нужен.

1. Снова откройте репозиторий и проверьте его состояние

Откройте «Терминал» через Spotlight или перейдя в папку Finder «Программы» > «Утилиты». В Терминале перейдите в корневую директорию репозитория, а затем проверьте его состояние:

cd '/path/to/your/repository'
git status

Замените пример пути на путь к вашему репозиторию. Если в пути содержатся пробелы или метасимволы командной оболочки, заключите его в одинарные кавычки, как показано в примере. Оболочкой по умолчанию в Терминале является zsh, хотя администратор или ваши настройки могут задавать другую оболочку. Руководство Apple по Терминалу

Если Git сообщает, что rebase выполняется, найдите в выводе команды пути к конфликтующим файлам и текущий шаг. Если же активный rebase не отображается, не запускайте --continue или --abort вслепую; изучите статус и недавнюю историю, прежде чем делать выводы о произошедшем. git status сообщает об изменениях в рабочей копии и индексе, включая неотслеживаемые файлы, поэтому прочитайте его вывод целиком, а не предполагайте, что каждый файл относится к rebase. Документация Git по git status

2. Возобновите процесс, аккуратно разрешив конфликты

Откройте каждый конфликтующий файл в редакторе. Git помечает текстовые конфликты блоками с маркерами вроде <<<<<<<, ======= и >>>>>>>. Решите, каким должно быть окончательное содержимое, отредактируйте файл и удалите маркеры конфликта. Не принимайте автоматически одну из сторон, если это не соответствует задуманному коду или тексту. Руководство по Git rebase описывает последовательность разрешения конфликтов: отредактировать файлы, проиндексировать разрешенные изменения, а затем продолжить. Документация Git по git rebase

Вернитесь в Терминал и просмотрите соответствующие изменения перед индексацией. Например:

git diff

Добавьте каждый разрешенный путь по имени в индекс, используя точный путь из вывода git status:

git add 'path/to/resolved-file'
git status
git rebase --continue

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

Используйте git rebase --skip только тогда, когда вы целенаправленно хотите пропустить применяемый в данный момент коммит. Эта команда просто переходит к следующему патчу; это не альтернативный способ возобновить применение того же коммита. Если вы не уверены, приведет ли пропуск к потере нужной работы, не используйте его. Параметры Git git rebase

3. Отмените операцию, если хотите откатить rebase

Если вы хотите прервать операцию и вернуться к исходному состоянию ветки, выполните:

git rebase --abort
git status

Согласно документации Git, --abort сбрасывает HEAD на исходную позицию ветки (или на указанную ветку, если она задавалась при запуске rebase). Затем проверьте статус и убедитесь, что результат соответствует ожиданиям. Документация Git по git rebase

Не путайте --abort с --quit. Команда git rebase --quit завершает операцию rebase, но оставляет HEAD, индекс и рабочее дерево в том состоянии, в котором они находятся прямо сейчас. Выбирайте этот вариант только в том случае, если вам необходимо остановить rebase, сохранив текущее незавершенное состояние; он не восстанавливает позицию ветки до начала rebase. Если при запуске rebase использовался флаг --autostash, Git сохранит этот временный stash при выходе через quit. Параметры Git git rebase

4. Если Терминал закрылся или состояние неясно

Сам по себе факт закрытия окна Терминала не говорит о том, завершил ли Git rebase. Снова откройте репозиторий и выполните git status; продолжайте действия исходя из полученного состояния. Не запускайте исходную команду git rebase повторно, пока идет активный rebase.

Если прерывание оставило репозиторий в состоянии, когда Git больше не распознает активный rebase, избегайте ручного удаления файлов состояния .git или использования reset --hard наугад. В документации Git отмечается, что несвоевременный сбой при использовании бэкенда apply может оставить rebase в таком состоянии, из которого последующий --abort не сможет корректно выполниться. Сначала сохраните всю важную незакоммиченную работу, затем изучите вывод git status и git reflog, чтобы понять недавние перемещения ветки. Журнал reflog фиксирует недавние локальные обновления вершин веток; он может помочь определить предыдущий коммит, однако восстанавливать его следует осознанно. Заметки Git о прерываемости rebase, Документация Git по git reflog

В обычном случае прерванного конфликта безопасное решение простое: разрешите и проиндексируйте необходимые изменения перед запуском --continue, либо используйте --abort, если хотите отменить rebase и вернуться к начальной точке. После любого из этих действий повторно проверьте git status, чтобы точно знать, в каком состоянии находится рабочая копия на вашем Mac.

Источники