gpt4 book ai didi

mercurial - 为什么 hg update 命令在某些情况下会 merge ,但不是全部?

转载 作者:行者123 更新时间:2023-12-02 19:28:13 25 4
gpt4 key购买 nike

案例 1:更新工作目录

$ hg update [-r REV]

这会将工作目录切换到指定的修订版本。但是,如果我的工作目录已修改更改,则这些更改将与 REV merge 回来。 。我意识到我可以使用-C标记放弃我的更改,但我试图表达我对 update 行为的担忧不同场景下的命令。

案例 2:切换到分支

$ hg update <bname>

这会将我的工作目录切换到 <bname>分支。但是,在我明确使用 merge 之前,我未提交的更改不会 merge 命令。

案例 3:更新从远程存储库拉取的更改集

$ hg pull
$ hg update

这再次将我的工作目录与最近的 pull 之后来自远程存储库的更改集 merge 。 。

最佳答案

Mercurial 1.9.1

它与变更集之间的关系有关。如果工作目录的父变更集和要更新到的目标变更集之间存在直接路径,Mercurial 将尝试通过 merge 操作传输工作目录中的更改。因此,如果您所在的变更集是您要更新到的变更集的直接后代或直接祖先,那么它通常会起作用。

在下图中,字母代表分支名称,数字代表连续的修订号。 wd是工作目录。

Mercurial 何时 merge 未提交的更改:

  • 在同一分支上更新:

    --A1----A3----A5---wd
    \ /
    A2------A4

    以上是在A5的基础上进行的更改。如果您更新到 A4,Mercurial 将 merge 未提交的更改以传输它们。

    --A1----A3----A5---A6---wd
    \ /
    A2------A4

    此外,如果有其他变更集(例如 A6),这仍然有效,因为 A4

  • 更新到不同的分支(这次更新到B4):

    --A1----A3----A5---wd
    \ /
    B2------B4

    上面,修订版 24 位于不同的分支 B 上,该分支最近已 merge 回分支 A 。 Mercurial 还会传输未提交的更改,因为 A5B4 密切相关。还有:

    --A1----A3----A5---A6---wd
    \ /
    B2------B4
  • 同样,当您从远程存储库中提取新更改时,通常它们将是工作目录父级更改集的后代,因此提供了直接关系,可以 merge 未提交的更改:

    --A1----A3----A5---A6---wd
    \ / \
    A2------A4 A7---A8---A9 (A7 through A9 pulled)

当 Mercurial 不会 merge 未提交的更改时:

  • 在同一分支上更新:

    --A1----A3----A5
    \ /
    A2------A4---A6---wd

    以上是在A6的基础上进行的更改。如果您更新到A5,Mercurial 将拒绝,并表示“未完成的未提交更改”或“跨分支”。这是因为您试图将未提交的更改从一个头 merge 到另一个头,并且它们(根据定义)不是彼此的祖先或后代。当然,命名分支也会发生同样的情况:

    --A1----A3----A5
    \ /
    B2------B4---B6---wd

绕过它

当 Mercurial 不会自动尝试 merge 未提交的更改时,您可以通过几种不同的方式将更改移至新的父级:

  • 搁置更改、更新,然后取消搁置(手动处理冲突)。
  • 在 MQ 中制作补丁会做同样的事情,因为搁置使用相同的补丁,只是不是它们的队列。您将刷新补丁、弹出补丁、更新到其他分支,然后推送补丁(手动处理冲突)。
  • 提交变更集,将其 rebase 到另一个分支(您必须经历 merge 过程),然后将其导入 MQ,这样它就不再是变更集,而是补丁。

关于mercurial - 为什么 hg update 命令在某些情况下会 merge ,但不是全部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7048141/

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