Mercurial “多好?”;hg mv“;命令执行

Mercurial “多好?”;hg mv“;命令执行,mercurial,Mercurial,比如说,回购协议中有file.txt,有两个人正在破解它。其中一人用hg mv将file.txt移动到另一个文件夹中,并立即将其推送到repo中。当同事决定自己进行润色时,Mercurial是否有可能自动将原始file.txt中的更改合并到移动的file.txt中 我是不是太乐观了?合并是在工人的私人回购协议中完成的,而不是你的中央回购协议。为了执行合并,第二个用户必须发出hg fetch,这将只修改他自己的私有回购。然后,他必须执行hg推送,以上传到中央回购。我认为几乎不可能出现问题 如果你说

比如说,回购协议中有
file.txt
,有两个人正在破解它。其中一人用
hg mv
file.txt
移动到另一个文件夹中,并立即将其推送到repo中。当同事决定自己进行润色时,Mercurial是否有可能自动将原始
file.txt
中的更改合并到移动的
file.txt


我是不是太乐观了?

合并是在工人的私人回购协议中完成的,而不是你的中央回购协议。为了执行合并,第二个用户必须发出
hg fetch
,这将只修改他自己的私有回购。然后,他必须执行
hg推送
,以上传到中央回购。我认为几乎不可能出现问题


如果你说的是两个人同时入侵同一个工作文件或两个人同时处理同一个回购协议,那么你是做错了(tm)。

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

当您的同事从存储库中提取修改时,他也将提取重命名,Mercurial将尽可能地合并更改。如果您只重命名了该文件,将不会有任何问题,您的同事所做的更改将与重命名合并

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

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

  • 这很容易测试,因为这里已经有了很好的答案,所以我将把我的答案作为重点:

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

    @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) [C:\Temp]:测试 添加master\test1.txt 更新到分支默认值 1个文件已更新,0个文件已合并,0个文件已删除,0个文件未解析 从c:\Temp\master中提取 搜索更改 添加变更集 添加舱单 添加文件更改 添加了1个更改集,其中1个更改为1个文件(+1个头) (运行“hg头”查看头,“hg合并”合并) 将test1.txt和test2.txt合并到test2.txt 0个文件已更新,1个文件已合并,0个文件已删除,0个文件未解析
    (分支合并,别忘了提交)简短回答:可以。

    很长的例子:一个经典的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
    
    mkdir hgmv
    cd-hgmv/
    mkdir-pcom/example/hgmv/
    cat com/example/hgmv/Main.java
    包com.example.hgmv;
    班长
    {  
    公共静态void main(字符串参数[])
    {
    System.out.println(“你好,世界!”);
    }
    }
    EOF
    hg init。
    hg add com/example/hgmv/Main.java
    hg commit-m“第一个工作版本”
    光盘
    hg clone hgmv hgmv.refactor
    克隆hgmv-hgmv.translation
    重构
    hg分支重构
    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“重构主->HgMv”
    hg push-f——新分支../hgmv
    光盘
    cd-hgmv.translation
    hg分支翻译
    sed-i’s/Hello World/世界你好/g'com/example/hgmv/Main.java
    hg commit-m“法语翻译”
    hg push-f——新分支../hgmv
    光盘
    cd-hgmv
    hg-up重构
    hg合并翻译
    hg提交-m“合并”
    cat com/example/hgmv/hgmv.java
    
    火焰:这是mercurial对git的优势之一

    • Mercurial存储在提交时重命名/复制
    • Git guess在合并时重命名/复制

    是的。你太乐观了:)总的来说,对hg-mv不太乐观。@Rafe-Kettler:所以,
    hg-mv-old.txt-new.txt
    hg-cp-old.txt-new.txt之间没有区别;hg rm old.txt
    ?确保他们正在进行自己的私人回购。假设有人将文件移动到另一个文件夹,并将这些更改推送到中央回购,而我在同一个文件中(在我的私人回购中)进行了一些润色。hg merge是否有可能自动完成其工作并将我的更改合并到新位置的文件中?没有-它们位于物理上不同的位置;你甚至不会看到更改,直到你拉/合并(获取)其他人所做的更改。-1@特洛伊木马是一个给定的,问题是:当你拉然后合并时,移动的文件会带来任何问题吗?那么,
    hg mv old.txt new.txt
    相对于
    hg cp old.txt new.txt有什么优势吗;hg rm old.txt
    ?暂时没有区别,但是如果一个命令就足够了,为什么还要使用两个命令呢?有关更多信息和示例,您可以阅读有关复制和重命名的章节: