Насколько хорошо работает команда "hg mv" - PullRequest
9 голосов
/ 04 марта 2011

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

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

Ответы [ 4 ]

15 голосов
/ 04 марта 2011

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

Длинный пример: классический рефакторинг 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 догадка переименование / копированиево время слияния.
5 голосов
/ 04 марта 2011

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

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

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

  1. Вы также изменили файл, в этом случае это будет то же самое, что любой конфликт с данным файлом
  2. Ваш коллега также переименовал файл, в этом случае Mercurial спросит, какое имя использовать.
5 голосов
/ 04 марта 2011

Это довольно легко проверить, и, поскольку здесь уже есть хорошие ответы, я сделаю свой ответ следующим образом:

  • Эксперимент, эксперимент, эксперимент

Здесь я покажу вам, как это работает:

@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
<b>0 files updated, 1 files merged, 0 files removed, 0 files unresolved</b>
(branch merge, don't forget to commit)
0 голосов
/ 04 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...