1. ホーム
  2. ギット

[解決済み】Hg: git の rebase のようなリベースを行う方法

2022-04-10 14:05:50

質問

Gitでは、こんなことができます。

1. 新機能の作業を開始します。
$ git co -b newfeature-123 # (ローカル機能開発ブランチ)
いくつかのコミットを行う (M, N, O)

マスター A--B--C
                \
newfeature-123 M---N--O

2. 上流のマスターから新しい変更を取り込みます。
$ git pull
(マスターはff-commitで更新)

マスター A--B--C--D--E--F
                \
newfeature-123 M--N--O

3. マスターからリベースして、私の新機能を 
は、最新の上流の変更に対して開発することができます。
(newfeature-123 から)
git rebase master

マスター A--B--C--D--E--F
                            \
newfeature-123 M---N--O



Mercurialで同じことをする方法を知りたくて、ウェブを探し回って答えを探しましたが、一番良かったのは、次のようなものでした。 git rebase - hgでできること

そのリンク先では2つの例が紹介されています。

1. これは認めます。(例のリビジョンを私自身の例のリビジョンに置き換える)

hg up -C F  
hg branch -f newfeature-123  
hg transplant -a -b newfeature-123 

は悪くないのですが、リベース前の M-N-O をマージされていないヘッドとして残し、更新された本線からブランチすることを表す 3 つの新しいコミット M',N',O' を作成する点が異なります。

基本的に問題は、このようになることです。

マスター A--B--C--D--E--F
                \ \
newfeature-123 \ M'---N'---O'
                  \
newfeature-123 M--N--O

というのは、ローカルで不要なコミットが残ってしまい、それを削除しなければならないからです。

  1. 同じリンクにあるもう一つのオプションは
hg qimport -r M:O
hg qpop -a
hg up F
hg branch newfeature-123
hg qpush -a
hg qdel -r qbase:qtip

で、これは目的のグラフになります。

マスター A--B--C--D--E--F
                            \
newfeature-123 M---N--O

が、これらのコマンドは(6つとも!)とても複雑に見えますが

git rebase master

Hgでこれに相当するのはこれだけなのか、それともGitのようにシンプルな他の方法が利用できるのか知りたいのです。

どのように解決するのですか?

VonCは あなたが探している答え Rebase Extensionのことです。 しかし、なぜ mercurial では mq も rebase もデフォルトで有効になっていないのかについて、1、2秒考えてみる価値はあるでしょう:それは mercurial が indelible changesets について全て知っているからです。 あなたのおっしゃるような作業をほぼ毎日行う場合、私が取るパターンは以下の通りです。

1. Start working on a new feature:
$ hg clone mainline-repo newfeature-123
do a few commits (M, N, O)

master A---B---C
                \
newfeature-123   M---N---O

2. Pull new changes from upstream mainline:
$ hg pull

master A---B---C---D---E---F
                \
newfeature-123   M---N---O

3. merge master into my clone so that my new feature 
can be developed against the latest upstream changes:
(from newfeature-123)
$ hg merge F

master A---B---C---D---E---F
                \           \
newfeature-123   M---N---O---P

で、本当にこれだけです。 私は最終的に newfeature-123 のクローンを作り、それが気に入ったら簡単にメインラインにプッシュバックすることができます。 しかし、最も重要なことは、私は 歴史を変えない . 誰かが私のコードセットを見て、それらが元々何に対してコード化されていたのか、そして私が仕事を通してメインラインの変更にどう反応したのかを見ることができます。 すべてのデッドエンドやリファクタリングは消えない痕跡を残すべきで、リベースや他の履歴編集技術はそれを隠してしまうのです。

さて、石鹸箱を片付けている間にVonCの答えを選びに行こうか :)