3

什么是“分叉”项目的最佳方式,与维护者的变化保持联系并开发自己的功能,同时仍然能够轻松地回馈任何一旦被接受的功能?

这是我所做的,但遇到了问题。

我克隆了一个存储库,在 Feature1 分支中做了一些工作,然后合并了从 origin 到 feature1 的更改,然后是 origin... 然后我开发了 feature2,当然,它也包含 feature1 代码。下面的艺术描绘了这个场景(希望如此)。

我在我的主人中有所有上游的变化,并在它们之上发展。但是,我不能回馈 Feature2,因为它还包含 Feature1 代码。我能做些什么?如何获得针对“aaa”的 feature2 补丁?

Rebase Feature2 和cherry-pick 以排除 Feature1 提交?没有太大的解决办法。

git format-patch f2..f4然后git am呢?所有补丁都必须手动应用!

          Feature1                                    Feature2
          a---b---c---d---e---f---g-----h---i         f2---f3---f4
         /                 \             \   \        /
    --------x'---y'---z'----1---o'---p'---2---3---q'-----r'---t'---l'---aaa'
     /     /    /    /        /    /             /      /    /    /
origin----x----y----z--------o----p-------------q------r----t----l---aaa
4

1 回答 1

1

如果要保留图中描述的合并工作流。

git rebase --onto q Feature2
git checkout aaa
git merge Feature2

如果我正确理解了图表,这会将您的本地存储库转换为如下内容:

        Feature1
        a---b---c---d---e---f---g------h---i
       /                 \              \   \ 
      ------x'---y'---z'--1----o'---p'---2---3----aaa'
     /     /    /    /        /    /
origin----x----y----z--------o----p-------------q----r----t----l---aaa
                                                 \    \    \    \
                                                  \----r'---t'---l'---4---aaa''
                                                   \                 /
                                                    f2---f3---f4-----
                                                    Feature2

如果 Feature2 不依赖于 Feature1 中所做的任何更改,这就是您需要做的所有事情。如果 Feature2 确实依赖于 Feature1 的一些更改,那么您也必须将这些更改挑选到 Feature2 分支上。

替代解决方案

另一种方法是忘记所有合并,并将 Feature2 直接重新定位到适当的上游提交 (aaa)。如果你愿意,你可以对 Feature1 做同样的事情。

git rebase --onto aaa Feature1
git rebase --onto aaa Feature2

这将使您的本地存储库看起来像这样:

                               a---b---(...)---aaa'   Feature1
                              /
origin---x---(...)---t---l---aaa
                              \
                               f2---f3---f4---aaa''   Feature2

同样,这仅在 Feature2 在逻辑上不依赖于 Feature1 时才有效。如果是这样,您仍然必须从 Feature1 到 Feature2 挑选这些东西。

于 2012-11-09T00:46:06.333 回答