Info
#

2025/06/23 (Mon) 08:01:23 GMT+0000 (UTC)
Type: PC | System: Unknown | Browser: Unknown ... More

Menu
.
+
#
  • @ /note/git/post-OverwriteCommit
Content
.
+
#

Post: Nekoformi
Date: 2024/04/15

Overwrite Commit

リポジトリーの奥底で眠っていた古のコミットに過ちが発覚しても絶望しないでください! 過去のコミットや歴史を操作する方法があります!

過去のコミットを上書きする

前回のコミットを修正したい場合や特定のコミットへ遡り内容を上書きしたい(それ以降の変更を対象に纏める)場合は、以下の操作を行います。

  1. 特定のコミット(まで)をリセット:resetで取り消します。
    • コミットIDについてはlogで確認できます。
    • HEADは現在のブランチの地点を示すものであり、HEAD~nでn世代前のコミット(n世代目の親コミット)を指定することができます。
    • 最初のコミットを対象とする場合はupdate-refを使用する必要があります。
Bash
+
#
1:
2:
3:
4:
5:
6:
7:
8:
// 直前のコミットを対象とする場合 $ git reset --soft HEAD~ // 特定のコミット(まで)を対象とする場合 $ git reset --soft コミットID // 最初のコミット(まで)を対象とする場合 $ git update-ref -d HEAD
  1. 内容を編集してステージング:addします。今回はオプション:--softを指定しているので、上記のコマンドを実行する前に作業が完了している(ステージングされている)場合はそのまま次へ進みます。
Bash
+
#
1:
$ git add .
  1. コミット:commitします。
Bash
+
#
1:
$ git commit --amend
  1. プッシュ:pushします。破壊的な操作なのでオプション:--forceを付与する必要があります。
Bash
+
#
1:
$ git push --force origin
  1. 無事にコミットが上書きされました。

歴史を改変する

今までのコミットを取り消すのではなく、特定のコミットを上書きする(初めから修正された内容が存在した状態で以降のコミットが構成されるようにする)場合は、以下の操作を行います。

  1. リベース:rebaseで上書きしたいコミットへ戻ります。この時、対象のコミットIDではなく対象の親のコミットIDを指定してください!
    • オプション:-iで対話的(直感的)に操作を指定することができます。
    • 最初のコミットまで遡る場合はコミットIDではなくオプション:--rootを使用する必要があります。
Bash
+
#
1:
2:
3:
4:
5:
// 特定のコミットに遡る場合 $ git rebase -i コミットID // 最初のコミットに遡る場合 $ git rebase -i --root
  1. 設定したエディターに応じて(nanoやviの場合はターミナル上で、Visual Studio Code等のIDEを指定している場合は出力されたファイルで)上書きしたい地点を指定します。保存して閉じることで処理が始まります。
  2. 内容を編集してステージング:addします。
Bash
+
#
1:
$ git add .
  1. コミット:commitします。
Bash
+
#
1:
$ git commit --amend
  1. リベース:rebaseします。コンフリクト(衝突)が起きた場合は解消してからリベースを再開しましょう。
Bash
+
#
1:
$ git rebase --continue
  1. プッシュ:pushします。破壊的な操作なのでオプション:--forceを付与する必要があります。
Bash
+
#
1:
$ git push --force origin
  1. 無事に歴史が改変されました。