Git の履歴を書き換える | git commit --amend

git commit –amend コマンド

git commit --amend は、直前のコミットを修正したい場合に便利なコマンドである。このコマンドを実行すると、まったく新しいスナップショットをコミットするのではなく、ステージ済みの変更内容と直前のコミットを結合する。また、スナップショットに変更を加えず、単に前回のコミットメッセージを編集したい場合にも便利である。

Git チュートリアル: git commit --amend

ただし、直前のコミットを修正することは、そのコミットをその場で上書きすることではなく、まったく別のコミットに置き換えることを意味する。Git では、チュートリアル図のアスタリスクのように新しいコミットとして見える。公開リポジトリで作業する場合は、この点を覚えておく必要がある。

使い方

git commit --amend

ステージ済みの内容を直前のコミットと結合し、その結果生成されたスナップショットで直前のコミットを置き換えるコマンドである。ステージング領域に何もない状態でこのコマンドを実行すると、スナップショットを変更せずに前回のコミットメッセージだけを編集できる。

補足説明

開発現場では、不完全なコミットが行われることは日常的にある。ファイルのステージングを忘れたり、コミットメッセージの形式を間違えたりする場合がある。--amend フラグは、このような軽いミスを修正する場合に便利である。

公開済みコミットの修正は禁止

git reset のページでは、他の開発者と共有中のコミットを取り消してはいけない理由を説明した。修正についても同じことが成り立つ。公開リポジトリに push されたコミットを修正してはならない。

修正されたコミットは実際には完全に新しいコミットであり、以前のコミットはプロジェクト履歴から見えなくなる。これは公開済みコミットを reset した場合と似た問題を引き起こす。他の開発者がすでに作業の基盤として使っているコミットを修正すると、彼らの作業の基盤が失われたように見える。これは開発者を混乱させ、その後の復旧も面倒になる。

使用例

次の例では、Git ベースの開発でよくあるシナリオを示す。2 つのファイルを編集して 1 つのスナップショットとしてコミットする予定だったが、最初のコミット時に片方のファイルを追加し忘れたとする。この修正には、単にそのファイルをステージし、--amend フラグを指定してコミットすればよい。

# Edit hello.py and main.py
git add hello.py
git commit

# Realize you forgot to add the changes from main.py
git add main.py
git commit --amend --no-edit

通常は、前回のコミットメッセージを表示するためにエディタが開かれる。--no-edit フラグを指定すると、コミットメッセージを変更せずにコミットを修正できる。必要であればメッセージを修正し、通常どおりファイルを保存して閉じる。結果として生成されるコミットは不完全なコミットを置き換え、hello.pymain.py の変更内容が 1 つのスナップショットとしてコミットされたように見える。