【发布时间】:2016-06-23 00:23:12
【问题描述】:
我正在尝试重新组织 GIT 存储库,其中充满了杂乱无章的分支。现在我们想在那里做一些结构(开发,生产,功能,......分支)并删除/压缩许多小的更改。但是需要一些东西来保持现状,因为有人在努力。
所以我创建了一个大结构,将旧东西拼凑在一起(不再对多年前的小错别字修复感兴趣),并在今年年初基本上修复了所有内容。
但现在问题来了 - 一些分支处于活动状态,无法完全压缩,无法删除/移动(直到新架构证明可以工作一段时间)并且内部包含许多小合并,如下所示:
jacks_branch
A-B-C-F-G-H-I-J-M-N-O-P ...
\D-E/ \K-L/
我想在适当的功能分支上复制它,比如
feature_123
XX-YY
=>
XX-YY-C'-F'-G'-H'-I'-J'-M'-N'-O'-P' ...
\D'-E'/ \K'-L'/
(架构比较复杂,这是有问题的部分)
我想做类似的事情
git checkout feature_123
git cherry-pick C..P
但它会导致所有这些合并发生冲突
error: could not apply E
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
I 提交(合并)解决了所有这些冲突,但它没有被应用并且樱桃采摘停止
最好的出路是什么(除了从一开始就组织好)?
编辑 - 添加示例:
我有
* 3b0a2b4 3.line Adam (HEAD, Adam)
* c04efb0 Just fixed merge from other computer
|\
| * 3e5f111 2.line Adam_a
* | 897bfc3 2.line Adam_b
|/
* 308a3c5 1.line Adam
* 33f3119 === new year ==== (master)
* 436619b 1000.line
.............
* 0a12c01 4.line
* 41d763d 3.line
* dd1feb0 2.line
* 55aa2c2 1.line
* 84b12e9 Point zero
请注意,分支 Adam 中存在冲突(3e5f111 和 897bfc3 分别将行 Adam_a 和 Adam_b 添加到同一位置),开发人员 Adam 在 c04efb0 中以某种方式解决了这个问题(通过在那里完全写一些东西不同,比如Adam_* # it does not matter 左右)
我想添加新的分支develop - 这是master 的简单壁球
* 75675e1 === new_year === squashed 1.000 lines (HEAD, develop)
* 84b12e9 Point zero
现在我想用来自Adam 的内容添加分支feature_1(超过develop)(但不必手动解决所有已经解决的冲突,我希望合并(4444567)与在分支上Adam)
* 555567 3.line Adam (HEAD, feature_1)
* 4444567 Just fixed merge from other computer
|\
| * 3334567 2.line Adam_a
* | 2234567 2.line Adam_b
|/
* 1234567 1.line Adam
* 75675e1 === new_year === squashed 1.000 lines (develop)
* 84b12e9 Point zero
得到这个:
* 555567 3.line Adam (HEAD, feature_1)
* 4444567 Just fixed merge from other computer
|\
| * 3334567 2.line Adam_a
* | 2234567 2.line Adam_b
|/
* 1234567 1.line Adam
* 75675e1 === new_year === squashed 1.000 lines (develop)
| * 3b0a2b4 3.line Adam (Adam)
| * c04efb0 Just fixed merge from other computer
| |\
| | * 3e5f111 2.line Adam_a (Adam_a)
| * | 897bfc3 2.line Adam
| |/
| * 308a3c5 1.line Adam
| * 33f3119 === new year ==== (master)
| * 436619b 1000.line
| * 0a12c01 4.line
| * 41d763d 3.line
| * dd1feb0 2.line
| * 55aa2c2 1.line
|/
* 84b12e9 Point zero
(以后我会删除Adam和master)
【问题讨论】:
-
试试
git rebase --preserve-merges -
如果我理解的话,
git rebase会更改其名称下的现有分支,而我需要保留现有分支并创建一个类似的新分支,但使用其他名称。所以结果是原点的重复,原点仍然存在。 - 最后,我希望jacks_branch(有 1.000 次提交)和feature_123(有 42 次提交)在同一个 git 存储库中并具有相同的内容(以及最后 14 次提交的“相同”,包括从小的合并分支)。是的,这是两面派。一段时间后,jacks_branch将被删除,但不会很快。 -
我认为这样做的方法(如果我错了,很抱歉,我没有确认这一点)是检查这些分支,然后执行
git checkout -b <duplicate branch name>并执行你的 rebase。这应该使原始分支保持不变。 -
我想,就是这样,我在做什么。但问题是,原始分支包含短的“特征分支”,但这是两个人做类似事情的结果,所以合并以冲突结束,在合并提交中解决。并且 rebase/cherry-pick 在它之前停止并要求我以交互方式解决冲突。但我想将下一次提交用作解决方案。我会尝试更好地指定它。
-
所以最后我只是将所有有问题的部分压缩为单个提交,并且更改和平发生。我仍然想解决这个问题。
标签: git merge git-cherry-pick git-cherry