gpt4 book ai didi

version-control - 如何在 mercurial 中将一堆更改作为单个更改

转载 作者:行者123 更新时间:2023-12-04 14:32:49 25 4
gpt4 key购买 nike

据我了解,像 Mercurial 这样的分布式修订控制系统的主要优点之一是,您不必担心破坏 super 重要的主存储库(很多其他开发人员都在使用它)中的某些内容,并完成所有工作和研究在您的个人远程克隆中,直到您了解一切都稳定并且您可以将工作推回原位。
因此,我得到了我的问题:是否可以不推回所有更改历史记录(您为自己进行了多次修改),而仅推回您的 repo 和当前 master 状态之间的实际差异。

一个例子:

hg init master-repo; cd master-repo  
echo -e 'Important file\nWith Bug!' > file
hg commit -A -m "initial commit"
cd ..; hg clone master-repo hotfix-repo; cd hotfix-repo
echo "fix1" >> file
hg commit -m "first attempt to fix bug"
echo "fix2" >> file
hg commit -m 'Fixed it!'

现在(可能在拉取并 merge 最新的 master-repo 更改之后)我只想推回一个包含我在没有本地提交历史的情况下所做的所有更改的更改集。
一种可能的解决方案是再创建一个克隆,然后在两个克隆之间使用差异/补丁来提取/应用第一个克隆的更改,并在第二个存储库中一次提交所有更改。然后像正常情况一样推送。但是有可能只使用 mercurial 命令吗?

感谢转发!

最佳答案

关于在推送之前将试错变更集折叠为单个变更集是否好,意见不同:

  • 优点:您可以避免在测试套件失败的历史记录中包含变更集 - 这些变更集对 hg bisect 不利并添加噪音。
  • 骗局:您不能折叠已发布到其他存储库的变更集——这样做只会重写您的本地变更集,然后您必须手动清理其他存储库。

  • 从技术上讲,在推送之前将一组变更集折叠为单个变更集是完全安全的。你开始
    ... a --- b --- c --- x --- y --- z

    你把它改写成
    ... a --- b --- c --- w

    哪里 w具有与 z 完全相同的存储库状态有(但显然是不同的父变更集)。这里没有 merge (因此没有 merge 冲突)所以它不会失败。

    重写后,您可以拉取并与上游 merge ( de ):
    ... a --- b --- c --- w --- v
    \ /
    d ----- e

    您需要一个扩展来进行任何类型的历史重写。在这里,我建议以下之一:
  • Collapse extension :顾名思义,此扩展专用于折叠变更集。
  • Histedit extension :成熟的历史编辑,但是 fold 命令让你折叠变更集。
  • Rebase extension :这个标准扩展可以移动变更集并同时折叠它们。在上面的例子中,它会移动 x --- y --- z之后 e :
    ... a --- b --- c --- d --- e --- x' --- y' --- z'

    然后您可以选择折叠 x'z' :
    ... a --- b --- c --- d --- e --- w'

    与刚刚崩溃相比xz , rebase 确实涉及 merge ,因此可能会失败。
  • 关于version-control - 如何在 mercurial 中将一堆更改作为单个更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9550496/

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