私は実際には1つだけであるはずのコミットのペアを持っています。gitを使用している場合は、次のように使用します。
git rebase -i <some-commit-before>
そして、それらを押しつぶします。
水銀でできますか?もしそうなら、どうですか?
私は実際には1つだけであるはずのコミットのペアを持っています。gitを使用している場合は、次のように使用します。
git rebase -i <some-commit-before>
そして、それらを押しつぶします。
水銀でできますか?もしそうなら、どうですか?
回答:
私のお気に入りはhg strip --keep
コマンドです。そして、すべての変更を1つのコミットでコミットします。
毎日の作業中に小さなコミットをたくさんしたいので、これは私にとって最も速くて快適な方法です;)
注1:有効にstrip
するには組み込みの拡張機能が必要mq
です。
注2:私のお気に入りのGit / Mercurialクライアント(SmartGit / Hg)は、デフォルトの--keep
パラメータを中に追加しますstrip
。そしてさらに便利なのは、join commits
:] というオプションを提供することです。
hg strip --keep --rev [rev]
どこですかrev
--rev
は、オプションですが、完全なコマンドはhg strip --keep [rev]
hg help strip
与えhg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
、およびリビジョンを省略することは、私を与えますabort: empty revision set
。
hg strip
は最良のアイデアではありません。正確には安全ではありません。を試してみてくださいhg histedit
。おそらく、evolve拡張機能を使用してみてください。
リベースの拡張子は魅力のように働きました。2つのコミットをスカッシュするには:
$ hg rebase --dest .~2 --base . --collapse
ドットは現在のリビジョンのショートカットです。
ブランチにいくつかのコミットがあり、それらをすべて1つにまとめたい場合は、さらに簡単です。
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
仕組み:
(http://mercurial-scm.org/wiki/RebaseExtension#Collapsingから)
この回答を読んでいる場合は、この回答で言及されている他のすべてのオプションを忘れて
fold
、evolve拡張機能のコマンドを使用できます。
evolve
水銀の拡張であり、安全で変更可能な履歴を持つことができますが、まだ実験段階です。リポジトリからクローンを作成し、次のように.hgrcに追加することで使用できます。
[extensions]
evolve = ~/evolve/hgext/evolve.py
あなたがあなたのホームディレクトリにevolve repoをクローンしたと仮定します。これで準備完了です。ヘルプを探すこともできますhg help fold
。
あなたfold
は壊れていないコミットの線形チェーンをスカッシュ/フォールドするように言います。foldが行うことは、すべてのチェンジセットからの変更を含む新しいチェンジセットを作成し、それらのコミットをすべて廃止としてマークすることです。あなたはdocsでこれについてより深い見解を持つことができます。
次の履歴があるとします。
a -> b -> c -> d -> e -> f -> g
あなたはスカッシュにしたいe
、f
とg
。できるよ
hg up g
hg fold -r e
結果は
a -> b -> c -> d -> h
どこh
すべての3つのコミットからの変更を含むチェンジがあるe
、f
とg
。
履歴の途中からチェンジセットを折りたたむこともできます。つまり、必ずしもチップを含むチェーンを選択する必要はありません。あなたがフォールドしたいと仮定しb
、c
そしてd
。できるよ
hg up d
hg fold -r b
hg evolve --all
これは
a -> i -> j
どこi
の折り返しチェンジでb
、c
、d
とj
同じチェンジですh
。
Evolveユーザーガイドは必読です。
--keep
リベースのオプションはこれをカバーします(結果としてリビジョンをシークレットとしてマークするか、結果を確認したらストリップを削除します)。2つのrebaseコマンドのシーケンスを使用して、他のリビジョン間でリビジョンを移動することもできます。
Mercurial 4.8(2018年11月、9年後)では、新しいコマンドを検討できますhg absorb
(これは以前は試験的な機能でした)。
「を参照してください。Mercurialの4.8での変更点をコミット吸収」
吸収拡張は、作業ディレクトリの各変更を取得し、シリーズのどのコミットがその行を変更したかを把握し、そのコミットの変更を自動的に修正します。
あいまいな場合(つまり、複数のコミットが同じ行を変更した場合)、吸収はその変更を無視し、作業ディレクトリに残して手動で解決します。技術レベルで
hg absorb
は、コミットされていないすべての変更を検出し、変更された各行を明確な以前のコミットにマップしようとします。
きれいにマッピングできるすべての変更について、コミットされていない変更は、適切な以前のコミットに吸収されます。操作の影響を受けるコミットは自動的にリベースされます。
変更を明確な以前のコミットにマッピングできない場合、変更はコミットされずに残り、ユーザーは既存のワークフローにフォールバックできます(例:を使用hg histedit
)。の自動書き換えロジックは
hg absorb
、行の履歴をたどることによって実装されます。これは、hg histedit
or によるアプローチとは根本的に異なりgit rebase
、3ウェイマージに基づくマージ戦略に依存して、複数の入力が指定されたファイルの新しいバージョンを導出する傾向があります。バージョン。このアプローチとあいまいなアプリケーションコミットでhg吸収が変更をスキップするという事実を組み合わせると、hg吸収がマージの競合に遭遇することはありません!
ここで、あいまいなアプリケーションターゲットを含む行を無視すると、パッチは常に従来の3方向マージを使用してきれいに適用されます。このステートメントは論理的に正しいように聞こえます。しかしそれはそうではありません:
hg absorb
によって実行されたマージが失敗しhg histedit
たりgit rebase -i
失敗したりするときにマージの競合を回避できます。
chistedit
(Mercurial 2.3以降に組み込まれている)はそれに最も近いrebase -i
純粋なMercurial(chistedit
インタラクティブバージョンのhistedit
)だと思います。HISTEDITに一度fold
のコマンドは、リベースのにマップsquash
し、roll
リベースのにコマンドマップfixup
。詳細については、histedit docsを参照してください。
これは簡単な例です。次のものがあり、1e21c4b1のすべての変更を以前のリビジョンに移動し、以前のリビジョンのメッセージを保持したいとします。
@ 1e21c4b1 drees tip
| A commit you want to squash
o b4a738a4 drees
| A commit
o 788aa028 drees
| Older stuff
実行するhg chistedit -r b4a738a4
と、履歴を編集してb4a738a4に戻すことができます。chisteditでカーソルを下に移動して1e21c4b1に移動し、ヒットr
してそのリビジョンをロールすることを示します。histeditの順序(古いものから新しいものへ)がhg log
(新しいものから古いものへ)逆になっていることに注意してください。
#0 pick 160:b4a738a49916 A commit
#1 ^roll 161:1e21c4b1500c
変更を選択した後、c
それらをコミットすることを選択します。結果は次のとおりです。
@ bfa4a3beドリーのヒント| コミットo 788aa028ドリー| 古いもの
それらに比較的慣れていない場合は、参照用にhisteditファイルにコマンドの説明が記載されているので、histedit
選択するよりも良いでしょうchistedit
。通常のテキスト編集(通常のリベースと同様)を使用してコマンドを設定するには、もう少し編集が必要です。
どちらかを使用するには、histedit
または〜/ .hgrcの拡張機能にchistedit
追加histedit
する必要があります。
[extensions]
histedit =
歴史にchistedit
最も近く、rebase -i
どこでも機能するので、提案しました。あなたが本当に現在のリビジョンを以前のリビジョンに包含/微調整したい場合は、@ G。strip
何が起こっているのかは明らかであるため、デメッキの提案は良いことです。Mercuria 2.8以降に組み込まれています。上記と同等の結果を得るには、次のようにします。
hg strip .
hg add
hg commit --amend
strip
histeditと同様に、〜/ .hgrcで有効にする必要があることに注意してください。
[extensions]
strip =
最近の2つのコミットを押しつぶす(統合する)と仮定します。
リビジョン番号を見つける
hg log -G -l 3
可能な出力:
@ changeset: 156:a922d923cf6f
| branch: default
| tag: tip
| user: naXa!
| date: Thu Dec 13 15:45:58 2018 +0300
| summary: commit message 3
|
o changeset: 155:5feb73422486
| branch: default
| user: naXa!
| date: Thu Dec 13 15:22:15 2018 +0300
| summary: commit message 2
|
o changeset: 154:2e490482bd75
| branch: default
~ user: naXa!
date: Thu Dec 13 03:28:27 2018 +0300
summary: commit message 1
ソフトリセットブランチ
hg strip --keep -r 155
変更を再度コミット
hg commit -m "new commit message"
strip
組み込みの拡張機能を有効にする必要があります。~/.hgrc
次の内容の構成ファイルを作成/編集します。
[extensions]
strip =