Изменение базы филиала



у меня есть такое дерево:



(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, чтобы освоить и оставить демо нетронутым. В конце концов, оба демо и ПРО будет висеть от мастера.

460   4  
git

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, и перебазировать их на master commit.

оформить заказ на PRO филиал, скопируйте самый старый (commit4) и последний (commit5) зафиксируйте хэши этой ветки и вставьте куда-нибудь еще.

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 
, удалить PRO филиала (держать резервную копию только для безопасности). Создать и оформить заказ на новый 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

    Ничего не найдено.