未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Git&GitHub】直前のコミットをやり直す(git commit --amendコマンド)

title


直前のコミットをやり直そう

今回は直前のコミットをやり直す方法について解説します。


例えば「何か変更をコミットし忘れた」とか、「コミットメッセージを書き直したい」とか、直前のコミットを修正したい時のケースについて解説していきます。


直前のコミットをやり直すコマンドは「git commit --amend」コマンドになります。


「amend」というのは修正する、改正するという意味です。

このコマンドで直前のコミットをやり直すことができます。


ではまず、イメージで何が起こっているかを押さえておきましょう。


今何かの変更をコミットした直後だとします。

コミットした後に「このファイルの修正を忘れてた」と修正内容が漏れていたことに気が付きました。

その場合どのようにしたら良いでしょうか。


まずワークツリーのファイルに変更を加えて「git add」でステージに追加していきます。

そしてステージに追加したら「git commit --amend」コマンドを使って直前のコミットを修正します。


直前のコミットのやり直し


この「git commit --amend」コマンドを使うと、今のステージの状態を元に直前のコミットを作り直す、やり直すと言う事をします。今のステージの内容でコミットを上書きすることで直前のコミットを修正していると言うことです。


ところで、このコマンド、使う際に1点注意点があります。

リモートリポジトリにプッシュしたコミットに関してはやり直してはいけないということに気をつけてください。


なぜかというと、自分とは別の人であるAさんが、自分がプッシュしたコマンドをAさんのワークツリーに取り込んで何か作業していたとします。

その状態で自分が直前のコミットはやっぱりやり直したいと思って「git commit --amend」コマンドを使ってコミットをやり直してから再度プッシュしました。

すると何が起きるかというと、リモートリポジトリの履歴の状態とAさんの履歴の状態が別の物になってしまいます。

すると、Aさんが変更を加えてその変更をリモートリポジトリに取り込もう、統合しようとした時に履歴の状態が違うから取り込めないよということが起こります。

そのため、リモートリポジトリにプッシュしたコミットに関しては絶対にそのコミットの内容を修正しないようにしてください。

あくまで修正するのはプッシュする前です。

コミットしたけど、まだプッシュしていない時にだけこの「git commit --amend」コマンドを使うようにしてください。


もしプッシュした後にそのコミットをやり直したいという場合は「--amend」コマンドを付けてコミットをやり直すのでは無く、「git commit」コマンドでもう一度新しいコミットを作ってその内容を修正するようにしてください。


実際にやってみよう

ではターミナルを開いて実際にやっていきましょう。

まずファイルに変更を加えてみます。テキストエディタを立ち上げて「index.html」を開きます。

今回は「<p>git commit</p>」と追記して保存していきましょう。

これは、本来は「<p>git commit --amend</p>」と書きたかったが誤ってしまったという状況だと想定します。


では、ターミナルに戻って「git add .」して先ほどの変更をステージに加えて、「git commit -m "git commit --amendを追記"」でこの変更を記録していきます。


$ git add .

$ git commit -m "git commit --amendを追記"
[main 734e577] git commit --amendを追記
 1 file changed, 1 insertion(+)


コミットした後に「--amend」を書くのを忘れたと気が付き、このコミットは誤っていたとなりました。

そこで、この直前のコミットを修正していきたいと思います。


まずはテキストエディタを立ち上げて修正し忘れた分の内容を追記します。

ターミナルに戻り、この変更をステージに追加します。「git add .」とします。


では、今この状態を「git status」で確認しておきましょう。


$ git add .

$ git status
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   index.html


コミットされていない変更、ステージに追加された変更があり、「index.html」だと表示されています。


ここで、「git commit --amend」コマンドを使って直前のコミットを修正してみます。

$ git commit --amend -m "git commit --amendを追記"
[main 61073d5] git commit --amendを追記
 Date: Tue Aug 3 16:09:21 2021 +0900
 1 file changed, 1 insertion(+)


これで直前のコミット内容を変更することができました。


では最後に本当に修正できたのかを確認してみましょう。


「git log」コマンドで修正履歴を見ていきます。

今回は変更したファイルの中身を見たいので「-p」というオプションを付けます。

加えて、見たいのは直前のコミットだけなので、「-n 1」で直前のコミットだけ表示するようにします。


$ git log -p -n 1
commit 61073d5856bcadd3362e46120f5152be5df4890a (HEAD -> main)
Author: piketa <noriaki.matsui@icloud.com>
Date:   Tue Aug 3 16:09:21 2021 +0900

    git commit --amendを追記

diff --git a/index.html b/index.html
index 47028db..4287d43 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,4 @@
 <h1>Gitチュートリアル</h1>
 <p>git status</p>
 <p>git diff</p>
+<p>git commit --amend</p>


コミットメッセージは「git commit --amendを追記」と先ほどのコミット内容になっています。

どのようなファイルが変更されたかというと、「<p>git commit --amend</p>」というのが追記されたというのが分かります。


念のため、「git push」でGitHubにアップしておきましょう。

「git push origin main」と入力します。これでGitHubにプッシュできました。


$ git push origin main
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 673 bytes | 673.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:piketa/git_tutorial.git
   a0fd302..61073d5  main -> main


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work