“hg mv”命令的执行情况如何

时间:2011-03-04 07:25:43

标签: mercurial

比方说,回购中有file.txt,有两个人正在攻击它。其中一人将file.txt移动到另一个文件夹hg mv,然后立即将其推入回购邮件。当同事决定推出自己的修饰时,Mercurial是否有可能自动将原始file.txt的更改合并到移动的file.txt中?

我太乐观了吗?

4 个答案:

答案 0 :(得分:15)

简短回答:是的,你可以。

长示例:经典Java重构与同一文件中的代码更改

mkdir hgmv
cd hgmv/
mkdir -p com/example/hgmv/
cat << EOF > com/example/hgmv/Main.java
package com.example.hgmv;
class Main
{  
  public static void main(String args[])
  {
    System.out.println("Hello World!");
  }
}
EOF
hg init .
hg add com/example/hgmv/Main.java
hg commit -m "First working version"
cd ..
hg clone hgmv hgmv.refactor
hg clone hgmv hgmv.translation

cd hgmv.refactor
hg branch refactor
hg mv com/example/hgmv/Main.java com/example/hgmv/HgMv.java
sed -i'' 's/Main/HgMv/g' com/example/hgmv/HgMv.java
hg commit -m "refactoring Main->HgMv"
hg push -f --new-branch ../hgmv
cd ..

cd hgmv.translation
hg branch translation
sed -i'' 's/Hello World!/Bonjour Monde!/g' com/example/hgmv/Main.java
hg commit -m "french translation"
hg push -f --new-branch ../hgmv
cd ..

cd hgmv
hg up refactor
hg merge translation
hg commit -m "merge"
cat com/example/hgmv/HgMv.java

火红的:这是对git的优势之一

  • Mercurial商店在提交时重命名/复制。
  • Git think在合并时重命名/复制。

答案 1 :(得分:5)

Mercurial商店在存储库的元数据中重命名,因此当您执行hg mv OLD NEW时,Mercurial会保留您移动文件的信息。

当你的同事从存储库中提取修改时,他也将重新命名,Mercurial会尝试尽可能地合并更改。如果您只重命名该文件,则根本没有问题,您的同事的更改将与重命名合并。

但是,在以下情况下可能会发生冲突:

  1. 您也修改了文件,在这种情况下,这将与给定文件上的任何冲突相同
  2. 您的同事也重命名了该文件,在这种情况下,Mercurial会询问哪个是正确的名称。

答案 2 :(得分:5)

这很容易测试,因为这里已经有了很好的答案,我将把这个主要观点作为答案:

  • 实验,实验,实验

在这里,我将向您展示这是如何工作的:

@echo off
setlocal

if exist master rd /s /q master
if exist clone rd /s /q clone
hg init master

rem Create new repository
echo a >master\test1.txt
hg commit master -m "test1" --addremove

rem Clone it
hg clone master clone

rem Now rename the file in master
cd master
hg move test1.txt test2.txt
hg commit -m "renamed"

rem And change it in clone
cd ..\clone
echo b >test1.txt
hg commit -m "changed"

rem Now pull and merge
hg pull
hg merge

输出:

[C:\Temp] :test
adding master\test1.txt
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
pulling from c:\Temp\master
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)
merging test1.txt and test2.txt to test2.txt
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

答案 3 :(得分:0)

合并是在工人的私人回购中完成的,而不是你的中央回购。为了执行合并,第二个用户必须发出hg fetch,这将仅修改他自己的私人仓库。然后他必须执行hg push上传到中央仓库。我认为接下来不会出现问题。

如果你说的是同时处理相同工作文件的2个人或同时处理同一个回购的2个人那么你正在做错了(tm)。