219

git commit --amendMercurial で対応するもの、つまり作業コピーがリンクされているコミットを変更する方法を探しています。任意の以前のコミットではなく、最後のコミットのみに関心があります。

この修正手続きの要件は次のとおりです。

  • 可能であれば、拡張子は必要ありません。デフォルト以外の拡張機能、つまり公式の Mercurial インストールに付属していない拡張機能を必要としてはなりません。

  • 修正するコミットが現在のブランチの 1 つのヘッドである場合、新しいヘッドを作成する必要はありません。コミットがヘッドでない場合、新しいヘッドが作成されることがあります。

  • 手順は、何らかの理由で修正が失敗した場合に、修正前と同じ作業コピーとリポジトリの状態を復元したいという意味で安全でなければなりません。言い換えれば、修正自体が失敗する可能性がある場合、作業コピーとリポジトリの状態を復元するためのフェールセーフ手順が必要です。ファイルシステム関連の問題(アクセス制限、書き込みのためにファイルをロックできないなど)ではなく、修正手順の性質にある「失敗」(競合など)について言及しています。 )

更新 (1):

  • 手順は自動化可能である必要があるため、ユーザーの操作を必要とせずに GUI クライアントで実行できます。

更新 (2):

  • 作業ディレクトリ内のファイルは変更しないでください (変更された特定のファイルにファイル システム ロックが適用される場合があります)。これは特に、考えられるアプローチではクリーンな作業ディレクトリを必要としない可能性があることを意味します。
4

8 に答える 8

296

Mercurial 2.2のリリースでは、--amendwith オプションを使用してhg commit、最後のコミットを現在の作業ディレクトリで更新できます。

コマンドラインリファレンスから:

--amend フラグを使用して、現在 hg status によって報告されている変更に加えて、親の変更を含む新しいコミットで作業ディレクトリの親を修正できます (存在する場合)。古いコミットは、.hg/strip-backup のバックアップ バンドルに保存されます (復元方法については、hg ヘルプ バンドルおよび hg ヘルプ アンバンドルを参照してください)。

メッセージ、ユーザー、および日付は、指定されていない限り、修正されたコミットから取得されます。コマンドラインでメッセージが指定されていない場合、エディターは修正されたコミットのメッセージで開きます。

すばらしいことに、このメカニズムは「安全」です。比較的新しい「フェーズ」機能に依存して、ローカル リポジトリの外で既に利用可能になっている履歴を変更する更新を防止するためです。

于 2012-05-02T18:46:37.820 に答える
55

Mercurial でコミットを編集するには、3 つのオプションがあります。

  1. hg strip --keep --rev -1最後の(1)コミットを元に戻して、もう一度実行できるようにします(詳細については、この回答を参照してください)。

  2. Mercurial に同梱されているMQ 拡張機能の使用

  3. Mercurial に同梱されていない場合でも、Histedit拡張機能について言及する価値があります。

Mercurial wikiのEditing Historyページも参照できます。

要するに、履歴の編集は本当に大変で落胆します。既に変更をプッシュしている場合は、他のすべてのクローンを完全に制御できる場合を除いて、できることはほとんどありません。

私はこのgit commit --amendコマンドにあまり詳しくありませんが、私の知る限り、Histedit が最も近いアプローチのようですが、残念ながら Mercurial には同梱されていません。MQ を使用するのは非常に複雑ですが、MQ を使用してほぼすべてのことを行うことができます。

于 2011-11-18T13:34:04.903 に答える
39

に相当する GUI hg commit --amend:

これは TortoiseHG の GUI からも機能します (私は v2.5 を使用しています)。

「コミット」ビューに切り替えるか、ワークベンチ ビューで「作業ディレクトリ」エントリを選択します。「コミット」ボタンには、「現在のリビジョンを修正する」というオプションがあります (ボタンのドロップダウン矢印をクリックして見つけます)。

ここに画像の説明を入力

          ||
          ||
          \/

ここに画像の説明を入力

警告エンプター:

この追加オプションは、Mercurial のバージョンが 2.2.0 以上で、現在のリビジョンが公開されておらず、パッチではなく、子を持っていない場合にのみ有効になります。[...]

ボタンをクリックすると、「commit --amend」が呼び出され、リビジョンが「修正」されます。

詳細については、THG dev チャンネルをご覧ください。

于 2013-01-04T11:04:08.223 に答える
7

私はkrtekが書いたものに耳を傾けています。より具体的には、解決策 1:

仮定:

  • 1 つの (!) 変更セットをコミットしましたが、まだプッシュしていません
  • このチェンジセットを変更したい (例: ファイルやコミットメッセージの追加、削除、変更)

解決:

  • hg rollback最後のコミットを元に戻すために使用します
  • 新しい変更を加えて再度コミットします

ロールバックは、最後の操作を実際に元に戻します。その作業方法は非常に単純です。HG での通常の操作は、ファイルに追加するだけです。これにはコミットが含まれます。Mercurial は最後のトランザクションのファイル長を追跡しているため、ファイルを元の長さに切り詰めることで、1 つのステップを完全に元に戻すことができます。

于 2011-11-18T13:47:33.280 に答える
7

変更をまだ反映していないと仮定すると、次のことができます。

  • .hgrc に追加します。

    [extensions]
    mq =
    
  • リポジトリで:

    hg qimport -r0:tip
    hg qpop -a
    

    もちろん、リビジョン 0 から始めたり、すべてのパッチをポップする必要はありません。最後の 1 つのポップ ( hg qpop) だけで十分です (以下を参照)。

  • ファイルの最後のエントリ.hg/patches/series、または気に入らないパッチを削除します。再注文も可能です。

  • hg qpush -a; hg qfinish -a
  • .diffまだ .hg/patches にあるファイル (適用されていないパッチ) を削除します (この場合は 1 つである必要があります) 。

すべてのパッチを元に戻したくない場合は、 を使用して(または同様の方法で) 編集し、編集して を使用して、スタックの一番上のパッチに変更をマージします。読んでください。hg qimport -r0:tiphg qrefreshhg help qrefresh

を編集.hg/patches/seriesすることで、複数のパッチを削除したり、一部を並べ替えたりすることもできます。最後のリビジョンが 99 の場合は、そのまま使用できますhg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a

もちろん、この手順は非常にお勧めできませんし、リスクも伴います。これを行う前に、すべてのバックアップを作成してください。

余談ですが、私はプライベート専用リポジトリで何百万回も実行しました。

于 2011-11-18T14:04:37.737 に答える