我有一个用例,我们必须在master分支中维护多个版本的代码。但是,可能存在这样的情况:我必须从旧版本(旧版提交)进行克隆,对其进行更改并在提交后立即将其推回。请参阅以下示例: -
主分支: - A-B-C-D-E-F
用例 - 从D克隆,进行更改并在D之后推送(即D')。此外,克隆后所做的任何改变都不应反映在E和F中。
更改后,主分支应该像 - A-B-C-D-D' -E-F
有没有办法在git中执行此操作?
答案 0 :(得分:0)
与描述不符,没有。
在Git中,提交是完全不可更改的 - 提交的父哈希是提交的一部分,因此如果提交的父项E
是D
,提交E
的父级总是 D
。
您可以进行父级为D'
的新提交D
。完成后,您可以将 E
复制到E'
的新提交E
,例如F
但更好的" ,然后将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