Kim*_*van 29 git version-control merge
我试图在git中有两个带有二进制文件的分支 - 一个"开发"和一个"稳定".在我想要将它们"释放"到稳定分支之前,开发分支可以对这些文件进行多次更改(并且如果相关,则稳定分支重命名这些文件).
我可以做一个正常的合并,这很好,但保留了太多的历史 - 当拉动"稳定"分支时,所有来自"开发"分支的中间提交也被拉出(因为它们是父提交).但是我们讨论的是没有任何合理的合并策略的二进制文件(除了他们/我们的),因此开发分支上的文件的实际历史是无用的.当我拉"稳定"分支时,我得到了这个:
X-------------------G stable
/ /
a---b---c---d---e---f---g development
因为G在开发分支中有一个父项,所以我在我的存储库中得到了开发分支的全部历史记录(c,d,e,f和g的数据对象),我对此并不感兴趣(X与b,应用了一些文件重命名).
所以我尝试git merge --squash从开发分支更改为稳定分支.第一次这样的合并和提交就行了,结果如预期的那样(提交消息中的改变日志很好,与开发分支无关):
X-------------------G stable
/
a---b---c---d---e---f---g development
拉完这个压扁的稳定分支后,我在我的存储库中得到了这个,这就是我想要的:
a---b---X---G
但是第二次合并失败了(因为git无法知道我已经合并了多少并且感到困惑).
--squash总是试图将整个历史合并到普通的父母,只解决我问题的一半.更新:变基
如果我理解正确的变形,我会最终得到这个:
X stable
/
a---b---c---d---e---f---g development
这让我得到了我不感兴趣的所有数据(c,d,e,f),作为奖励,我将丢失b是分支中稳定版本的信息.
每个开发版本都会增加大约5MB的存储库大小(并且重新打包整个repo只会缩小大约10%),"稳定"分支几乎是免费的(数据已经存在).我想从稳定分支中拉出一个新的版本,只拉新的5MB,而是从X更新到G下载25MB,因为我不知道我不知道我不关心c,d的内容,e和f.
pvi*_*ela 25
从...开始
X stable
/
a---b---c---d---e---f---g development
Run Code Online (Sandbox Code Playgroud)
您可以使用以下步骤将最后一次提交从开发分支复制到稳定分支:
git checkout development@{0} # get working tree from "development", detach HEAD
git reset --soft stable # reposition detached HEAD on "stable"
git commit # enter the appropriate commit message
git branch temp # create a temporary branch "temp" at HEAD
git checkout temp # get on the new temporary branch
git branch -M stable # rename "temp" to "stable"
Run Code Online (Sandbox Code Playgroud)
所以你最终得到:
X-------------------G stable
/
a---b---c---d---e---f---g development
Run Code Online (Sandbox Code Playgroud)
如果你继续"开发",例如,
X-------------------G stable
/
a---b---c---d---e---f---g---h---i---j development
Run Code Online (Sandbox Code Playgroud)
你可以重复上面相同的git命令,你最终会得到:
X-------------------G-----------J stable
/
a---b---c---d---e---f---g---h---i---j development
Run Code Online (Sandbox Code Playgroud)
这不是正确的使用场所merge --squash.使用它的一个好地方是在一个一次性的主题分支,你将要合并到你的主分支然后摆脱.在主题分支中完成的所有开发都显示为主分支中的一个提交.在您的情况下,您应该正常从开发分支合并,然后git-rebase --interactive用来压缩您想要的提交.
是否有可能以某种方式记录合并,而不会与两个父母产生"合并提交"?
如果我正确理解了这个问题,不.绝对不是.
是否有可能告诉git只合并某个"范围"的修订版,比如在SVN中?
是. git merge [commit hash]
或者,是否可以进行正常合并而不必在拉动时从其他分支下载所有引用?
请参阅上一个问题的答案.
或者我应该为有问题的文件提供自定义合并驱动程序,只需将"他们的"版本重命名为"我们的",从而解决冲突?我仍然害怕--squash总会尝试将整个历史合并到普通父母,只解决我问题的一半.
没有!只是不要使用git merge --squash.这不适合使用它!