我有一个master
分支和一个es
分支。 es
已在本地重建:
git checkout master
git checkout -b es2
git cherry-pick A C E D
git branch -D es
git checkout master
git branch -m es2 es
其中A,C,D和E是es
分支中的一些选定提交。
在此之后,我不得不强行推动:
git push --all -f
从一开始直到这一点,没有人推动或撤出回购。
但一切都进展顺利。当我试图在另一台计算机中重新分支一个分支时出现问题。该用户具有以下分支结构:
master - es - dev
dev
只有一次提交(比方说X)。这是一个有问题的git命令序列:
git checkout master
git pull
git branch -f es origin/es
git checkout dev
git rebase es
最后一个rebase与新es
分支中未包含的提交产生了很多冲突,但它们包含在master
分支中。在进行了一些挖掘之后,我们发现我们可以通过这样做而不是变形来重建结构:
git checkout es
git checkout -b dev2
git cherry-pick X
git branch -D dev
git checkout es
git branch -m dev2 dev
这让我觉得问题是“旧”dev
分支有一些引用或链接到旧es
分支,这就是rebase尝试添加到dev
的原因分支超过X提交。我想知道是否有另一种更简洁的方法使用户dev文件夹与存储库分支重新同步。
注意:用户从不更改es
或master
,只需dev
。
答案 0 :(得分:2)
您第一次尝试rebase
时,需要使用--onto
标志告诉git rebase
dev
分支到新es
分支。使用常规rebase
只有在es
分支仍然有原始提交时才会起作用,因为这是rebase
用作参考点以确定如何重做{{{ 1}}分支在dev
之上。
所以做你想做的更简单的方法就是
es
这告诉git取git rebase --onto <new-base> <old-base> <branch>
git rebase --onto origin/es es dev
分支并将其重新绑定到dev
的{{1}}版本,并说它使用es
的本地原始版本}作为参考点来确定在rebase中要排除的内容(即,它将在origin
和es
之间进行所有提交,但不包括es
本身。
请注意,如果您已签出dev
分支,则可以将其从es
命令中删除:
dev