如何重建Git分支



我有一个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提交更多的内容。我想知道是否有另一种更干净的方法可以使用户开发文件夹与存储库分支重新同步。

注意:用户从不更改esmaster,只更改dev

第一次尝试执行rebase时,需要使用--onto标志告诉git到rebasedev分支到新的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的本地原始版本作为参考点,以确定在重定中排除什么(即,它将获取esdev之间的所有提交,但不包括es本身)。

请注意,如果您已经签出了dev分支,那么您可以将其排除在rebase命令之外:

git rebase --onto origin/es es

最新更新