我有一个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提交更多的内容。我想知道是否有另一种更干净的方法可以使用户开发文件夹与存储库分支重新同步。
注意:用户从不更改es
或master
,只更改dev
。
第一次尝试执行rebase
时,需要使用--onto
标志告诉git到rebase
dev
分支到新的es
分支。只有在es
分支上仍然有原始提交的情况下,使用常规rebase
才会起作用,因为这就是rebase
用来作为参考点的地方,以了解如何在es
之上重做dev
分支。
因此,做你想做的事情的更简单的方法是
git rebase --onto <new-base> <old-base> <branch>
git rebase --onto origin/es es dev
这个命令告诉git获取dev
分支,并将其从origin
重定到es
的版本上,它说使用es
的本地原始版本作为参考点,以确定在重定中排除什么(即,它将获取es
和dev
之间的所有提交,但不包括es
本身)。
请注意,如果您已经签出了dev
分支,那么您可以将其排除在rebase
命令之外:
git rebase --onto origin/es es