我有一个基于
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]
如果
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
如果你想要合并提交)来开发。