すこしふしぎ.

VR/HI系院生による技術ブログ.まったりいきましょ.(友人ズとブログリレー中.さぼったら焼肉おごらなきゃいけない)

git commit --amend で,ちょっとしたミスをしれっと直す

こんばんは,1000chです. 最近gitリハビリが進みだんだんと慣れてきました.

開発していると,「あ,今のコミットやっぱなし(´・ω・`)」とか「そういやもう一個編集するファイルあったんだわ」なーんてことが多々あります. addし忘れていたとか,mergeした後にミスに気づくとか,よくありますね.

今までは「うんまぁしょうがないね,次いこ次!」という感じでごまかしていたのですが,やはりせっかくgitを使うのであれば,履歴は奇麗にしたいものです.

という分けで今回は,git commit --amendをつかってコミット履歴を書き換える方法を勉強します. 参考は前回に引き続きこちらです.

コミットの修正 git commit --amend

開発していてあるあるなのが,cdしていたことによるファイルのadd忘れや,複数の修正で1点だけ忘れていてコミットしてしまった,というような事態. ちょっとした追加なのに,わざわざもう一つコミット作ってしまうのもなんだかなぁ...とか思いつつ,改めてadd .したり修正してコミットしてしまうなんて経験は誰しもあるのではないでしょうか.

そんな時に使えるのがgit commit--amendオプションです. ぐぐってみるとamendって「改心する」って意味だそうで,まさにこんな時にふさわしい名前ですね.

git commit --amendを使うと,直近のコミットを修正することができます. 例えば,コミット漏れしたファイルを追加したり,後から気づいたバグを修正したりすることができるようになります.

実際にやってみましょう.

$ mkdir test
$ cd test

# gitリポジトリ初期化・初コミット
$ git init
$ touch hoge
$ git add .
$ git commit -m "1st commit"
$ git log
* 4b88236 - (HEAD, master) 1st (4 second ago) <1000ch>

# 追加するファイルをわすれていた!
$ touch hoge2
$ git add . 
$ git commit --amend -m "1st fix"
$ git log
* 7217278 - (HEAD, master) 1st fix (3 seconds ago) <1000ch> # 最初のコミットが消え,1st fixに書き換えられた

# ちょっとかいはつしよう
$ echo hogehoge > hoge
$ echo hugahuga > hoge2
$ git add .
$ git commit -m "2nd commit"
$ git log
* 0637d9c - (HEAD, master) 2nd commit (8 seconds ago) <1000ch>
* 7217278 - 1st fix (4 minutes ago) <1000ch>
$ cat hoge2
hugahuga

# hugahuga じゃなくて piyopiyoだった!修正したい!
$ echo piyopiyo > hoge2
$ git add .
$ git commit --amend -m "2nd fix"
$ git log
* ec4c8c7 - (HEAD, master) 2nd fix (1 second ago) <1000ch> 
* 7217278 - 1st fix (6 minutes ago) <1000ch>
#2ndコミット(0637d9c)は闇に葬られました!これでみんなにバレない!
$ cat hoge2
piyopiyo # きちんと修正されている!

ちょっとしたミスならこれでカバーできますね!

ただし!

一度リモートに登録したコミットを改変することは絶対にやめましょう! git commit --amendでは直近のコミットを消し去るため,リモートリポジトリとの間に齟齬が発生,マージする必要が発生します.

<自分がやらかした時のlog>

*   7fcfbab - (HEAD, origin/master, origin/HEAD, master) Merge <1000ch>
|\
| * d0f3467 - (origin/dev, dev) port 5000 -> 80 (77 minutes ago) <1000ch> #amendした
* | 024e487 - port 5000 -> 80 (72 minutes ago) <1000ch>
|/
* f3cb964 - fix auth object (2 days ago) <1000ch>

コミットの修正をしたはずが,余計なコミットが増える上にコミットツリーが分岐してしまう結果に... 大変迷惑になりますので,気をつけましょう(rebase -i使えば奇麗にできるのかもしれないが)

まとめ

  • git commit --amend で直近コミットを修正できる
  • ただし,リモート登録済みの場合には使わないほうが良い