Git Rebase 困境:理清纠结的功能分支

问题描述 投票:0回答:1

我有一个基于

develop
的功能分支,我们称之为
feature-1
。与此同时,我还选择了另一个功能分支
feature-2

feature-1
是一个真正的功能分支,我在那里进行了一些重大的更改。
feature-2
是一些 github 工作流程中断的简单分支。

我对

feature-2
进行了一项工作流程更改,并将其推送到远程存储库(远程上的
feature-2
);此更改也合并回
develop
。我采取了另一个功能分支(出于蓝月亮的原因,我什至无法回忆起来),
feature-3
,用于更多 github 工作流程更改...

在同一时间点,当我选择分支

feature-3
时,我将最新的开发更改(来自
feature-2
的一次提交)合并到
feature-1
中。从那时起,
feature-3
已做出 6 次提交。我不得不承认,我忘记了远程
develop
上有 6 个提交,我以为我已经将其拉入本地
develop
了。这 6 个提交已从
develop
合并到
feature-3

上面是图表中相对不混乱的部分。在这个过程中(我无法弄清楚确切的时间点,我想我在这里需要一些帮助),我做了一个从

rebase
feature-1
develop
;然而,这引起了一些冲突,导致来自
feature-1
的重复合并集(典型的提交消息是“将
feature-1
从原点合并到
feature-1
”)。 IIRC,我做了两次
rebase

我突然想到,我应该先将半完成的

feature-1
合并到
develop
中,然后从合并的
develop
中取出一个新的分支作为新的开始;或者我可以立即从
develop
拿一个分支,然后
cherry-pick
feature-1
提交,并留下混乱的
feature-1
让我安心。

还有其他方法来解决这个问题吗?让我天真一点,例如优雅地解开图中的双胞胎,或者让缠结的线以某种方式消失?

我隐约记得,最佳实践是仅

rebase
我的本地分支,其中仅包含共享主分支上的本地提交;如果我已将更改推送到远程存储库(比如我的远程相当于本地分支),我不应该使用
rebase
。在我看来,只有当我与其他同事共享这个分支时,这才是事实。就我而言,它们都只是我的分支,所以在我执行其中一个
rebase
(更重要的是第一个
rebase
)之前,我不小心将更改推送到远程存储库。

这是我复制图表的尝试,我用字母标记了重复的提交。在图中,您会看到

rebase
似乎仅发生在
feature-1
上,即
feature-1
重新基于
feature-1
。这也是让我很困惑的地方。

*---------*----------------------------* [develop]
|        /|                           /
|-------a |-----------*--*--*--*--*--* [feature-2(merged), feature-3(merged)]
|         |
|-----*---|-----------------------------a--b--c--d--e----c--d--e--f [feature-1]
|     |    \                                         \           /
|-----|-----b--c--d--e--------------------------------f----------   [feature-1,duplicate]

git git-merge git-rebase git-merge-conflict
1个回答
0
投票

如果

feature_1
没有被推送,或者如果您是唯一一个在处理它的人,请毫不犹豫地先在本地重新调整它的基础,然后再将其合并到
develop

在您的情况下,关键命令是

git rebase --onto <newbase> parent-commit end-commit
:它允许您移动一系列提交(
parent-commit
之后的提交一直到
end-commit

在任何时候(只要您当前的状态是干净的),您都可以执行以下操作:

git switch develop
git pull
git rebase --onto develop a~ feature-1
# resolve potential merge conflicts

这会给你:

                                         ---a--b--c--d--e----c--d--e--f [feature-1]
                                        /
*---------*----------------------------* [develop]
|        /|                           /
|-------a |-----------*--*--*--*--*--* [feature-2(merged), feature-3(merged)]

然后你可以合并(

git merge --no-ff
如果你想要合并提交)来开发。
然后推。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.