1. ホーム
  2. mercurial

[解決済み】Mercurial:最後のコミットを修正する方法は?

2022-04-22 03:32:54

質問

の対極にあるものを探しています。 git commit --amend Mercurial のコミット、つまり作業コピーをリンクしているコミットを変更する方法です。私は最後のコミットにのみ興味があり、任意の以前のコミットには興味がありません。

このamend-procedureの要件は以下の通りです。

  • 可能であれば、拡張機能を必要としないこと。そのためには デフォルト以外の拡張機能を必要としない つまり、Mercurial の公式インストールに付属していないエクステンションです。

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

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

アップデート(1)です。

  • というプロシージャである必要があります。 自動化可能 そのため、ユーザーの操作を必要とせず、GUIクライアントで実行することができます。

アップデート(2)。

  • 作業ディレクトリにあるファイルに触れてはいけません(特定の変更されたファイルに対してファイルシステムロックがかかる場合があります)。これは特に、可能なアプローチは、クリーンな作業ディレクトリを必要としないかもしれないことを意味します。

解決方法は?

のリリースに伴い マーキュリアル2.2 を使用することができます。 --amend オプションで hg commit 最後のコミットを現在の作業ディレクトリで更新する場合

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

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

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

このメカニズムが素晴らしいのは、比較的新しい "Phases" 機能に依存しているため、ローカルリポジトリの外部ですでに利用可能になっている履歴を変更するような更新を防ぐことができ、"safe" な点です。