Git:将包含先前精选提交的分支与主分支同步

3
在git中,如果分支已经包含从master复制的提交记录,并且您希望保留部署分支的历史记录,那么将部署分支更新到与主分支相同,最好/最容易的方法是什么?
以下是场景:
1. 部署分支在过去某个时间点从主分支创建。 2. 从主分支复制了其他提交记录到deploy中,略过了一些其他提交记录。 3. 在生产环境中部署在deploy上的代码。 4. 现在需要完全将deploy与master同步以进行下一次部署。
问题是,如何轻松地执行第4步(避免任何合并冲突,因为在deploy中没有提交任何独特的更改,只是从主分支中复制的更改),而不更改deploy中的任何历史记录(我的理解是,在这一点上执行rebase可能会丢失deploy中的历史记录,或者使获取精确的已部署代码变得更加困难,但我可能是错误的)。
执行“git merge master”会生成许多冲突,最好避免这种情况,因为想要的只是使deploy的头直接类似于master的头(deploy不包含任何独特的更改)。
3个回答

4

以下是我目前找到的最佳方法来回答自己的问题。在您的分支检出下运行以下命令,它将把主分支合并到您的分支中,并解决所有冲突以主分支为准:

git merge -s recursive -X theirs origin/master

我刚刚自己尝试了一下,现在我很困惑为什么从origin/master合并时得到的结果与仅从master合并时得到的结果不同(master已经是最新的,即在拉取后)。在第二种情况下,我缺少了两个代码片段。使用你建议的origin/master没有问题,并产生了预期的结果。 - rnsanchez
搞定了:我遇到了合并冲突。使用 --no-commit,我可以解决需要注意的冲突,其他所有内容都按预期合并。 - rnsanchez

2
根据我的经验,仅进行合并操作即可。Git会检测到已应用cherry-pick的提交,并在合并过程中“忽略”它们。您尝试过只进行合并吗?即使失败,您也可以轻松使用git进行还原并尝试其他不同的操作(也许是另一种合并策略,但我还没有经验)。
如果您想要进行rebase操作,同时保留已部署代码,请为您想要保留的代码添加一个标签。Rebase将重写您提交的历史记录,但标签仍将指向rebase之前的代码(提交)。

您对合并的评论是一个好建议,但不幸的是会导致许多冲突。为了明确起见,我已更新了我的问题。 - Trevor Freeman

1
我不认为这是你期望的答案,但你可能需要改进你的分支策略,并且在主题分支上更加细致。这样你就可以合并主题分支而不是从主分支进行 cherry-pick。因此,你的主分支将合并所有主题分支,开发分支将合并一些主题分支。然后你最终将主分支合并到开发分支中,以使部署分支保持最新状态。这并不能保证你避免冲突,但它更加清晰,在规范情况下,会有较少的冲突需要解决。
当你 cherry-pick 时,git 就失去了识别 cherry-pick 的提交和原始提交相同的能力。这就是冲突的来源。

我同意这更理想,但有时情况会发生变化,功能会被拆分或部分版本需要合并。这并不是常见的情况,但不幸的是确实发生过,所以才有这个问题。 - Trevor Freeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接