Изменение базы филиала
у меня есть такое дерево:
(commit 1) - master
-- (commit 2) - (commit 3) - demo
-- (commit 4) - (commit 5) - PRO
и я должен переместить ветку PRO в master
(commit 1) - master
|-- (commit 2) - (commit 3) - demo
-- (commit 4) - (commit 5) - PRO
Я пробовал git rebase master из ветки PRO, но ничего не происходит.
разъяснить: я работал в master, а затем мне пришлось сделать демонстрацию продукта (git checkout -b demo и несколько коммитов). Затем, по ошибке, я создаю другую ветку из демо (git checkout -b PRO и некоторые коммиты), и теперь мне нужно переместить ветку PRO, чтобы освоить и оставить демо нетронутым. В конце концов, оба демо и ПРО будет висеть от мастера.
4 ответов:
использовать
--ontoдля этого:git rebase --onto newBase oldBase feature/branchучитывая ваш случай:
git checkout PRO # Just to be clear which branch to be on. git rebase --onto master demo PROв принципе, вы берете все коммиты после
demoдоPRO, и перебазировать их наmastercommit.
оформить заказ на
PROфилиал, скопируйте самый старый (commit4) и последний (commit5) зафиксируйте хэши этой ветки и вставьте куда-нибудь еще., удалить$ git checkout PRO $ git log # see the commit history # copy the oldest & latest commit-hashPROфилиала (держать резервную копию только для безопасности). Создать и оформить заказ на новыйPROфилиал отmaster.$ git branch PRO.bac # create a new branch PRO.bac = PRO as backup $ git checkout master $ git branch -D PRO # delete the local PRO branch $ git checkout -b PRO # create and checkout to a new 'PRO' branch from 'master'принять (cherry-pick) диапазон коммитов предыдущих
PROфилиала в новыйPROотделение.$ git cherry-pick commit4^..commit5 # cherry-pick range of commits # note the '^' after commit4теперь, если все в порядке, то сделайте force (- f) push to
remote PROфилиал и удалить локальныйPRO.bacфилиала.$ git log # check the commit history $ git push -f origin HEAD # replace the remote PRO by local PRO branch history # git branch -D PRO.bac # delete local PRO.bac branch
я постараюсь быть как можно более общим.Сначала убедитесь, что вы находитесь на текущей ветке.
git checkout current-branchзатем используйте следующую команду.
new-base-branchэто ветвь, которая Вы хотите быть вашей новой базой.current-base-branch- это филиал вашей текущей базы.git rebase --onto new-base-branch current-base-branchесли у вас нет конфликтов, то это здорово. Вы закончили. Если вы это делаете (в большинстве случаев), то, пожалуйста, читайте дальше..
конфликты могут возникнуть, и вам придется устранять их вручную. ГИТ сейчас пытается "3-полосное слияние" между вашим
current-branch,current-base-branchиnew-base-branch. Примерно вот какgitбудет работать внутренне:-1.) Git сначала перебазирует
current-base-branchсверхуnew-base-branch. Там могут быть конфликты, которые вам придется решать вручную. После этого, вы обычно делаетеgit add .иgit rebase --continue. Это создаст новую временную фиксациюtemp-commit-hashдля этого.2.) После этого Git теперь будет перебазировать ваш
current-branchнаtemp-commit-hash. Там может быть дальнейшие конфликты и снова вам придется решать их вручную. После этого, вы продолжите снова сgit add .иgit rebase --continue, после чего вы успешно перебазировали свойcurrent-branchнаnew-base-branch.Примечание: - Если вы начинаете испортить, то вы можете сделать
git rebase --abortв любое время во время процесса перебазирования и вернуться к исходной точке.
У меня был немного другой подход с использованием reset и stashes, который позволяет избежать удаления и повторного создания ветвей, а также устраняет необходимость переключения ветвей:
$ git checkout PRO $ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index $ git stash save -m "Commit message" $ git reset commit 3 $ git stash save -m "Commit message" $ git reset master --hard $ git stash pop $ git stash pop $ git push --force # force if its already been push remotelyсбросив ветвь на фиксацию на основе фиксации, вы в основном просто перематываете эту историю ветвей на фиксацию за раз.
Comments