Mercurial:変更とファイルを手動で制御する方法は?
質問
注:ここで説明するシナリオは、 スタックオーバーフロー:完全に手動の水銀マージ.
例で私の質問を説明します。私がマーキュリアルリポジトリから始めて設計すると仮定します 車:
C:\Car$ dir
Car.cpp
Car.h
私はしばらくの間、車のデザインに取り組んでいますが、リポジトリは次のように見えます。
r0-r1-...-r100-(default)
ある時点で、私は支部します デフォルト に solarcarbranch 太陽光発電車で並行して作業するには:
C:\SolarCar$ dir
Car.cpp
Car.h
Solar.cpp
Solar.h
もう少し時間を過ごした後、リポジトリは次のようになります。
r0-r1-...-r100-...-r200-(default)
\--r101-...-r201-(SolarCarBranch)
マージするにはどうすればよいですか solarcarbranch 戻る デフォルト?
私が望むマージの次の合併症に注意してください:
- 私は両方の作業を続けることができるはずです デフォルト と solarcarbranch マージの後。
- 燃料効率の修正があるかもしれません
Car.cpp
とCar.h
の solarcarbranch 私が引き込んでみたいと デフォルト, しかし、私はそれらのファイルのすべての変更を望んでいません。だから、私は私が含めたい変更を選びたい デフォルト マージ中(別名マニュアルマージ)。 - そうです いいえ 欲しいです
Solar.cpp
とSolar.h
に表示されます デフォルト. 。世界はまだ太陽光発電車の準備ができていないかもしれません。 ;-)
私が学んだこと:
- これはaによって可能です
hg merge SolarCarBranch
- これは、設定によって実現できます
kdiff3.premerge=False
のMercurial.ini
- それ以来、これを達成する方法がわかりません
premerge=False
それでもマージ/コピーSolar.cpp
とSolar.h
の中へ デフォルト 許可を求めることなく。
解決
あなたは本当に近く、移植(Yuck)やチェリーピッキングに頼る必要はありません。 Premergeをオフにすることが最初のステップです。その後、マージした後、コミットする前にメインブランチで不要なファイルを削除するだけです。あなたはそれを一度だけする必要があります。
これがセットアップです:
o changeset: 3:343d531512a3
| branch: solar
| tag: tip
| parent: 1:cb26642f8db5
| user: Ry4an Brase <ry4an@msi.umn.edu>
| date: Wed Mar 10 11:16:48 2010 -0600
| files: afile
| description:
| solar-change
|
|
| @ changeset: 2:c5d14e34db07
| | parent: 0:56465175b2fc
| | user: Ry4an Brase <ry4an@msi.umn.edu>
| | date: Wed Mar 10 11:05:44 2010 -0600
| | files: other-main-file
| | description:
| | moremain
| |
| |
o | changeset: 1:cb26642f8db5
|/ branch: solar
| user: Ry4an Brase <ry4an@msi.umn.edu>
| date: Wed Mar 10 11:04:32 2010 -0600
| files: solar-only
| description:
| solar-initial
|
|
o changeset: 0:56465175b2fc
user: Ry4an Brase <ry4an@msi.umn.edu>
date: Wed Mar 10 11:04:14 2010 -0600
files: afile
description:
initial
Changeset 1がソーラーブランチにファイルを追加することを確認できます。これは、デフォルトで望まないファイルです。 Changeset 3は、メイン、距離にも存在するファイルを調整しますが、その変更が発生するかどうかを手動で制御したいと考えています。
そうする hg update default ; hg merge -r solar
. 。マージツールがポップアップします afile
そして、これらの変更が必要な場合、ラインごとまたはチャンクごとに決定します。保存後、します hg stat
:
% hg stat
M afile
M solar-only
そして、ソーラーのみがデフォルトでコミットするためにキューに留められていることがわかります。 削除するだけです (と if
).
% hg rm -f solar-only
今 hg stat
削除されているようにそれを示します:
% hg stat
M afile
R solar-only
そして、私たちがコミットするとき、私たちは新しい変更セットで私たちが望むものを持っています。
他のヒント
あなたの最初の条件は、両方のブランチで作業を継続できるようにするために、単に枝を閉じないことで満足しています(あなたは --close-branch
のオプション hg commit
).
Cherry Pick Changesetsを使用して使用してマージできます 移植延長. 。これにより、デフォルトにマージする特定の変更セットのみを選択できます。
3番目の条件は、同じコミットで通常の車と太陽光発電車の両方の変更を混ぜ合わせなかった場合に、太陽電池から変化を免責して引き戻すことができ、心配する必要がないという考えによって満たされます。車の種類を混ぜます。
あなたはを見たいかもしれません internal
のオプションフラグ 構成ドキュメントをマージします それも。