- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 git 多年,最近为了一个项目改用 mercurial。在过去的 6 个月里,我已经学会了如何通过命令行很好地使用 Mercurial。
这可能是我的想象,但在我看来,mercurial 在 merge 方面要差得多,并且会导致更多的文件冲突。我会经常将默认分支 merge 到我的功能分支中,它有时会做一些非常时髦的事情,并且无法自动 merge 看起来应该在视觉上很好地 merge 的文件 - I.E.同一行没有变化等。
我已经做了相当多的研究来了解 merge 算法可能有什么不同,但运气很差。大多数文章都是人们关于 git 和 mercurial 如何在幕后工作的意见和信息,并没有过多地关注 merge 算法本身以及优势/劣势以及差异的通俗易懂的示例。
我总是使用良好的 merge 策略并通过树向上 merge ,并且在没有首先 merge 到远程分支以确保没有冲突的情况下从不向下 merge 到 default(hg)/master(git) 分支。
到目前为止,我在研究中发现的是:
1) Mercurial 无法 merge 或在与多个父级 merge 时出现问题。我不确定有人会遇到这种情况,但也许这很常见?
这是真的吗?这会不会在日常开发中更频繁地导致 merge 冲突?
2) Mercurial 不支持 octopus merge ,而 git 支持。
对于 Octopus merge ,我说“谁在乎!”,这不是必需的。
除此之外, merge 算法似乎是平等创建的?是否可以更改 merge 算法?有没有这方面的好文章?
如果您发布有关 k3diff、p4merge 和 meld 等 merge 工具的信息,那么您就错过了 Gist - 我想要有关解决冲突之前的自动 merge 策略的信息。
感谢您提供任何有用的引用和/或信息!
最佳答案
1) Mercurial cannot merge or has issues merging with multiple parents. I'm not sure how someone ends up in this situation, but maybe it is common?
Is this true? Would this cause merge conflicts more often in every-day development?
不,这不是真的——至少如所声称的那样,这似乎有点毫无意义。
进行基于提交图的 merge 的根本问题与查找 Lowest Common Ancestor or LCA 有关。 .在树中,总是有一个 LCA,因此它是三向 merge 的明显输入:它是通常基础提交中的基础,左侧/本地/--我们的
提交,右侧/远程/--他们的
操作。
然而,在提交的 DAG 中,可能有多个 LCA 节点。 Mercurial 对此的默认解决方案是任意选择或多或少。 Git 的默认解决方案是使用-s 递归
策略选择所有 并 merge 它们。这种“内部” merge 导致单个最终提交,然后 Git 将其用作 merge 基础。您可以重写它以使用 -s resolve
执行与 Mercurial 相同的操作:任意选择或多或少的一个,并将其用作基础。
Mercurial 有几个实验性的替代 merge 策略(参见,例如 BidMerge),但没有一个是“开箱即用的”,不像 Git 的四个 -s
策略。
多个 merge 基础主要发生在某人进行“交叉 merge ”时。参见 How do criss-cross merges arise in Git?在某些工作流程中,这种情况永远不会发生,而且在实践中也并不常见。
2) Mercurial doesn't support octopus merging, where git does.
For octopus merging, I say "who cares!", this isn't a necessity.
没错。任何 Octopus merge 都可以通过一系列成对 merge 来模拟。不过,它们特别适合炫耀。 :-)
Other than that, it seems that the merge algorithms are created equally?
不,因为 Mercurial 和 Git 使用不同的算法来跟踪文件名。这里的问题是:一旦你有了三向 merge 的三个输入,谁说 base 中的文件 path/to/f
就是 与左侧的 path2/f2
和/或右侧的 path3/f3
相同 文件?我们应该将哪些文件配对,或者像我喜欢的那样识别?
Mercurial 对此的回答是通过 list 和记录的目录操作(记录的重命名或复制)来跟踪文件身份,而 Git 的是通过内容匹配动态确定文件身份。然而,完全动态确定在计算上过于昂贵,因此 Git 作弊:如果两个文件在 base-vs-left 或 base-vs-right 中具有相同路径,则这两个文件被识别为“相同” “文件。这只留下没有配对的路径名来动态识别。
还必须处理在最终结果中使用哪个路径名。在这里,Mercurial 让您在 merge 命令运行时进行选择,而 Git 只是将所有 名称填充到其索引中,允许稍后延迟名称选择。
不过,一旦被适本地识别和命名, merge 过程本身是相同的:找出哪一方更改了哪个文件。如果只有一方更改了文件,则使用该方的版本。否则,对三个输入进行文件级 merge (Git 在内部称其为低级 merge )。这需要计算差异或跟踪和组合单个变更集,Git 和 Mercurial 都选择直接的“差异基础与提示”方法。 (因为 Git 总是存储快照,所以它有点被迫这样。Mercurial 有时 存储快照,所以它也有点被迫。)但是它们的内部差异引擎也不相同,所以这也可以产生一些不同的结果。
Is it possible to change the merging algorithms? Are there any great articles on this?
是的:Git 有 -s
参数,而 Mercurial 在内部都是可插入的。
没有,据我所知。我正在研究 book , 除了我这几天不积极工作,有一份不同的工作,也不是专门针对这些;但理论章节(至少在某种程度上接近完成)给出了适当的背景。
关于git - Mercurial merge 策略 vs Git merge 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49560696/
如果你做一个 hg pull然后是 hg update (或 hg merge ),有没有办法解决这个问题?即:将您的存储库恢复到执行 hg pull 之前的状态? 我相信你可以做到hg update
我有一台带有 ssh 的服务器,我想将其用作中央存储库。但是我不能在上面安装 mercurial。因此,客户端如何在服务器上没有安装 mercurial 的情况下通过 ssh 推送到服务器。 谢谢 最
我们有一个专门的问题跟踪 (Redmine) 机器,它有一个 Mercurial 存储库(称为“Redmine 存储库”)。 Redmine 设置为使用该存储库,据我了解,Redmine 从未对该存储
一个 hg 存储库可以存在于我的本地文件系统上的另一个 hg 存储库中吗? 我正在拉取“sandbox”的 bitbucket wiki,我想知道是否应该将其放置在 repos/sandbox/wik
我有一个项目,我使用 Bitbucket 作为我的 HG 服务器,但我最近发现,作为一个单独的开发人员,我可以免费使用 Fogbugz/Kiln。我想将我的文件移至 Kiln,但我不想丢失我的历史记录
Mercurial 如何判断文件已被修改? 我问的原因是因为当我运行时 hg status它告诉我有几个文件被修改了。 但是,当我运行 hg diff 时没有变化要报告。 我有一个关于为什么会发生这种
我需要获取本地存储库中文件的特定版本/节点的内容,并将其写入临时文件。 我知道可以通过内部Mercurial API进行操作。 有内置命令或扩展名吗? 最佳答案 您可以使用 hg cat : hg c
这两个命令有什么区别(我想回滚到修订版 1): hg update -r 1 hg backout -r 1 --merge (在示例中提示修订为 3) 最佳答案 首先, update -r 1 将撤
我看到 mercurial 有效地压缩了存储库中的文件 (repo/.hg/store/data) 有人知道存储库文件使用哪种压缩吗? 谢谢。 最佳答案 Mercurial 存储库中有两个压缩级别:增
如果 Mercurial does not track file permissions默认情况下,它如何决定它创建的任何文件/目录的权限? 是否使用umask ?如果不是,它有什么用? 我有 rea
我已经阅读了很多关于 Mercurial 及其分支的信息,但是,我仍然是一个版本控制新手。 我目前正在做一个项目,我的任务是开发一个新模块。 我有一个“主”存储库,其中包含项目其余部分的最新代码,以及
尝试运行 hg update 时出现以下错误: abort: Operation not permitted: /var/www/simira/web/public/images/nomination
mercurial 如何处理拆分的文件?如果我创建一个分支并拆分一个文件会发生什么。我可以轻松地从修改原始未拆分文件的另一个分支中提取更改吗? 最佳答案 我只是做了一个小实验。我用一个大文件创建了一个
我想使用hg graft将变更集从一个分支复制到另一个分支。 但是,在变更集中修改的文件已在源分支中重命名(使用hg rename)-在要移植的变更集之前。 当我尝试时,我得到: scanning f
Annotate可以使您看到该行的最新更改,如果该更改是合并,那么我别无选择,只能浏览修订历史记录并查找下一次对其进行修改的情况。 我也尝试过hg grep -l '[contents of line
我有一个小项目,我从集市开始,作为练习bzr的练习。从那以后,我决定选择 Mercurial 。我如何将这个项目迁移到Hg? 最佳答案 我相信您的答案可以在here中找到。 本质上,您只需要运行 $
什么决定分支是否处于非事件状态?是否有客户使用的特定时间段? 我们有很多不活跃的分支。值得我们花时间关闭它们吗? 该文档似乎没有指定如何确定非事件分支: https://www.mercurial-s
假设我创建了一个存储库,添加 x 文件并提交。说大小是 初始提交后的 Mb。 有什么方法可以估计存储库在一年内会有多大? 如果代码行数增加了 10%,存储库会相应增长吗? 提交、分支、标签等的数量如何
我正在使用 Mercurial(特别是 Windows 上的 TortoiseHg)对 VBA 代码进行版本控制。任何尝试过这个的人都知道,只要在项目中的任何地方更改了该变量的任何声明(无论范围如何)
不幸的是,我已经清理了我的 Mercurial 货架,忘记了我需要进行一些更改。我有定期的文件系统备份,但不知道 Mercurial 在哪里存储搁置文件。有人可以告诉我在哪里看吗? Mercurial
我是一名优秀的程序员,十分优秀!