nikkie-ftnextの日記

イベントレポートや読書メモを発信

git commit --amendで楽々コミット修正

はじめに

楽してこーぜ! nikkieです。

開発中はコマンドラインからgit commitすることが多いのですが、最近--amendオプションが非常に便利と気付きました。
知ったことで開発を捗らせてくれているgit commit --amendの世界へ、皆さまをご案内します。

目次

伝えたいこと:git commit --amendで簡単にコミットを修正できるぞ

--amendオプションを付けると、直前1のコミットを修正できます。
以下のシーンで使えます:

  • 直前のコミットのコミットメッセージを修正したいとき:git commit --amend
  • 直前のコミット自体に変更を追加したいとき
    1. 加えたい変更をステージング
    2. git commit --amend --no-edit

git commit --amendとは(Git Guidesより)

いろいろできるgit commitコマンド。
GitHubが公開しているGit Guidesを参照してみましょう。

この記事で取り上げる--amendについては「Updating Commits With Git Commit Amendgit commit amendでコミットを更新する)」にあります。

While git commit --amend does change history, it only changes the most recent commit on your current branch.

(意訳) git commit --amendは歴史を改変するけれども、変えるのは現在のブランチの最新のコミットだけだ

次のコミットにamendがめっちゃ便利(extremely useful)と紹介しています。

  • リモートにまだpushされていないコミット (Haven't been pushed to the remote yet)
  • コミットメッセージにスペルミスがあるコミット (Have a spelling error in the commit message)
  • 含めたい変更を含んでいないコミット (Don't contain the changes that you'd like to contain)

nikkieとgit commit --amend

--amendは直前のコミットメッセージの修正だと長いこと思い込んでいました。

直前のコミット自体が修正できると気付いたのは、ふとした偶然です。
次のコミットに含めたい変更をステージングした状態で、最新のコミットメッセージのtypoに気付きました。
そこでgit commit --amendでメッセージを編集したところ、ステージングしていた変更がありません。
コミットメッセージだけを修正したのではなく、コミット自体を修正していたのです!

これに気付いてからはコミットを作るときに、より肩の力が抜けるようになりました。
コミット自体はgit rebase -iで修正できるのでたまにrebaseすることがありました。
これを最新のコミットについてやるのはちょっと手数が多いため、頻繁に使わなくてもいいように確認してコミットしていました。

しかし、git commit --amendを知った今、確認を一切しなくてもコミットできます!
なぜなら、直すのはめっちゃ簡単だからです。

このアウトプットを機に知った--no-edit

変更をステージングした状態でgit commit --amendするとコミットメッセージの編集に入ります。
--no-editオプションを指定すると、これをスキップできることをドキュメント2を追っていて知りました!

Use the selected commit message without launching an editor.
For example, git commit --amend --no-edit amends a commit without changing its commit message.

(意訳) エディタを立ち上げることなく、選択されたコミットメッセージを使う。
例えば、git commit --amend --no-editはコミットメッセージを変えることなくコミットを修正する

コミットメッセージ編集用のエディタを閉じるという手数が減るので、ますます気軽にコミットできます🙌

Oh Shit, Git!?!でも紹介

少し前にTwitterで回ってきた「Oh Shit, Git!?!」3にも--amendの紹介がありました4

終わりに

git commit --amendが直前のコミット自体を変更していることに気付き、さらに--no-editオプションを知り、ますます楽々開発できそうです。

一度行った操作を簡単に変更できる(戻せたり修正できたりする)って、気張らずに操作できるので「私にとってはすごい価値だな〜」と感じます。
他にもないか探してみよう!

この記事は、Oh Shit, Git!?!にもある、以下を承知している前提で書いています。

コミットをamendするのはローカルコピーだけにしておくこと、じゃないとひどい目にあうから。

git commit --amendで楽々コミット修正できますが、その恩恵が受けられるのはpushする前だけです。
念押しですが、ここだけはご注意ください。


  1. 「最新」と同じ意味で使っています
  2. https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---no-edit
  3. 上品なバージョンは https://dangitgit.com/ja だそうです。お好みでどうぞ
  4. 今回のアウトプットを機に思い出して確認しています