# Как сделать 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`