Перемещение изменений из одной ветви в другую в GIT
В этом примере будут рассмотрены все доступные команды git rebase
, кроме exec
.
Мы начнем перемещение изменений из одной ветви в другую с ввода git rebase --interactive HEAD~7
в терминале. В выбранном текстовом редакторе отобразятся следующие строки:
pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
В этом примере будут выполнены следующие действия:
- сжатие пятой фиксации (
fa39187
) с фиксацией"Patch A"
(1fc6c95
) с помощью командыsquash
; - перемещение последней фиксации (
7b36971
) вверх в положение перед фиксацией"Patch B"
(6b2481b
) и сохранение ее какpick
; - слияние фиксации
"A fix for Patch B"
(c619268
) с фиксацией"Patch B"
(6b2481b
) и игнорирование сообщения о фиксации с помощью командыfixup
; - разделение третьей фиксации (
dd1475d
) на две фиксации меньшего размера с помощью командыedit
; - исправление сообщения о фиксации с орфографической ошибкой (
4ca2acc
) с помощью командыreword
.
Наконец-то. Похоже, предстоит потрудиться, но, действуя последовательно, мы сможем легко внести все эти изменения.
Для начала нам потребуется изменить команды в файле, чтобы они выглядели следующим образом:
pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods
Мы изменили команду pick
в каждой строке на интересующую нас команду.
Теперь сохраните и закройте редактор Будет запущено интерактивной перемещение изменения из одной ветви в другую.
GIT пропускает первую команду перемещения изменений, pick 1fc6c95
, так как она не нужна, и переходит к следующей команде: squash fa39187
. Так как для этой операции требуются входные данные, GIT снова открывает текстовый редактор. Открываемый файл выглядит примерно так:
# This is a combination of two commits.
# The first commit's message is:
Patch A
# This is the 2nd commit message:
something to add to patch A
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a
#
Посредством этого файла GIT сообщает, что произойдет в результате данной операции squash
. В нем указывается первое сообщение о фиксации ("Patch A"
) и второе сообщение ("something to add to patch A"
). Если эти сообщения о фиксациях вас устраивают, вы можете сохранить файл и закрыть редактор. В противном случае можно изменить сообщение фиксации, просто изменив текст.
После закрытия редактора перемещение изменений из одной ветви в другую продолжается:
pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods
GIT обрабатывает две команды pick
(для pick 7b36971
и pick 6b2481b
). Также обрабатывается команда fixup
(fixup c619268
), так как она не требует взаимодействия. Команда fixup
объединяет изменения из c619268
с предыдущей фиксацией (6b2481b
). Оба изменения будут иметь одно и то же сообщение о фиксации: "Patch B"
.
GIT достигает операции edit dd1475d
, останавливается и выводит следующее сообщение в терминале:
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
На этом этапе можно внести дополнительные изменения в любой из файлов проекта. Для каждого вносимого изменения необходимо выполнить новую фиксацию, и это можно сделать с помощью команды git commit --amend
. Завершив внесение всех изменений, можно выполнить git rebase --continue
.
После этого GIT переходит к команде reword 4ca2acc
. Снова открывается текстовый редактор, и выводятся следующие сведения:
i cant' typ goods
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD^1 <file>..." to unstage)
#
# modified: a
#
Как и ранее, GIT отображает сообщение о фиксации для редактирования. Вы можете изменить текст ("i cant' typ goods"
), сохранить файл и закрыть редактор. GIT завершит перемещение изменений из одной ветви в другую, и вы вернетесь в терминал.
Отправка перемещенного между ветвями кода на GitHub
Так как вы изменили журнал GIT, стандартная команда git push origin
работать не будет. Вам потребуется изменить команду путем принудительной отправки последних изменений:
# Don't override changes
$ git push origin main --force-with-lease
# Override changes
$ git push origin main --force
Принудительная отправка имеет серьезные последствия, так как она приводит к изменению исторической последовательности фиксаций для ветви. Используйте ее с осторожностью, особенно если к репозиторию имеет доступ множество пользователей.