web-dev-qa-db-ja.com

Mercurialでコミットをスカッシュできますか?

本当に1つだけのコミットのペアがあります。 gitを使用していた場合、次を使用します。

git rebase -i <some-commit-before>

そして、それらをつぶします。

水銀でそれをすることはできますか?もしそうなら、どのように?

103

はい、 変更セットの連結 により、拡張機能なしでMercurialを使用してこれを行うことができます。

または、拡張機能を使用する場合は、次の方法を使用できます。

87
Ry4an Brase

私のお気に入りはhg strip --keepコマンドです。そして、1回のコミットですべての変更をコミットします。

毎日の仕事中に多くの小さなコミットをするのが好きなので、これは私にとって最も速くて最も快適な方法です;)


注1:stripを有効にするには、組み込みの拡張機能mqが必要です。
注2:私のお気に入りのGit/Mercurialクライアント(SmartGit/Hg)は、stripの間にデフォルトで--keepパラメーターを追加します。さらに便利なのは、join commitsというオプションを提供することです:]

40
G. Demecki

Rebase extension はチャームのように機能しました。 2つのコミットをつぶすには:

$ hg rebase --dest .~2 --base . --collapse

ドットは現在のリビジョンのショートカットです。

ブランチでいくつかのコミットがあり、それらをすべて1つにまとめたい場合はさらに簡単です。

$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse

仕組み:

enter image description here

http://Mercurial-scm.org/wiki/RebaseExtension#Collapsing から)

31
Martin Konicek

この回答を読んでいる場合、この回答に記載されている他のすべてのオプションを忘れて、 evolve extension からfoldコマンドを使用できます。

evolveはMercurialの拡張機能であり、安全で変更可能な履歴を作成するのに役立ちますが、まだ実験的です。 repo からクローンを作成し、このように.hgrcに追加することで使用できます。

[extensions]
evolve = ~/evolve/hgext/evolve.py

クローンを作成すると、ホームディレクトリにリポジトリが展開されます。これで準備完了です。 hg help foldでヘルプを探すこともできます。

Fold Command

foldに、壊れていないコミットの線形チェーンを押しつぶす/折りたたむように指示します。 foldが行うことは、すべての変更セットからの変更を含む新しい変更セットを作成し、それらすべてのコミットを廃止としてマークすることです。 docs でこれをより深く見ることができます。

次のような履歴があるとします。

a -> b -> c -> d -> e -> f -> g

ef、およびgをつぶします。できるよ

hg up g
hg fold -r e

結果は

a -> b -> c -> d -> h

ここで、hは、3つのコミットef、およびgのすべての変更を含む変更セットです。

履歴の途中からチェンジセットをフォールドすることもできます。つまり、必ずしもチップを含むチェーンを選択する必要はありません。 bc、およびdを折りたたみたいとします。できるよ

hg up d
hg fold -r b
hg evolve --all

これにより、

a -> i -> j

ここで、ibcdおよびjの折り畳まれたチェンジセットはhと同じチェンジセットです。 。 Evolveユーザーガイド は必読です。

12
Pulkit Goyal

私が使う:

hg phase --draft --force -r 267
...
hg rebase --dest 282 --source 267 --collapse
0
sasha-ch

最新の2つのコミットをスカッシュ(統合)したいとします。

  1. リビジョン番号を見つける

    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
    
  2. ソフトリセットブランチ

    hg strip --keep -r 155
    
  3. 変更を再度コミットする

    hg commit -m "new commit message"
    

ノート

stripを有効にするには、組み込みの拡張機能が必要です。作成/編集~/.hgrc次の内容の設定ファイル:

[extensions]
strip = 
0
naXa

chistedit(Mercurial 2.3以降に組み込まれている)は、純粋なMercurialであるrebase -iに最も近いと思います(chistedithisteditの対話型バージョンです)。 histeditに入ると、foldコマンドはrebaseのsquashにマップされ、rollコマンドはrebaseの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 drees tip | 788aa028 dreesのコミット|古いもの

比較的初心者の場合は、histeditchisteditよりも適切な選択になる可能性があります。これは、参照用にhisteditファイルでコマンドの説明を提供するためです。通常のテキスト編集(通常のリベースと同様)を使用してコマンドを設定するには、もう少し編集が必要です。

histeditまたはchisteditを使用するには、〜/ .hgrcの拡張機能にhisteditを追加する必要があります。

[extensions]
histedit =

rebase -iに最も近く、履歴のどこでも動作するため、chisteditを推奨しました。現在のリビジョンを前のリビジョンにサブスクライブ/微調整する場合は、@ Gを選択します。何が起こっているのかは明らかなので、Demeckiのstrip提案は良いかもしれません。 Mercuria 2.8以降に組み込まれています。上記と同等の結果を得るには、次を実行できます。

hg strip .
hg add
hg commit --amend

stripは、histeditと同様に、〜/ .hgrcで有効にする必要があります。

[extensions]
strip =
0
studgeek