{"meta":{"title":"Перемещений изменений из одной ветви в другую в GIT в командной строке","intro":"Вот краткое руководство по использованию git rebase в командной строке.","product":"Начало работы","breadcrumbs":[{"href":"/ru/enterprise-server@3.21/get-started","title":"Начало работы"},{"href":"/ru/enterprise-server@3.21/get-started/using-git","title":"С помощью Git"},{"href":"/ru/enterprise-server@3.21/get-started/using-git/using-git-rebase-on-the-command-line","title":"Перебаза Git"}],"documentType":"article"},"body":"# Перемещений изменений из одной ветви в другую в GIT в командной строке\n\nВот краткое руководство по использованию git rebase в командной строке.\n\n## Перемещение изменений из одной ветви в другую в GIT\n\nВ этом примере будут рассмотрены все доступные команды `git rebase`, кроме `exec`.\n\nМы начнем перемещение изменений из одной ветви в другую с ввода `git rebase --interactive HEAD~7` в терминале. В выбранном текстовом редакторе отобразятся следующие строки:\n\n```text\npick 1fc6c95 Patch A\npick 6b2481b Patch B\npick dd1475d something I want to split\npick c619268 A fix for Patch B\npick fa39187 something to add to patch A\npick 4ca2acc i cant' typ goods\npick 7b36971 something to move before patch B\n```\n\nВ этом примере будут выполнены следующие действия:\n\n* сжатие пятой фиксации (`fa39187`) с фиксацией `\"Patch A\"` (`1fc6c95`) с помощью команды `squash`;\n* перемещение последней фиксации (`7b36971`) вверх в положение перед фиксацией `\"Patch B\"` (`6b2481b`) и сохранение ее как `pick`;\n* слияние фиксации `\"A fix for Patch B\"` (`c619268`) с фиксацией `\"Patch B\"` (`6b2481b`) и игнорирование сообщения о фиксации с помощью команды `fixup`;\n* разделение третьей фиксации (`dd1475d`) на две фиксации меньшего размера с помощью команды `edit`;\n* исправление сообщения о фиксации с орфографической ошибкой (`4ca2acc`) с помощью команды `reword`.\n\nНаконец-то. Похоже, предстоит потрудиться, но, действуя последовательно, мы сможем легко внести все эти изменения.\n\nДля начала нам потребуется изменить команды в файле, чтобы они выглядели следующим образом:\n\n```text\npick 1fc6c95 Patch A\nsquash fa39187 something to add to patch A\npick 7b36971 something to move before patch B\npick 6b2481b Patch B\nfixup c619268 A fix for Patch B\nedit dd1475d something I want to split\nreword 4ca2acc i cant' typ goods\n```\n\nМы изменили команду `pick` в каждой строке на интересующую нас команду.\n\nТеперь сохраните и закройте редактор Будет запущено интерактивной перемещение изменения из одной ветви в другую.\n\nGIT пропускает первую команду перемещения изменений, `pick 1fc6c95`, так как она не нужна, и переходит к следующей команде: `squash fa39187`. Так как для этой операции требуются входные данные, GIT снова открывает текстовый редактор. Открываемый файл выглядит примерно так:\n\n```text\n# This is a combination of two commits.\n# The first commit's message is:\n\nPatch A\n\n# This is the 2nd commit message:\n\nsomething to add to patch A\n\n# Please enter the commit message for your changes. Lines starting\n# with '#' will be ignored, and an empty message aborts the commit.\n# Not currently on any branch.\n# Changes to be committed:\n#   (use \"git reset HEAD <file>...\" to unstage)\n#\n# modified:   a\n#\n```\n\nПосредством этого файла GIT сообщает, что произойдет в результате данной операции `squash`. В нем указывается первое сообщение о фиксации (`\"Patch A\"`) и второе сообщение (`\"something to add to patch A\"`). Если эти сообщения о фиксациях вас устраивают, вы можете сохранить файл и закрыть редактор. В противном случае можно изменить сообщение фиксации, просто изменив текст.\n\nПосле закрытия редактора перемещение изменений из одной ветви в другую продолжается:\n\n```text\npick 1fc6c95 Patch A\nsquash fa39187 something to add to patch A\npick 7b36971 something to move before patch B\npick 6b2481b Patch B\nfixup c619268 A fix for Patch B\nedit dd1475d something I want to split\nreword 4ca2acc i cant' typ goods\n```\n\nGIT обрабатывает две команды `pick` (для `pick 7b36971` и `pick 6b2481b`).\n*Также* обрабатывается команда `fixup` (`fixup c619268`), так как она не требует взаимодействия. Команда `fixup` объединяет изменения из `c619268` с предыдущей фиксацией (`6b2481b`). Оба изменения будут иметь одно и то же сообщение о фиксации: `\"Patch B\"`.\n\nGIT достигает операции `edit dd1475d`, останавливается и выводит следующее сообщение в терминале:\n\n```shell\nYou can amend the commit now, with\n\n        git commit --amend\n\nOnce you are satisfied with your changes, run\n\n        git rebase --continue\n```\n\nНа этом этапе можно внести дополнительные изменения в любой из файлов проекта. Для каждого вносимого изменения необходимо выполнить новую фиксацию, и это можно сделать с помощью команды `git commit --amend`. Завершив внесение всех изменений, можно выполнить `git rebase --continue`.\n\nПосле этого GIT переходит к команде `reword 4ca2acc`. Снова открывается текстовый редактор, и выводятся следующие сведения:\n\n```text\ni cant' typ goods\n\n# Please enter the commit message for your changes. Lines starting\n# with '#' will be ignored, and an empty message aborts the commit.\n# Not currently on any branch.\n# Changes to be committed:\n#   (use \"git reset HEAD^1 <file>...\" to unstage)\n#\n# modified:   a\n#\n```\n\nКак и ранее, GIT отображает сообщение о фиксации для редактирования. Вы можете изменить текст (`\"i cant' typ goods\"`), сохранить файл и закрыть редактор. GIT завершит перемещение изменений из одной ветви в другую, и вы вернетесь в терминал.\n\n## Отправка переориентированного кода на GitHub\n\nТак как вы изменили журнал GIT, стандартная команда `git push origin` работать **не будет**. Вам потребуется изменить команду путем принудительной отправки последних изменений:\n\n```shell\n# Don't override changes\n$ git push origin main --force-with-lease\n\n# Override changes\n$ git push origin main --force\n```\n\n> \\[!WARNING]\n> Принудительная отправка имеет серьезные последствия, так как она приводит к изменению исторической последовательности фиксаций для ветви. Используйте ее с осторожностью, особенно если к репозиторию имеет доступ множество пользователей.\n\n## Дополнительные материалы\n\n* [Разрешение конфликтов слияния после перемещения Git](/ru/enterprise-server@3.21/get-started/using-git/resolving-merge-conflicts-after-a-git-rebase)"}