GitDay 24

複数人での Git 開発に便利な 3 つのコマンド

More than 5 years have passed since last update.

こんにちは、 rosylilly です。すっかり Advent Calendar のことを忘れていて、大急ぎで記事を書いています。ちゃんと予定は管理しておかないといけませんね……

ということでいつも使っているコマンドの中で 3 つほど紹介されていなかったものがあったので紹介しようと思います。


git grep コマンド

特定の語句が含まれているファイルを検索し、そのファイルでその語句が含まれている行数などを調べるコマンドです。

$ git grep "検索単語"

通常の grep コマンドなどを利用してもいいのですが、コマンドがわかりにくいのと、対象として指定するファイルを指定するのが面倒です。

その点 git grep だと、 git が管理しているファイルだけが検索対象になるので、手軽にリポジトリから検索することが出来ます。

また、オプションを使うことでより柔軟な検索も実現出来ます。一部を紹介しておきますので、man git-grep してより便利な使い方を探してみてください。



  • -i / --ignore-case : 大文字小文字を区別せずマッチします


  • -I : バイナリファイルを無視します


  • -w / --word-regexp : 検索文字が単語としてマッチする時のみマッチするようになります。このオプションが指定されているとき aabc にマッチしません


  • -v / --invert-match : 実際にマッチした単語がない行も表示します


  • -h / -H : マッチしたファイル名を行頭に表示するか否かの指定です。


  • --full-name : ファイル名を表示する時、詳細なファイルパスを出力するようにします(デフォルトでは basename のみ)


  • -E / --extended-regexp : 検索に POSIX の拡張正規表現を利用します


  • -G / --basic-regexp : 検索に POSIX の標準正規表現を利用します


  • -P / --perl-regexp : 検索に Perl の正規表現を利用します


  • -F / --fixed-strings : 検索に正規表現を利用しません


  • -n / --line-number : マッチしたファイル名の後ろにマッチした行数を表示します


  • -l / --files-with-matches / --name-only : マッチしたファイルのファイル名だけを表示します


  • -L / --files-without-match : マッチしなかったファイル名だけを表示します


git commit --amend --reset-author

会社のリポジトリを clone してきて、とりえずトピックブランチを切って、さっくり適当にコミットして……という時に、うっかり個人アカウントのメールアドレスと名前でコミットしてしまった!という時などに使います。

$ git ci -m "さっくりコミット"

$ git config user.name "Sho Kusano" # --global はつけない
$ git config user.email "sho_kusano@kaisya.com"
$ git ci --amend --reset-author

さすがに個人用アドレスで会社のリポジトリにコミット、というのはマズイので、気づいたら直しておくのが吉です。


git blame

「誰がバグをコミットしたか」という犯人探しは良くないのですが、実際にバグが仕込まれてしまった場合、原因究明する時に多くの場合は「どのコミットでバグが入ったか」より「どこにバグが入ったか」の方が先に見つかります。

そういったとき、特定の行のバグがどのコミットで仕込まれたかを探すには、 git blame が便利です。

$ git blame src/bug.js

とすると、左から順に


  1. (その行に最後に変更を与えた)コミットハッシュ

  2. ファイル名

  3. コミット者の名前

  4. コミットした時間

  5. 行数

  6. ファイルの内容

という具合に表示されます。あとは目的の行までジャンプして、コミットハッシュを特定すれば解決、という具合です。


まとめ

いかがでしたでしょうか?すこしでも日々の開発のお役に立てば幸いです。

git にかぎらず多人数で開発するときは「自分が書いていないソースコードをいかに高速に把握するか」という能力も重要になってくると思っています。そんな中で、git には今回紹介した以外にも様々な便利なサブコマンドがあるので、ぜひぜひ探してみてください。

もし便利なものがあったら僕にも教えていただけると幸いです!

また、git で困った時に助けてくれる便利なコマンドラインツール、git-tasukete のコミッタも募集中です!

それでは!