Skip to content

おまけ4: 修正コミット

commitを作成した後に、そのcommitに加え忘れた変更や加えるべきでなかった変更が見つかることがあります。そういった状況では修正コミットを使うことができます。

まずはこのように、main.cppmylib.hpp2つのファイルが存在してGitに管理されていない状況だとしましょう。

bash
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	main.cpp
	mylib.hpp

nothing added to commit but untracked files present (use "git add" to track)

これら2つのファイルを同時にcommitするはずが、誤ってmain.cppだけをcommitしてしまいました。

bash
$ git add main.cpp
$ git commit -m "Use mylib"
[main cc01309] Use mylib
 1 file changed, 1 insertion(+)
 create mode 100644 main.cpp
# mylib.hppがcommitされていない!
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	mylib.hpp

nothing added to commit but untracked files present (use "git add" to track)

git logでcommitログを確認すると, mylib.hppが記録されていません。

bash
$ git log --stat
commit cc01309bcfbfe072747133019f7a34d5dcff3934 (HEAD -> main)
Author: H1rono <hronok66@gmail.com>
Date:   Thu May 9 19:15:32 2024 +0900

    Use mylib

 main.cpp | 1 +
 1 file changed, 1 insertion(+)

# 過去のcommitが表示される ...

修正したい変更をstaging areaに上げてgit commit --amendを行うことで直近のcommitを修正することができます。

bash
# staging areaにmylib.hppを上げる
$ git add mylib.hpp
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   mylib.hpp
$ git commit --amend -m "Use mylib"
[main a408ebc] Use mylib
 Date: Thu May 9 19:15:32 2024 +0900
 2 files changed, 2 insertions(+)
 create mode 100644 main.cpp
 create mode 100644 mylib.hpp

--amendで修正後のcommitログを見ると、確かに直近のcommitが修正されていることがわかります。

bash
$ git log --stat
commit a408ebca11a05e5aed16e5cdcc993bb5fff2ab50 (HEAD -> main)
Author: H1rono <hronok66@gmail.com>
Date:   Thu May 9 19:15:32 2024 +0900

    Use mylib

 main.cpp  | 1 +
 mylib.hpp | 1 +
 2 files changed, 2 insertions(+)

# 過去のcommitが表示される ...

ただし、この方法では2つ以上前のcommitを修正することはできません。git rebasegit resetを使用してください(ここでは説明しません)。また、GitHubなどのリモートリポジトリにcommitの修正は反映されないため、注意してください。

TIP

force pushでcommitの修正をリモートリポジトリに反映させることができますが、この方法はあまり推奨されません。

まとめ

  • git commit --amendで直近のcommitを修正できる
  • 複数のcommitを修正したい場合はgit rebaseを使う

参照