- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我经常读到 Hg(以及 Git 和...)在 merge 方面比 SVN 更好,但我从未见过 Hg/Git 可以在 SVN 失败的地方(或 SVN 需要手动干预的地方) merge 某些东西的实际例子。您能否发布一些分支/修改/提交/...-操作的分步列表,以显示在 Hg/Git 继续前进时 SVN 会在哪里失败?请实际的,不是非常特殊的情况......
一些背景:我们有几十个开发人员使用 SVN 开发项目,每个项目(或一组类似的项目)都在自己的存储库中。我们知道如何应用发布分支和功能分支,因此我们不会经常遇到问题(即,我们曾经遇到过这种情况,但我们学会了克服 Joel's problems “一个程序员给整个团队造成创伤”的问题”或“需要六名开发人员两周来重新整合一个分支机构”)。我们有非常稳定的发布分支,仅用于应用错误修复。我们的主干应该足够稳定,能够在一周内创建一个版本。我们有单个开发人员或开发人员组可以处理的功能分支。是的,它们在重新集成后被删除,因此它们不会弄乱存储库。 ;)
所以我仍在努力寻找 Hg/Git 相对于 SVN 的优势。我很想获得一些实践经验,但目前还没有任何更大的项目可以转移到 Hg/Git,所以我只能玩那些只包含一些组合文件的小型人工项目。我正在寻找一些您可以感受到 Hg/Git 令人印象深刻的力量的案例,因为到目前为止我经常读到它们,但我自己却没有找到它们。
最佳答案
我也一直在寻找这样一种情况,比如说,Subversion 无法 merge 分支,而 Mercurial(和 Git、Bazaar 等)做了正确的事情。
SVN 手册 describes how renamed files are merged incorrectly .这适用于 Subversion 1.5 , 1.6 , 1.7 , 和 1.8 !我试图重现以下情况:
cd /tmprm -rf svn-repo svn-checkoutsvnadmin create svn-reposvn checkout file:///tmp/svn-repo svn-checkoutcd svn-checkoutmkdir trunk branchesecho 'Goodbye, World!' > trunk/hello.txtsvn add trunk branchessvn commit -m 'Initial import.'svn copy '^/trunk' '^/branches/rename' -m 'Create branch.'svn switch '^/trunk' .echo 'Hello, World!' > hello.txtsvn commit -m 'Update on trunk.'svn switch '^/branches/rename' .svn rename hello.txt hello.en.txtsvn commit -m 'Rename on branch.'svn switch '^/trunk' .svn merge --reintegrate '^/branches/rename'
According to the book, the merge should finish cleanly, but with wrong data in the renamed file since the update on trunk
is forgotten. Instead I get a tree conflict (this is with Subversion 1.6.17, the newest version in Debian at the time of writing):
--- Merging differences between repository URLs into '.':A hello.en.txt C hello.txtSummary of conflicts: Tree conflicts: 1
There shouldn't be any conflict at all — the update should be merged into the new name of the file. While Subversion fails, Mercurial handles this correctly:
rm -rf /tmp/hg-repo
hg init /tmp/hg-repo
cd /tmp/hg-repo
echo 'Goodbye, World!' > hello.txt
hg add hello.txt
hg commit -m 'Initial import.'
echo 'Hello, World!' > hello.txt
hg commit -m 'Update.'
hg update 0
hg rename hello.txt hello.en.txt
hg commit -m 'Rename.'
hg merge
merge 之前,存储库看起来像这样(来自 hg glog
):
@ changeset: 2:6502899164cc| tag: tip| parent: 0:d08bcebadd9e| user: Martin Geisler | date: Thu Apr 01 12:29:19 2010 +0200| summary: Rename.|| o changeset: 1:9d06fa155634|/ user: Martin Geisler | date: Thu Apr 01 12:29:18 2010 +0200| summary: Update.|o changeset: 0:d08bcebadd9e user: Martin Geisler date: Thu Apr 01 12:29:18 2010 +0200 summary: Initial import.
merge 的输出是:
merging hello.en.txt and hello.txt to hello.en.txt0 files updated, 1 files merged, 0 files removed, 0 files unresolved(branch merge, don't forget to commit)
换句话说:Mercurial 将修订版 1 中的更改 merge 到修订版 2 中的新文件名中 (hello.en.txt
)。为了支持重构,处理这种情况当然是必不可少的,而重构正是您希望在分支上做的事情。
关于git - merge : Hg/Git vs. SVN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2475831/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How can I see incoming commits in git? “hg 传出”或“hg 传入”
mercurial 命令之间有什么区别, hg 条 hg 取消 hg 恢复 所有这些命令基本上都用于恢复/撤消早期变更集的影响。 最佳答案 hg strip 从存储库中删除变更集及其所有后代。就好像这
您可以使用什么 mercurial 命令在变更集 xyz 之前查看变更集? 如果你这样做 hg log -r :xyz您会看到(包括)xyz 之前的所有变更集 - 按升序列出。但我想轻松地看到之前的变
当我在克隆我的 Git 存储库时,远程内容发生了变化: $ hg push ... abort: refs/heads/master changed on the server, please pul
有人能告诉我为什么最后没有找到任何变化吗? 此外,我收到一条烦人的消息,“.hg/hgrc 中未指定用户名。将不会使用 key 环。” 版本工具:Hg最新版服务器:Linux工作区:~/2012WS
我在我的 Windows 机器上安装了 Tortoise Hg,并且一直通过 Tortoise GUI 和 Windows 命令行使用 mercurial。我按照 http://hg-git.gith
我的项目.hg目录为 40MB。如果我 hg push --verbose --debug到一个空的远程存储库,我看到它发送了数百 MB。额外的开销从何而来? 更新 :hg bundle -a生成一个
对于那些使用带有 MQ 扩展的 Mercurial 的人: 这是我第二次不小心将更改提交到中央存储库( hg push ),而不是将补丁应用到我的工作目录( hg qpush )。 我认为这是非常不幸
在 Mercurial 中,有什么区别 hg revert --all 和 hg up -C? 这两个命令似乎都会恢复所有更改。但有什么区别呢? 最佳答案 通过 hg up,您实际上切换到另一个版本(
如果我从本地 Mercurial 存储库开始,我认为它是“主要”存储库(请原谅我,我的 dvcs 领主),并打算使用 bitbucket 作为备份和问题跟踪工具,我可以进行所有更改在我的本地存储库中并
我的团队使用 mercurial 已经有一段时间了。我们使用 ssh 连接到中央远程存储库。将 ssh 推或拉到远程存储库时没有任何问题......直到今天! 其他人都在局域网上,我远程工作并使用 v
hg revert 和 hg backout 都会还原先前版本所做的更改。两者有什么区别? 最佳答案 考虑到变更集的历史: A --- B --- C --- D --- E [b
我创建了一个新的存储库 test-backout,并在其中添加了一个新文件 file。然后,我每次进行 4 次提交,并使用 将提交编号附加到 file 中 echo [manually entered
在工作中,我使用的是 svn存储库在 7 人之间共享。 为了避免在提交中困扰我的错误并破坏每个人的构建并避免在 svn 中分支,我创建了一个hg svn 的一部分中的存储库我目前正在处理的目录。 我在
我一直在一个分支上做一些开发,并意识到在它完成之前需要先完成其他事情。我决定我将分支我当前的分支并在该分支中进行必要的更改,然后将它们 merge 在一起,然后将我的工作分支 merge 为默认分支。
我有一个使用 mercurial 作为存储库的网络服务器。每天,我们都有应用程序将文件写入我们的服务器,我希望这些文件反射(reflect)在存储库中。有没有一种方法可以添加每天运行的自动“hg ad
在某些情况下,我需要强制 Mercurial 用户运行 hg pull -u在任何之前 hg commit可以允许,即 hg pull将意味着传入队列是空的——此外,我还希望该人使用分支的头部版本。
我正在 Mercurial 中开发一个项目,突然间,当我运行“hg status”时,我在“.hg”目录中看到一堆文件,报告为“未跟踪”。它看起来像这样: ? .hg/00changelog.i ?
这里的问题是 hg 的工作流程显然是在绕圈子: hg pull,再拿一个头 hg merge ,得到未完成的警告未提交的更改 hg commit -m "pre merge commit", 获取消息
我昨天在我的 Mac(雪豹)上重新安装了 Mercurial。 Mercurial 的 UI/控制台语言已从英语更改为丹麦语。我的机器设置为美国英语,键盘布局为丹麦语。我不希望丹麦语翻译生效,因为它不
我是一名优秀的程序员,十分优秀!