- HGコピーは正確に何をするのか、特別なものを治療、将来的にこの 原因していますか?
新しいファイルが追加され、古いファイルのコピーとしてマークされます。これらはコピーであるため、元のファイルで行われた変更がコピーにマージされます。時間は左から右に流れて:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
\ /
(hg copy a.txt b.txt)
- 、それは我々の場合のための「間違ったこと(TM)」を行うが判明した場合、どのように私は別のファイルのコピーをbeeingてのファイルをフラグ解除 ん?
このメカニズムは、マージするときにのみ起動します。 b.txt
が の共通の祖先リビジョン(上のグラフのinit)に存在しない場合、Mercurialは を逆方向に検索してb.txt
が他の場所からコピーされているかどうかを確認します。質問は、最終的なマージがどのように行われるかである
(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge)
\ / /
(copy a b) --/------- (edit b) ------------------/
:
は、私たちは省略形で上記のグラフを続けましょう。共通の祖先ポイント はcopy a b
ノードになり、ここではa
とb
の両方が存在します。つまり、コピーを検索することはありません を意味します!したがって、a
への2回目の編集は となり、b
に合併されます。
ダブルチェックするために、私はそれを試してみた:
$ hg init
$ echo a > a
$ hg add a
$ hg commit -m init
$ hg copy a b
$ hg commit -m "copy a b"
をこれは、コピーした、b
は今だけa
が含まれています。
$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo aa >> a
$ hg commit -m "edit a"
created a new head
$ hg merge
merging a and b to b
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "a edit copied to b"
これは最初のマージだったとa
に編集b
にコピーされました:行ってこれ以上のコピーはありません
$ echo aaa >> a
$ hg commit -m "edit a again"
$ hg update 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo bbb >> b
$ hg commit -m "edit b"
created new head
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
:私たちは今、並行して変更を加える
$ cat b
a
aa
:
$ cat a
a
aa
aaa
$ cat b
a
aa
bbb
これを無効にするために...あなたは実際にコピー の検出を明示的に無効にすることはできません。しかし、私が上記に示したがっているように、最初のマージの後にもう一度 あなたを "悩ます"ことはありません。
最初のマージが問題の場合、がマージを開始する前に、hg resolve --tool internal:local
を使用してファイルを元の状態に戻すことができます。
$ hg resolve --tool internal:local b
で、私たちはただa
で1行を含むに戻っb
を持ち込んでいることができるように。
[Mercurial:The Definitive Guide]の[ファイルのコピー](http://tortoisehg.bitbucket.org/hgbook/1.7/mercurial-in-daily-use.html#chap:daily.copy)も参照できます。 ](http://tortoisehg.bitbucket.org/hgbook/1.7/)の本。 – Matus