# Как сделать rebase[draft][need to delete] ### Вступление Помните, пока вы не сделали push, любые изменения происходят только у вас локально. Даже если что-то пошло совсем не так, вы в любой момент сможете вернуться к исходному состоянию и начать заново. В инструкции используется PowerShell. Вы можете использовать любую консоль по своему усмотрению. PowerShell рекомендуется к использованию, так как имеет наиболее интуитивное управление для обычного пользователя в сравнении с остальными консолями. Например, в ней корректно работают привычные сочетания клавиш Ctrl+C, Ctrl+V Некоторые символы, которые легко не заметить, выделены более темным фоном(-, ^). То, что включено в <>, стоит воспринимать, как переменную Установка текстового редактора После установки гита, текстовым редактором по умолчанию является Vim. Это консольный текстовый редактор, имеющий крутую кривую изучения и неподготовленный человек вряд ли сможет в нем самостоятельно разобраться. Поэтому, если у вас нет опыта работы с Vim, необходимо установить другой текстовый редактор для гита. Запустите PowerShell Пуск > Ввести “PowerShell” > Enter Если вы предпочитаете Visual Studio Code (и он у вас установлен), используйте следующую команду git config --global core.editor "code --wait" Если вы предпочитаете Sublime Text (и он у вас установлен), используйте следующую команду git config --global core.editor "'<path_to_sublime>' -w" path_to_sublime - абсолютный путь к исполняемому файлу. Например: C:/Program Files (x86)/sublime text 3/subl.exe ### Краткая инструкция 1. Уведомить о ваших намерениях всех членов команды, которые работают над веткой, которую вы собираетесь ребейсить 2. Проверить, что у вас нет незакоммиченных изменений и, если есть, закоммитить либо очистить их 3. Запустить PowerShell `Пуск > Ввести “PowerShell” > Enter` 4. Перейти в папку, где скачанный реп 5. 6. Стать на ветку, которую собираетесь рейбейсить `git checkout <branch_name>` 6. Подтянуть последние изменения в ветке ```bash= git pull ``` 7. Получить список коммитов в ветке и определить начиная с какого нужно сделать ребейс (какой первый коммит необходимо изменить) `git log --first-parent --oneline -<number_of_commits_to_display>` 8. Запустить ребейс `git rebase -i <first_commit_to_rebase_id>^ --rebase-merges` Если в ветке не было мерж коммитов, то можно не использовать флаг --rebase-merges 9. В открывшемся редакторе проверить, что список коммитов соответствует ожидаемому и определить, какие действия необходимо проделать с каждым из них. Основные действия: `pick `- коммит добавляется без изменений `reword` - коммит добавляется, но ему можно поменять описание (само описание на данном этапе менять не надо, только действие) `drop` - коммит не добавляется `squash` - коммит объединяется с предыдущим в один (если выбрать это действие для всех коммитов, кроме первого, то вся ветка сожмется в один единственный коммит) 10. Если обнаружена ошибка в списке коммитов, полностью очистить файл, открытый в текстовом редакторе, сохранить и закрыть его, вернуться к пункту 7 11. Если список коммитов верный, то сохранить изменения и закрыть файл, открытый в текстовом редакторе 12. Если каким-то коммитам было выбрано действие, требующее изменения описания, обновить его. Для каждого такого коммита гит откроет текстовый редактор со старым описанием, которое нужно изменить как вы считаете необходимым. После этого сохранить и закрыть файл, открытый в текстовом редакторе. 13. Дождаться успешного окончания ребейса и проверить результат `git log --first-parent --oneline -<number_of_commits_to_display>` 14. Если все ок, запушить изменения в общий репозиторий `git push --force-with-lease` **15. Уведомить всех членов команды, работающих над этой веткой о том, что вы завершили ребейс** ### Если кто-то отребейсил вашу ветку Если вы узнали, что кто-то отребейсил ветку и вам нужно обновить ее локально ``` git checkout <branch_name> git fetch origin/<branch_name> git reset --hard origin/<branch_name> ``` ### Если что-то пошло не так В процессе ребейса пришло осознание ошибки Если ребейс в процессе, но вы осознали, что что-то сделали не так и хотите начать заново, то в любой момент можно нажать комбинацию Ctrl+C, чтобы остановить его. После этого надо отменить изменения, сделанные ребейсом git rebase --abort git reset --hard HEAD git clean -f -d Можно вернуться к пункту 7 #### В процессе ребейса произошел мерж конфликт При ребейсе с флагом --rebase-merges, гит делает все мержи заново, если они были. Это означает, что если оригинальный мерж имел конфликты, они появятся снова при ребейсе. При возникновении конфликта, гит выведет сообщение, в котором будет указан путь к файлу или файлам, которые стали причиной конфликтов. ``` Auto-merging <path_to_file> CONFLICT (content): Merge conflict in <path_to_file> ``` Если конфликты в этом файле уже были решены ранее в этой ветке, то можно просто скопировать проделанную работу по устранению конфликтов. Для этого нужно знать id коммита, который вызвал конфликт и из которого вам следует скопировать состояние файла. Определить его можно из следующего сообщения, которое гит также выводит в консоль `Could not apply <commit_id>... <description> ` Далее необходимо скопировать файл. Для этого можно использовать команду checkout с указание файла `git checkout <commit_id> <path_to_file>` Обратите внимание, что path_to_file - это путь к файлу, а не просто его имя. Его можно получить из сообщения, рассмотренного выше. Также, стоит отметить, что команда checkout без указания файла имеет совсем другое предназначение - позволяет перемещаться между коммитами. Если при резолве вы уверены, что вам точно нужна ваша версия какого-то файла, то можно использовать `git checkout --ours <path_to_file>` Если при резолве вы уверены, что вам точно нужна версия какого-то файла, пришедшая из другой ветки, то можно использовать `git checkout --theirs <path_to_file>` Вышеизложенные шаги стоит проделать для каждого файла, в котором возник конфликт. Получить список файлов, еще содержащих конфликты можно при помощи следующей команды git diff --name-only --diff-filter=U После того, как все конфликты устранены, необходимо продолжить процедуру ребейса git rebase --continue Далее можно продолжать выполнять Краткую инструкцию с шага 12. #### Результат ребейса оказался неверным Если ребейс выполнился успешно, но результат оказался неверным, то нужно начать все сначала Необходимо сбросить ветку в исходное состояние `git reset --hard origin/<branch_name>` Далее можно продолжать с пункта 7 ###### tags: `Git` `rebase` `draft`