次のような分岐のない改訂履歴があるとします。
1
2
3
4
1
ここで、リビジョンとを使用してリポジトリに新しいブランチを作成しますが、リビジョンまたはは作成し3
ません。リビジョン/に競合する更新はありません。これを行う方法はありますか。私の最終的なリポジトリには、次のような 2 つのブランチが必要です。2
4
2
3
4
3
2 3
| /
|/
1
次のような分岐のない改訂履歴があるとします。
1
2
3
4
1
ここで、リビジョンとを使用してリポジトリに新しいブランチを作成しますが、リビジョンまたはは作成し3
ません。リビジョン/に競合する更新はありません。これを行う方法はありますか。私の最終的なリポジトリには、次のような 2 つのブランチが必要です。2
4
2
3
4
3
2 3
| /
|/
1
このリポジトリをパブリックな場所に既に公開している (または開発者がリポジトリを複製している) 場合は、 と を組み合わせてこれを行うことができgraft
ますbackout
。
このgraft
コマンドは、あるブランチから別のブランチにコミットをコピーします。このbackout
コマンドは、以前のコミットによって行われた変更を元に戻します。
次の例は、状況を再現する必要があります。
hg init test
echo test>>test\test.txt && hg -R test ci -Am "baseline"
echo test>>test\test.txt && hg -R test ci -Am "changeset 1"
echo test>>test\test.txt && hg -R test ci -Am "changeset 2"
echo new>>test\new.txt && hg -R test ci -Am "changeset 3"
echo test>>test\test.txt && hg -R test ci -Am "changeset 4"
hg -R test backout -r 3
hg -R test ci -m "backed out changeset 3"
hg -R test update -r 1
hg -R test graft -r 3
hg -R test glog --template "{desc}\n"
これにより、必要な変更を加えた新しい匿名ブランチが作成され、リポジトリの履歴を変更することなく、元のブランチから rev 3 の変更が削除されます。
これにより、次のログが生成されます。
@ changeset 3
|
| o backed out changeset 3
| |
| o changeset 4
| |
| o changeset 3
| |
| o changeset 2
|/
o changeset 1
|
o baseline
名前付きブランチについては何も言わなかったので、匿名ブランチを使用します
前:
>hg glog --template "{rev}:{desc}\n"
@ 3:Added d.txt
|
o 2:Added c.txt
|
o 1:Added b.txt
|
o 0:Initial commit
>hg rebase -s 2 -d 0
>hg glog --template "{rev}:{desc}\n"
@ 3:Added d.txt
|
o 2:Added c.txt
|
| o 1:Added b.txt
|/
o 0:Initial commit
>hg rebase -s 3 -d 1
>hg glog --template "{rev}:{desc}\n"
@ 3:Added c.txt
|
| o 2:Added d.txt
| |
o | 1:Added b.txt
|/
o 0:Initial commit
名前付きブランチの場合、最初のリベースの前にhg branch BRANCHNAME
、hg ci -m "Creating branch"
リベースで0ではなく-d4を使用する必要があります
あなたのコメントから、あなたは「チェリーピッキング」と呼ばれるものを達成しようとしているように思えます:マージとして扱わずに、いくつかの変更セットを別のブランチに選択的にコピーします。それが正しければ、最初にリビジョン 1 から通常のブランチを作成し、コピーしたい変更セットをそこに移植することで、それを行うことができます。コマンドhg 移植は、この目的のために設計されています。
名前付きブランチでどのように機能するかを次に示しますselective
。名前のないブランチが必要な場合は、ブランチの作成を省略してください。
hg update -r 1
hg branch selective
hg graft -r 3
結果は次のようになります (これが希望どおりであることを願っています)。
4
|
3
| 5 = 3
2 /
|/
1
|
0
デフォルトでは、接ぎ木はソース変更セットからユーザー、日付、および説明をコピーします。新しいリビジョンはリビジョン 3 と同じ効果がありますが、新しい数値とハッシュ ID を持ちます。Mercurial は、リビジョン 3 と 5 の間の関係を認識しません。
一部の変更セットを選択的にインポートして、その操作をマージとして扱う方法はありません。マージでは、マージされる時点までの完全な (線形の) 履歴が常に統合されます。