Productive Outs

価値ある凡打を積み重ねる

やらかした時に助けてくれるGitコマンド備忘録①

はじめに:ブログを書くに至った経緯

プログラミング初心者にとってGitやGitHubって慣れないうちは触るのが結構怖い・・・。

自分も「本当にこのコマンドで大丈夫?」とか「せっかく作ったコードが上書きされて消えたらどうしよう・・・」とか思いながら恐る恐る操作をしていた。

なぜ怖いのか考えてみると「取り返しのつかないミスをしたらどうしよう・・・」という気持ちが恐怖心に繋がってることに気づく。

あいにくGitは優しいので、大体のミスは取り返しがつく。

それならミスの取り返し方をまとめておけば便利ではないかと思い、ブログを書くことにした。

その1:前のコミットからコードを変更したら動かなくなった!

「コードを変更したら動かなくなった」という時には、動いていたときのコミットを指定してgit reset --hardをすれば良い。

コミットの指定はHEADを使用した相対位置指定でも良いし、コミットIDをそのまま指定しても良い。

$ git reset --hard HEAD~


その2:不要なファイルをステージしてしまった!

間違って必要ないファイルをgit addでステージしてしまったときはgit reset (--mixed)でインデックスを一旦リセットする。 作業中のファイルの状態は変更されない。

$ git reset (--mixed) HEAD~


その3:間違えてresetを実行してしまった!

もちろん、git reset自体も取り消すことができる。 git reflogを使うと以下のように、git resetを行った履歴まで確認できる。

戻したい位置のコミットIDを指定してgit resetをしてやればOK。

$ git reflog
af6a6ac (HEAD -> master) HEAD@{0}: reset: moving to HEAD^^
8a2ca57 HEAD@{1}: reset: moving to 8a2ca576c
8a2ca57 HEAD@{2}: commit: 1行目と2行目を修正
8938aed HEAD@{3}: commit: 2行目を追加
af6a6ac (HEAD -> master) HEAD@{4}: commit (initial): first commit

ちなみにこのgit reflogブランチ削除の履歴も残してくれるので「必要なブランチを削除してしまった❗」というときにも使える最強のコマンド。


その4:コミットするブランチを間違えてしまった!

ブランチを分けて作業するはずが、ずっとmasterブランチにコミットしてしまっていた!ということはよくある。 そんな時に使えるのがgit cherry-pickコマンド。

例えば以下のように、developmentブランチで行うはずだった作業を間違えてmasterブランチにcommitしてしまっていた時を考えてみる。

$ git log --oneline
f76b506 (HEAD -> master) developmentブランチで4行目を追加
2312bd3 developmentブランチで3行目を追加
8a2ca57 1行目と2行目を修正
8938aed 2行目を追加
af6a6ac first commit

もともとブランチを作る予定だった位置にブランチを作成。 git checkoutでブランチを切り替える。

$ git branch development 8a2ca57
$ git checkout development
Switched to branch 'development'

masterのログを調べて、developmentブランチに移動させたいコミットのIDを調べる。 移したいコミットのIDを指定してgit cherry-pickを実行。

これでdevelopmentブランチにコミットがコピーされた。

$ git cherry-pick 2312db3
$ git cherry-pick f76b506

あとはmasterに残っている不要なコミットを削除する。

$ git checkout master
$ git reset --hard 8a2ca57
HEAD is now at 8a2ca57 1行目と2行目を修正

確認してみると、理想とする形になったのがわかる。

$ git log --oneline --decorate --graph master development
* 9f1cc9f (development) developmentブランチで4行目を追加
* 46f25f6 developmentブランチで3行目を追加
* 8a2ca57 (HEAD -> master) 1行目と2行目を修正
* 8938aed 2行目を追加
* af6a6ac first commit


その5:コミットメッセージを間違えてしまった!

コミットした後にコミットメッセージを修正したくなることは結構ある。 単純に間違えてしまった時や、もっといい表現が思いついた時にはgit commit --amendを使うと良い。

以下のコマンドを実行するとエディタが立ち上がり、直前のコミットメッセージを書き換えることができるようになる。

$ git commit --amend

また、このコマンドは直前のコミットに変更点を追加したいときにも便利。 新たにコミットを作成するほどでもない小さな変更点が見つかったときには、対象ファイルをステージした後git commit --amendを実行すればOK。

まとめ

今回は基本的な救済コマンドをまとめたが、まだまだ自分の知らない便利なコマンドは大量にあるため定期的に備忘録としてまとめていきたい。

やらかした時の対処法を知っておけばGitの操作に抵抗がなくなり、開発の効率やコミットの質も向上すると思う。

ただ、Gitの救済措置に甘えすぎず、イージーミスを減らす努力も忘れないようにしておきたい・・・。

参考URL

git reset コマンドの使い方と、主要オプションまとめ | WWWクリエイターズ

git reset --soft, --mixed, --hard の違い - yu8mada

Gitでブランチを作るのを忘れてmasterにコミットしてしまったときの対処法 - Qiita