从较旧的提交中克隆并在较新的提交之前合并

时间:2017-11-09 22:33:27

标签: git gitlab git-merge

我有一个用例,我们必须在master分支中维护多个版本的代码。但是,可能存在这样的情况:我必须从旧版本(旧版提交)进行克隆,对其进行更改并在提交后立即将其推回。请参阅以下示例: -

主分支: - A-B-C-D-E-F

用例 - 从D克隆,进行更改并在D之后推送(即D')。此外,克隆后所做的任何改变都不应反映在E和F中。

更改后,主分支应该像 - A-B-C-D-D' -E-F

有没有办法在git中执行此操作?

2 个答案:

答案 0 :(得分:0)

与描述不符,没有。

在Git中,提交是完全不可更改的 - 提交的父哈希提交的一部分,因此如果提交的父项ED,提交E的父级总是 D

您可以进行父级为D'的新提交D。完成后,您可以 E复制到E'的新提交E,例如F但更好的&#34; ,然后将F'复制到新的 D'-E'-'F' <-- master / A--B--C--D--E--F [abandoned]

git rebase

这&#34;复制一些提交,然后移动分支名称并放弃原始提交&#34;是$ git clone $url repo $ cd repo $ git checkout -b new-master master~2 # create new branch at commit D $ ... work to fix up D and make D' ... $ git add ...; git commit 的作用:

D'

这会在D之上构建$ git checkout master $ git rebase new-master 。然后:

master

有一个巨大的缺点:每个人谁克隆了存储库,让他们的Git记住旧的F提交F'仍然记得它。您必须将拥有该存储库副本的所有人切换为使用闪亮的新F副本而不是旧的已分解Col1 NVARCHAR(10) Col2 NVARCHAR(100) Col3 NVARCHAR(200) Col4 NVARCHAR(50)

答案 1 :(得分:0)

您基本上想要编辑遥控器上的历史记录,并且有几种方法可以做到这一点。我将通过在功能分支中进行D'提交来强调操作的性质来说明对我来说最自然的事情。

假设你克隆了你的完整回购: A-B-C-d-E-F

git checkout -b feature
git rebase master~2

此时,您要素分支中的历史记录将如下所示:A-B-C-D

承诺D'你得到A-B-C-D-D'。这保留了D-D'的历史(我只提到这个,因为人们同样可以从D到E开始进行交互式变基,其中D被D + D'替换。)

git cherry-pick E..F

您的历史现在看起来像:A-B-C-D-D'-E-F

你现在可以推。但是,定期推送会导致错误,因为推送仅执行快进合并(请参阅Git push rejected after feature branch rebase)。因此,您需要这样做:

git push --force-with-lease origin feature:master