gpt4 book ai didi

Git 反复 merge squash

转载 作者:IT王子 更新时间:2023-10-29 01:06:12 25 4
gpt4 key购买 nike

我正在尝试在 git 中创建两个包含二进制文件的分支 - 一个“开发”分支和一个“稳定”分支。在我想将它们“发布”到稳定分支之前,开发分支可以对这些文件进行一些更改(并且稳定分支已重命名这些文件,以防相关)。

我可以做一个正常的 merge ,这工作正常,但保留了太多的历史——当 pull “稳定”分支时,来自“开发”分支的所有中间提交也被 pull (因为它们是父提交)。但是我们谈论的是没有任何合理 merge 策略的二进制文件(除了他们的/我们的),所以开发分支上的文件的实际历史是无用的。当我 pull “稳定”分支时,我得到这个:

          X-------------------G stable         /                   /    a---b---c---d---e---f---g development

因为 G 在开发分支中有一个父级,所以我在我的存储库中获得了开发分支的整个历史(c、d、e、f 和 g 的数据对象),我对此不感兴趣(X 是与 b 相同,应用了一些文件重命名)。

于是我尝试将git merge --squash从开发分支修改到稳定分支。第一次这样的 merge 和提交成功了,结果符合预期(提交消息中的更改日志不错,与开发分支无关):

          X-------------------G stable         /                       a---b---c---d---e---f---g development

在我 pull 出这个压扁的稳定分支后,我在我的存储库中得到了它,这就是我想要的:

a---b---X---G

但是第二次 merge 失败了(因为 git 没办法知道我已经 merge 了多少,搞糊涂了)。

  • 是否有可能以某种方式记录 merge ,而不产生与两个父项的“merge 提交”?
  • 或者,是否可以告诉 git 仅 merge 某个“范围”的修订版,就像在 SVN 中一样?
  • 或者,是否可以进行正常 merge ,而无需在 pull 时从其他分支下载所有引用?
  • 或者我是否应该为有问题的文件提供自定义 merge 驱动程序,将“他们的”版本重命名为“我们的”,从而解决冲突?我仍然担心 --squash 总是会尝试 merge 整个历史,直到共同的父级,只解决我一半的问题。

更新: rebase

如果我正确理解 rebase ,我会得到这样的结果:

                              X stable                             /    a---b---c---d---e---f---g development

这会得到我不感兴趣的所有数据(c、d、e、f),作为奖励,我将丢失 b 是分支中的稳定版本的信息。

每个开发版本都会增加大约 5MB 的存储库大小(重新打包整个存储库只会缩小大约 10%),“稳定”分支几乎是免费的(数据已经存在)。我想从稳定分支中提取一个新的修订版来只提取新的 5MB,而不是从 X 更新到 G 下载 25MB,因为我不能说我不关心 c、d 的内容, e 和 f。

最佳答案

开始于

      X stable
/
a---b---c---d---e---f---g development

您可以使用以下步骤将最后一次提交从开发分支复制到稳定分支:

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"

所以你最终得到:

      X-------------------G stable
/
a---b---c---d---e---f---g development

如果您继续致力于“开发”,例如,

      X-------------------G stable
/
a---b---c---d---e---f---g---h---i---j development

您可以重复上述相同的 git 命令,您将得到:

      X-------------------G-----------J stable
/
a---b---c---d---e---f---g---h---i---j development

关于Git 反复 merge squash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1464642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com