1. ホーム
  2. 記事一覧
  3. コードを書いたのが誰かわかる超便利コマンド「git blame」の使い方を解説

2024.06.02

コードを書いたのが誰かわかる超便利コマンド「git blame」の使い方を解説

アプリ開発において「Git」は必須スキルとなってきます。Gitの基本コマンドは知っているけど他のコマンドはよく知らない、Gitコマンドをもっと知って便利に使いたい!と思っている方、また コードの変更を誰が行ったのか簡単に確認したい! という方向けに、この記事では「git blame」を解説します。

GitについてはエンベーダーのLinux応用コースで詳しく学ぶことができます。

https://envader.plus/course/5/scenario/1055

様々なGitコマンドを習得し、Gitマスターを目指しましょう!

「git blame」でできること

  • ファイルの各行が最後に変更されたコミットとその作者、日時を表示
  • コードの特定の部分がいつ、誰によって変更されたかを追跡
  • バグの原因となった変更を特定し、責任者を見つける

「git blame」コマンドの開発現場での活用例

  • バグの原因究明

    アプリケーションにバグが発生した際、git blameを使ってバグのある行がいつ、誰によって 変更されたかを特定します。また、見つけたコミットIDの詳細情報をgit show コマンドを用いて表示することにより、バグの原因となった変更を見つけ出し、修正に役立てることができます。(「git show」コマンドについては下記ページをご覧ください。)

    https://envader.plus/article/369

  • コードレビューでの活用

    コードレビューの際、レビュアーがgit blameを使ってコードの各部分の変更履歴を確認します。これにより、コードの意図や背景を理解し、的確なフィードバックを行うことができます。

  • リファクタリングの準備

    リファクタリングを行う前に、git blameを使ってコードの各部分がいつ、どのように変更されてきたかを調査します。これにより、リファクタリングによる影響範囲を把握し、適切な方針を立てることができます。

「blame」という単語は英語で「非難する」や「〜のせいにする」といったネガティブな意味合いがありますが、実際にはむしろコードの変更履歴を知ることでチームメンバーへの理解を深め、円滑なコミュニケーションにつなげていくことができるコマンドです。git blameを味方につけて、ぜひより良い開発チームを目指してください!

「git blame」の使い方

基本操作

指定したファイルの各行が最後に変更されたコミットとその作者や日時を表示します。

git blame <ファイル名>

コマンド実行例

例としてsrc/App.jsファイルのgit blameを実行した結果

git blame src/App.js

0e33522f (Taro Yamada 2024-04-15 14:32:10 +0900 1) import React from 'react';
0e33522f (Taro Yamada 2024-04-15 14:32:10 +0900 2) import { NavigationContainer } from '@react-navigation/native';
0e33522f (Taro Yamada 2024-04-15 14:32:10 +0900 3) import { createNativeStackNavigator } from '@react-navigation/native-stack';
c1a8e2b0 (Risa 2024-05-01 09:15:45 +0900 4) import HomeScreen from './src/screens/HomeScreen';
c1a8e2b0 (Risa 2024-05-01 09:15:45 +0900 5) import DetailScreen from './src/screens/DetailScreen';
...

出力内容の詳細

  • 0e33522f
    • コミットのハッシュ値の一部(先頭8文字)を表します
  • (Taro Yamada 2024-04-15 14:32:10 +0900
    • コミット作者の名前、コミット日時、タイムゾーンを表します
  • 1), 2) ...
    • ファイル内の行番号を表します

「git blame」のオプション

git blameにはいくつかのオプションがありますが、今回は以下の3つを紹介します。

  • -L
  • --since / --until
  • --ignore-rev

-L

指定した行番号の範囲のみを表示します。特定の行や行の範囲に絞ってblameの結果を確認したい場合に便利です。

Copy codegit blame -L 10,14 src/App.js
c1a8e2b0 (Risa 2024-05-03 09:15:45 +0900 10)   return (
c1a8e2b0 (Risa 2024-05-03 09:15:45 +0900 11)     <NavigationContainer>
c1a8e2b0 (Risa 2024-05-03 09:15:45 +0900 12)       <Stack.Navigator>
c1a8e2b0 (Risa 2024-05-03 09:15:45 +0900 13)         <Stack.Screen name="Home" component={HomeScreen} />
c1a8e2b0 (Risa 2024-05-03 09:15:45 +0900 14)         <Stack.Screen name="Detail" component={DetailScreen} />

since=”<start_date>” —-until=”<end_date>”

指定した期間の範囲で表示します。<start_date> / <end_date> に入る文字列は、こちらの記事の応用的な使い方を参考にしてください。

git blame --since="3 weeks ago" --until="1 week ago" example.py

--ignore-rev

指定したコミットをblameの対象から除外します。-rev は「revision」の略です。

(リビジョンとはコミットによって定義されているそれぞれの状態のことを指す言葉で、コミットIDと呼んでいるものが示すソースコードの状態、またその別名と考えていただければと思います。)

git blame --ignore-rev <コミットID> example.go

※ このオプションで除外するコミットとして指定しても、その行の変更分が唯一そのコミットのみであれば表示されます。

また、git config を利用することで常にファイルに記載したコミットを除外することができます。(「git config」コマンドについては下記ページをご覧ください。)

https://envader.plus/article/370

まず、任意の場所(通常はプロジェクトのルート)にファイルを作成してその中にコミットIDを記載します。複数ある場合は行ごとに1つのコミットIDを記載してください。

# ドキュメントとレイアウトの変更 機能には影響しないため、blameの結果からは除外する
590b6c1d8e7f4g5h6i3j2k1l0m9n8o7

# リファクタリングのコミット 前後でコードの動作は変わらないため、blameの結果を簡潔にするために除外する
p1q2r3s4t5u6v7w8x9y0z1a2b3c4d5

ファイルを作成したら、git config コマンドを実施します。

git config blame.ignoreRevsFile <ファイル名(階層が異なる場合はそのパスを含む)>

これで、毎回オプションを指定せずとも除外できるようになります。

どのファイルに設定を記載したか確認する場合や、設定を削除する際は以下のコマンドで行えます。

# 指定しているファイルの確認
git config --get blame.ignoreRevsFile
# 設定を削除
git config --unset blame.ignoreRevsFile

Tips

  • ファイルに記載するコミットIDは省略できません。
  • コミットIDの上の行に、先頭に#をつけて除外する理由を書いたコメントを記載できます。
  • ファイル名は自由ですが、「.git-blame-ignore-revs」や「.gitblame-ignore」のような名前がわかりやすく一般的です。

まとめ

この記事ではGitコマンドの中のgit blameについて学びました。git blameは、ファイルの各行の最終変更コミットと作者を表示し、コードの変更履歴を追跡するのに役立ちます。バグの原因究明やコードレビューなど、開発現場で活用できるシーンは多くあります。また、オプションを使いこなすことで、より効率的にgit blameを活用できるようになるでしょう。この記事を参照しながら実際にコマンドを何度も実行して、ぜひ使いこなせるようになってください!

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事