その他
    ホーム 技術発信 DoRuby 勇気が湧く!gitやらかし防止コマンド&オプション集!
    勇気が湧く!gitやらかし防止コマンド&オプション集!
     

    勇気が湧く!gitやらかし防止コマンド&オプション集!

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    皆さんはgitを使っていてミスをしてしまうことはありませんか?
    ミスとまではいわずとも「あの変更いらなかったな」とか「間違えてコミットしちゃった」とかはあると思います。

    それらをなくすために一番大事なのは「確認」です。

    確認をより確信あるものにするために個人的によく使うコマンドやオプション、
    ミスをしてしまったときになんとかするものを紹介しようと思います。

    git diff –cached

    git diff はほぼ必須の確認コマンドだと思います。
    現在ブランチの変更した差分を表示してくれるので、僕はcommitする前には必ず確認しています。
    ですが、先にaddをしてしまうと差分を表示してくれません。

    --cachedオプションをつけることによって、addした後でも差分を表示できます。
    git diffで確認し忘れたときに、いちいちgit reset HEADしてチェックするのはめんどくさいですよね。

    git add test.txt
    
    git diff
    

    git add test.txt
    
    git diff --cached
    
    diff --git a/test.txt b/test.txt
    index e6a6914..2b70263 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -1,5 +1,5 @@
    ....以下省略
    

    git status -uall

    git statusだけ打っても新しく追加したディレクトリ以下のファイルは表示してくれません。
    -uallオプションをつけると全部追跡してくれるので確認することができます。

    git status
    
    On branch develop
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        testDir/
    
    nothing added to commit but untracked files present (use "git add" to track)
    

    git status -uall
    
    On branch develop
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        testDir/a.txt
        testDir/b.txt
        testDir/c.txt
    
    nothing added to commit but untracked files present (use "git add" to track)
    

    git log –name-status

    個人的に一番使うlogのオプションです。
    下記のようにそのコミットで変更されたファイルが出力され、
    git status + git log のようなイメージで使えます。

    git log --name-status
    
    commit 49d8d9c4ff2e3bdfc7fd4e18eb3fa9e5507ed89b
    Author: ziguzagu
    Date:   Tue Jul 4 16:16:40 2017 +0900
    
        テストファイル追加
    
    A       test_00.txt
    
    commit 53c55b128356aa960739b5f999b9917ed63a9784
    Author: ziguzagu
    Date:   Tue Jul 4 16:10:10 2017 +0900
    
        hugaクラスにメソッド追加
    
    M       app/models/hoge.rb
    

    git reflog

    ローカルで行ったcommit, merge, resetなどのログを見ることができます。
    マージしていないブランチを消してしまったり、
    git reset --hardなどで戻しすぎてしまった場合などでも履歴を見れるので、
    任意の時点まで戻すことができます。

    git reflog
    
    36336b7 HEAD@{0}: commit: xxxx => cccc
    331f0b6 HEAD@{1}: commit (merge): Merge branch 'change_text' into develop
    4d02134 HEAD@{2}: checkout: moving from change_text to develop
    510169f HEAD@{3}: commit: bbbb => cccc
    1ef1996 HEAD@{4}: checkout: moving from develop to change_text
    4d02134 HEAD@{5}: commit: bbbb => aaaa
    1ef1996 HEAD@{6}: commit: テキスト作成
    3057744 HEAD@{7}: checkout: moving from master to develop
    3057744 HEAD@{8}: commit (initial): 最初のコミット
    
    git reset --hard 4d02134
    

    上記の例ではcommit: bbbb => aaaaのブランチまでを戻すことができますが、
    このやり方の注意点として、以下の点が挙げられるので使用するときは注意しましょう。

    • 現在編集中のファイルは消えてしまう
    • 作業していたブランチを問わずにもどせてしまう

    終わりに

    ミスをしないための「確認」についての記事になりましたが、
    もしミスをしてしまったときの対処法も知っておけば、より勇気を持って動けると思います。
    自分はgit reflogでhash値を調べられることを知ってからはmergeに対する恐れは減りました。

    最終的には確認の方法を知っていても自分が確認を忘れたり、
    間違っているものを正しいと思い込んでたりしたら意味がないのでコマンド以外に
    他の人にチェックしてもらえたりするとさらにいいですね。