我有一棵这样的树:
(commit 1) - master
\-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
我必须将PRO分支移动到主
(commit 1) - master
|-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
我在PRO分支中尝试了git rebase master
,但没有任何反应。
澄清:我在大师工作,然后我不得不做一个产品演示(git checkout -b demo
和一些提交)。然后,我错误地从demo(git checkout -b PRO
和一些提交)创建了另一个分支,现在我需要将PRO分支移动到master并保持demo完整。最后,demo和PRO都将从master中挂起。
答案 0 :(得分:162)
使用--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
提交。
答案 1 :(得分:12)
结帐到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
现在,如果一切正常,那么强制(-f)推送到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
答案 2 :(得分:8)
我会努力做到尽善尽美。首先,请确保您在CURRENT分支上。
git checkout current-branch
然后使用以下命令 - (new-base-branch
是您希望成为新基础的分支。current-base-branch
是您当前基础的分支。)
git rebase --onto new-base-branch current-base-branch
可能会出现冲突,您必须手动解决冲突。 Git现在尝试进行" 3-way merge"在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
并回到起点。答案 3 :(得分:0)
我使用重置和存储方法略有不同,避免删除和重新创建分支以及无需切换分支:
$ 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
通过在提交的基础上重新提交分支,你基本上只是将一次提交分支历史记录重新编写。
答案 4 :(得分:0)
我知道这个问题很老了,但分享一下,以防它对某人有帮助。
我处于相同的情况,我从不同的基础分支提出 PR,更改基础分支和 rebase 显示 200 多个文件冲突。
即使解决它也会显示我不想要的旧提交。所以我做的是
终于在命令下面运行了
git push origin +branchName:branchName
在上面,您也可以使用 -f
代替 +
。
以上命令将我的分支置于不影响我的拉取请求的状态。