[解決済み】Hg: git の rebase のようなリベースを行う方法
質問
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
というのは、ローカルで不要なコミットが残ってしまい、それを削除しなければならないからです。
- 同じリンクにあるもう一つのオプションは
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の答えを選びに行こうか :)
関連
-
[解決済み】未マージファイルがあるため、Gitマージができない
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] git rebase の取り消し
-
[解決済み] Git のリモートブランチを作成する方法を教えてください。
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】以下の追跡されていないワーキングツリーファイルは、マージによって上書きされますが、私は気にしません。
-
[解決済み】ファイルのアンリンクに失敗しました。もう一度試してみるべきですか?
-
[解決済み] あなたのブランチは 'origin/master' より 3 コミット進んでいます。
-
[解決済み】未マージファイルがあるため、Gitマージができない
-
[解決済み] リモートの <ブランチ名> とマージするように設定されていますが、そのような参照は取得されませんでしたか?
-
[解決済み】ローカルGitブランチとそのリモートブランチを比較する方法
-
[解決済み] Git pull - マージする前に移動または削除してください。
-
[解決済み] ブラウンアウトの一環として、パスワード認証が一時的に無効になっています。代わりに個人用アクセストークンを使用してください[重複]。
-
[解決済み] GitのFETCH_HEADとはどういう意味ですか?
-
[解決済み] git リモートリポジトリには、ローカルブランチにマージされていないコミットが含まれています。