为什么Mercurial会让您为不相关的文件提取/更新/合并?

cod*_*ing 3 mercurial

对于较大的团队,不得不拉/更新/合并然后每次提交对我没有意义,特别是当其他开发人员更改的文件与我的变更集文件无关时.

即我更改file1.txt,而其他人更改file10.txt.为什么我必须在允许推送之前合并到我的计算机上?

如果许多开发人员都在提交,那么你必须经常拉/更新/合并,这会让人感到非常痛苦.

此外,它使您的变更集看起来比它更大,因为它显示您的合并作为单独的提交.

Mat*_*ela 9

Mercurial让你这样做,因为它的原子单元不是文件而是变更集.这是一个包含一组更改的节点.每个变更集都是历史记录中的单个节点,代表该人员所做的事情.即使没有更改的公共文件(这将是一个简单的自动合并),这也会导致您必须合并.这些合并节点非常重要,因为它们是存储库历史记录的一部分,并为Mercurial提供了更多信息,以便将来与祖先信息进行合并.

这就是说有可以使用,将清理你的历史位(但不会需要你拉推前解决您的问题)的延伸.它被称为rebase扩展,它随Mercurial一起提供,但默认情况下禁用.它添加了一个新的arumument ,看起来像:

hg pull --rebase
Run Code Online (Sandbox Code Playgroud)

这将提取新的更改并将您的本地变更集线性地移动到它们之上而不具有合并变量集.但是,我会强烈反对使用它,因为您重写其历史记录后确实会丢失有关您的存储库的信息.阅读这篇文章,了解这可能导致的一些问题.


acm*_*acm 5

好吧,你可以尝试使用rebase,这将避免合并提交,但它并非没有自己的危险.你也可以通过做"hg pull --update"而不是单独的hg pull来崩溃到一步; hg更新命令.

至于为什么必须在计算机上合并:这是mercurial作为分布式版本控制系统的直接后果.没有可以被认为是规范的中央服务器(除非您按照惯例创建一个),因此没有其他"地方"可以进行合并.您是唯一可以决定如何将您的仓库中的信息与远程仓库中的信息相结合的人.必须记录这些决策的结果,这是合并提交的起源.

此外,在您的示例中,合并将在没有用户交互的情况下发生,因为没有冲突(对于rebase也是如此),所以我不明白为什么这是一个问题.