- 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 策略的信息。
感谢您提供任何有用的引用和/或信息!
câu trả lời hay nhất
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 有关。 .在Cây中,总是有一个 LCA,因此它是三向 merge 的明显输入:它是通常基础提交中的基础,左侧/本地/--我们的
提交,右侧/远程/--他们的
操作。
然而,在提交的 DAG 中,可能有多个 LCA 节点。 Mercurial 对此的默认解决方案是任意选择或多或少。 Git 的默认解决方案是使用-s 递归
策略选择tất cả 并 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 的三个输入,谁说 căn cứ 中的文件 path/to/f
就是 与左侧的 path2/f2
和/或右侧的 path3/f3
相同 文件?我们应该将哪些文件配对,或者像我喜欢的那样识别?
Mercurial 对此的回答是通过 danh sách 和记录的目录操作(记录的重命名或复制)来跟踪文件身份,而 Git 的是通过内容匹配动态确定文件身份。然而,完全动态确定在计算上过于昂贵,因此 Git 作弊:如果两个文件在 base-vs-left 或 base-vs-right 中具有相同路径,则这两个文件被识别为“相同” “文件。这只留下没有配对的路径名来动态识别。
还必须处理在最终结果中使用哪个路径名。在这里,Mercurial 让您在 merge 命令运行时进行选择,而 Git 只是将tất cả 名称填充到其索引中,允许稍后延迟名称选择。
不过,一旦被适本地识别和命名, 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 , 除了我这几天不积极Công việc,有一份不同的工作,也不是专门针对这些;但理论章节(至少在某种程度上接近完成)给出了适当的背景。
关于git - Mercurial merge 策略 vs Git merge 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49560696/
我从一个 Mercurial 存储库开始,它有多个我试图 merge 到其中的子存储库,就好像它们一直是主存储库的一部分一样。它们从一开始就不应该是子存储库。 我整理了一个将旧历史转换为单个存储库的过
假设我有一个主线分支和一个功能分支。我已经多次将主线分支 merge 到功能分支中,但只有少数非常小的 merge 冲突。我想清理历史,以便最后只有一个 merge 。执行此操作的最佳方法是什么? 最
首先我使用heapq.merge创建了a&b的两个结果,但是在mergea&b之后,我发现a的列表是空的。 >>> a=merge([1,2],[3,4]) >>> b=merge([4,5],[6,
我和我的团队正在使用远离主轨道 (origin/dev) 的远程分支 (origin/our_feature_branch) 开发一项功能。 Gerrit用于审查等。 使用 git merge ori
这个问题在这里已经有了答案: Is there a way to merge with Strategy "ours" without producing a new commit? (1 个回答)
GitLab 无法自动 merge 请求。所有 merge 请求都会收到消息“此 merge 请求包含必须解决的 merge 冲突。您可以在命令行上手动尝试” 消息似乎不正确,我通过使用“git br
git 有没有办法在不 merge 文件的情况下 merge 两个分支?换句话说就是绘制 merge 箭头。 假设我有分支 A 和 B。我需要将分支 B merge 到 A,但不需要 B 中的所有更改
我想使用提供 git 集成的流行的开源问题跟踪器 (Redmine)。不幸的是,跟踪器中的每个项目只能与一个 git repo 相关联。在跟踪器中创建多个项目不是我理想的设置。 考虑到这一点,我尝试使
在我们的存储库中,我们遵循基于 git-flow 的工作流程。我们有一个已完成的发布(安装在生产环境中),因此发布分支已 merge 到主分支中。 B---C---D---E [release
git merge 命令有一个执行快进 merge 的选项,但这不是我想要的,因为如果它不能执行快进 merge ,它会使用普通 merge . 是否有一个 git 命令仅执行快进 merge (从跟
尝试合并 TFS2008 时出现此错误。源分支或目标分支上都没有挂起的更改。 TF14083: The item {0} has a pending merge from the current me
为了更好地理解这些操作,我想知道 github 或 gitlab 到底是如何 merge 这些请求的。当压缩、 rebase 、 merge ......时详细执行哪些 git 命令? 最佳答案 PR
为了更好地理解这些操作,我想知道 github 或 gitlab 到底是如何 merge 这些请求的。当压缩、 rebase 、 merge ......时详细执行哪些 git 命令? 最佳答案 PR
我试图将提交的一部分从默认分支(不是所有文件和其他文件的部分) merge 到一个命名分支。我试过 graft ,但它只需要整个提交,而没有给我选择的机会。这将如何完成? 例子: A---B---C-
我正在进行 merge ,此时我已准备好提交,但我在 TortoiseHg 中的提交对话框显示许多文件已修改,但是当我与 parent 进行比较时,它说所有文件都是二进制相等的。 我没有也从未有过 e
我已经尝试了以下几种变体,但我仍然遇到错误。有什么办法可以解决这个问题。 DB2 10.1(DB2 for z/OS V10) 对于以下 MERGE INTO TRGT t USING SRC s O
我的数据库模型有用户和 MAC 地址。一个用户可以有多个MAC地址,但一个MAC只能属于一个用户。如果某个用户设置了他的 MAC,并且该 MAC 已经链接到另一个用户,则现有关系将被删除,并在新所有者
假设我有一个新功能,所以我创建了一个新分支。这个分支是一个会持续很长时间的副项目,所以我最终将 master merge 回它以使其保持最新状态。这已经发生了 50 次,因为我一直在更新它并消除该功能
过去几个小时我在 Mercurial 中进行了一次巨大的 merge 。 merge 131 个文件后,我的 merge 工具 meld 崩溃,显示 python 回溯。在尝试退出 meld 时,我无
我有一个关于 git merge 的问题。假设我的存储库中有两个分支(本地和远程):master 和 test。当我在测试分支上工作时,主分支被其他人更新了。在终端中,我写: git checkout
Tôi là một lập trình viên xuất sắc, rất giỏi!