【问题标题】:How to copy (not move) one git branch with merges to another如何复制(不移动)一个 git 分支并合并到另一个
【发布时间】: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_aAdam_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

(以后我会删除Adammaster

【问题讨论】:

  • 试试git rebase --preserve-merges
  • 如果我理解的话,git rebase 会更改其名称下的现有分支,而我需要保留现有分支并创建一个类似的新分支,但使用其他名称。所以结果是原点的重复,原点仍然存在。 - 最后,我希望jacks_branch(有 1.000 次提交)和feature_123(有 42 次提交)在同一个 git 存储库中并具有相同的内容(以及最后 14 次提交的“相同”,包括从小的合并分支)。是的,这是两面派。一段时间后,jacks_branch 将被删除,但不会很快。
  • 我认为这样做的方法(如果我错了,很抱歉,我没有确认这一点)是检查这些分支,然后执行 git checkout -b &lt;duplicate branch name&gt; 并执行你的 rebase。这应该使原始分支保持不变。
  • 我想,就是这样,我在做什么。但问题是,原始分支包含短的“特征分支”,但这是两个人做类似事情的结果,所以合并以冲突结束,在合并提交中解决。并且 rebase/cherry-pick 在它之前停止并要求我以交互方式解决冲突。但我想将下一次提交用作解决方案。我会尝试更好地指定它。
  • 所以最后我只是将所有有问题的部分压缩为单个提交,并且更改和平发生。我仍然想解决这个问题。

标签: git merge git-cherry-pick git-cherry


【解决方案1】:

我认为,与其试图改写历史,您(和您的团队)应该现在专注于使用您想在未来使用的工作流程。这让我想到了下一点,如果继续使用特定的 git 工作流程,而团队中的其他成员继续使用您当前的工作流程,那么您可能不会成功。

假设您的存储库中的各个分支没有太大的分歧,您和您的团队应该开始合并和整合您希望您的存储库看起来像的任何东西,例如。主分支和功能分支。

重写历史记录(例如使用变基)很棘手,因为这意味着自从您正在修改或压缩的提交之后的每一次提交也必须被重写,这意味着您的这些提交的新版本不再匹配其他所有人的“旧”版本版本。如果在最近的历史上谨慎使用,它可能很有用,但重写整个存储库的历史并期望将其与积极的开发相协调并不是我尝试过的事情。

【讨论】:

  • 我们都同意,方式应该不同,我比其他人更了解 Git,所以我应该这样做。我只会将“正确”结构添加到现有存储库,在其中的每个有效分支中复制结束状态。然后他们只需 git checkout 新名称,将看到相同的文件和相同的最后提交并继续工作。我会检查一些时间是否有过时分支中的提交,如果没有提交,只需删除这些分支。如果有提交,我将追踪罪魁祸首,更正他/它的设置和cherry-pick它所属的提交。
  • 所以一段时间后,只会使用新结构,而旧结构会被删除。我们将使用短的功能分支,它在develop 分支中作为单个工作提交(带有测试)结束,并且分支本身将在合并后不久被删除。所以一切都会很好,简单且有效。但是有一些自动化的过程,有时有人在生产中疯狂,部署只是检查(不好,以后会解决),所以我不能扔掉所有东西,另一方面有很多混乱,很慢转换太慢了。
  • 我想我提倡的不是你应该慢慢地转换到新的工作流程,而是你应该专注于当前和未来的工作,而不是长期、肮脏的工作迄今为止您的存储库的历史记录。 IMO,您纠正过去错误的计划只会使您的过渡更加困难(特别是如果您必须向同事施加压力以使其遵守)。一般来说,没有理由不能将“支汤”合并成更有序的东西。
  • 我的计划只是简单地一直压缩,在production 上只留下很少的提交(那些已经部署和使用的),在develop 上的提交很少(那些,那些活分支长出来的地方)和顶部)并将当前实时分支复制到“功能”,这将尽快在develop 中结束,因此它们的丑陋性将被删除。但是我需要在每个分支中保留最后几个提交,因为这些提交被使用和引用。而且我不想在那些“旧”分支上做更多工作,所以我需要复制它,以使过渡就像签出新分支一样简单。
猜你喜欢
  • 2021-01-04
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2010-12-15
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多