概要
Gitでコミットをした後に「あ、この変更をコミットし忘れた!」ってことあると思います。
そんなときに使える amendという機能について知ったのでまとめます。
使い方
- コミットし忘れたものをインデックスに追加(git add)
- amendを実行する
git commit --amend
- エディタでコミットログが開かれるので必要があれば編集
- コミットログを閉じるとコミットが更新されている
コミットし忘れたものをインデックスに追加した状態でamendするだけ。
すると、以前のコミットログがGitで設定したエディタで開かれるので
必要があればそのコミットログを編集し閉じると以前のコミットに
コミットし忘れたものが追加された状態でコミットされている。
注意点
既にプッシュしてリモートにあげたブランチにamendすると、
皆さんも一度は見たことがあるであろう下記エラーが出ます。
To GithubのURL
! [rejected] ブランチ名 -> ブランチ名 (non-fast-forward)
error: failed to push some refs to 'リポジトリ'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again
プッシュしようとしてもrejectedではじかれてしまうあれです。
一度プッシュしたコミットをamendによって別のコミットにすることで
ローカルとリモートブランチとの間に履歴の乖離が起こることが原因のようです。
[amend前]
a-b-c-d <-- origin/branch
a-b-c-d <-- branch
↓
[amend後]
a-b-c-d <-- origin/branch
a-b-c-e(amend) <-- branch
amendした箇所(HEAD)で乖離が起こっている
(最新のブランチをプルせずプッシュしたときと同じような状況が発生する)
対処方法
先ほど記載した通り、結局リモートとローカルの間に乖離が起こっていることが
プッシュできない原因なので、リモートの内容をローカルに取り込みコンフリクトを解消。
- プッシュ先であるリモートの最新情報をフェッチで取得
git fetch origin/XXX
- リモートブランチの内容をローカルにマージで取り込む
git merge origin/XXX
- コンフリクトを解消してコミット
- 改めてプッシュ
参考