Насколько хорошо работает команда " hg mv

допустим, есть file.txt в репо и два человека рубить его. Один из них шевельнулся!--0--> в другую папку с hg mv и сразу же толкнул его в репо. Есть ли вероятность, что Mercurial автоматически объединит изменения из original file.txt переехал в file.txt когда коллега решит протолкнуть свои взлеты?

я слишком оптимистичен?

4 ответов


короткий ответ: Да, вы можете.

длинный пример: классический 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

и пламенный: Это одна из сил mercurial над git

  • Mercurial хранит переименование / копирование во время фиксации.
  • git guess переименовать / скопировать во время слияния.

ртутный магазинах переименование в метаданных репозитория, поэтому, когда вы делаете hg mv OLD NEW, Mercurial сохраняет информацию о том, что вы переместили файл.

когда ваш коллега вытащит изменения из репозитория, он также вытащит переименование, и Mercurial попытается объединить изменения как можно лучше. Если вы только переименовали файл, не будет никаких проблем вообще, изменения от вашего коллеги будет слияние с переименованием.

однако, конфликты могут возникают в следующей ситуации:

  1. вы также изменили файл, в этом случае это будет то же самое, что и любой конфликт в данном файле
  2. ваш коллега переименовал файл тоже, в этом случае 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)

слияние выполняется в частных РЕПО рабочих, а не в вашем Центральном РЕПО. Чтобы выполнить слияние, второй пользователь должен выдать hg fetch который изменит только его собственное частное РЕПО. Затем он должен выполнить hg push для загрузки в центральное РЕПО. Я думаю, что практически нет шансов, что проблема возникнет.

Если вы говорите о 2 людях, взламывающих один и тот же рабочий файл или 2 человека, работающих над одним и тем же РЕПО одновременно, то Вы делаете это неправильно (торговая марка.)