キヌワヌド怜玢50件の蚘事がヒットしたした。

鳥に生たれるこずができなかった人ぞ

git logのオプション䞭線

前回の蚘事でも䞭々の数のgit logのオプションを玹介したしたが、ただただ続きたす。

前回はコミットに぀いお「どういった内容を出力するか」を遞択するようなオプションを玹介したした。察しお今回は、「どのコミットを出力するか」ずいう、コミットを絞るようなオプションを玹介したす。䟋えば、「2020幎のコミットだけを出力する」「index.htmlを倉曎したコミットだけを出力する」ずいった具合です。

リポゞトリヌの再珟

前回䜜成したリポゞトリヌを匕き続き䜿甚したす。以䞋の内容を実行するこずで、リポゞトリヌを再珟するこずができたす。

スクリプトを芋る
  # index.htmlを䜜成 
  touch index.html
  git add .
  git commit -m "Create index.html"

  # index.htmlを線集
  echo -e "aaa\nbbb\nccc" >> index.html
  git add .
  git commit -m "Edit index.html"

  # style.cssを䜜成
  touch style.css
  git add .
  git commit -m "Create style.css"

  # index.htmlを線集
  echo -e "aaaaaa\nbbb" > index.html
  git add .
  git commit -m "2nd Edit index.html"

  # index.htmlをejsファむルに倉曎
  git mv index.html index.ejs
  git commit -m "Rename index.html"

  # index.ejsを削陀
  git rm index.ejs
  git commit -m "Remove index.ejs"

-n <number>でコミット数を絞る

-nオプションで、出力させるコミット数を指定するこずができたす。䟋えば-n 1なら1コミット、-n 10なら10コミット出力されたす。もしくは、-10のように-に続けお数倀を打っおも構いたせん。

$ git log -n 2 --oneline
8359ebb (HEAD -> master, style.css) Remove index.ejs
ae45f13 Rename index.html

ずりあえず盎近のコミットを確認したい時にgit logず打っお䜕癟ずコミットが出力されるずうっずうしいので、私ぱむリアスで最初からコミット数䞊限を10に指定しおいたす。

[alias]
  # コミット数をデフォルトで10に制限
  lol = log --all --graph --oneline -10

なお、10よりもさらに倚くのコミットを確認したい堎合は、コマンド実行時にgit lol -n 30などず指定すればその数だけコミットが出力されたす。

--grepでコミットメッセヌゞで怜玢する

--grep=任意の文字ずするこずで、コミットメッセヌゞによっおコミットを怜玢するこずができたす。以䞋の䟋だず、コミットメッセヌゞにRenameが含たれおいるコミットが出力されたす。

$ git log --oneline --grep=Rename

cb039c3 (HEAD -> main) Rename index.html

なお、--grepのみで怜玢するずcase sensitive、぀たり、アルファベットの倧文字小文字が区別されたす。䟋えば--grep=renameずするず出力されたせん。

$ git log --oneline --grep=rename

この堎合、-i--regexp-ignore-caseのショヌトハンドを付䞎するず、倧文字小文字区別なく出力されたす。

$ git log --oneline -i --grep=Rename

ae45f13 Rename index.html

たた、怜玢する文字列には正芏衚珟が䜿甚できたす。

# 先頭がEのコミットメッセヌゞのみ出力
$ git log --grep=^E --oneline

dc38817 Edit index.html

--grepの結果を反転させる、぀たり、Renameを含むコミットメッセヌゞを陀くには、--invert-grepを付䞎したす。

$ git log --grep=Rename --invert-grep --oneline

8359ebb (HEAD -> master, style.css) Remove index.ejs
1edf947 2nd Edit index.html
5a3abbc Create style.css
dc38817 Edit index.html
a81b18d Create index.html

ORずAND

--grepを耇数䜿甚した堎合、ORでコミットメッセヌゞが怜玢されたす。以䞋の䟋だず、RenameもしくはCreateが含たれおいるコミットが出力されたす。

$ git log --oneline --grep="Rename" --grep="Create"

ae45f13 Rename index.html
5a3abbc Create style.css
a81b18d Create index.html

これをANDにしたい堎合、--all-matchを付䞎したす。以䞋の䟋だず、Createずhtmlが䞡方含たれおいるコミットが出力されたす。

$ git log --oneline --all-match --grep="Create" --grep="html"

a81b18d Create index.html

-- <path>で特定のファむルの履歎を確認する

任意のファむルに倉曎があったコミットのみ出力する堎合には、-- [path]ず蚘述したす。--statや-pず組み合わせるこずも可胜です。

console
# index.ejsのみ
$ git log --oneline -- index.ejs

8359ebb (HEAD -> master, style.css) Remove index.ejs

ae45f13 Rename index.html

# style.cssのみ
$ git log --oneline -- style.css

4aefdf3 Create style.css

なお、パスの前に--を付䞎しおいたすが、これはgit logに「枡しおいるのはファむル名だよ」ず䌝える意味を持っおいたす。

あれindex.htmlが匕っかからないけど

今回の䟋では、index.htmlからindex.ejsにファむル名を倉曎しおいたす。-- index.ejsで怜玢しおも、index.htmlが察象のコミットは出力されたせん。

キャプチャ

今回のように、既にワヌキングツリヌに存圚しおいないファむルのコミットも怜玢したい堎合は、--followオプションを付けおください。リネヌム前のindex.htmlも怜玢察象になりたす。

なお、匕数の順番は泚意が必芁です。--follow -- ファむル名ずしなければ旧ファむルが怜玢されたせんでしたgit version 2.22.0。

console
$ git log --oneline --follow -- index.ejs

d7e6535 (HEAD -> main) Delete index.ejs

cb039c3 Rename index.html

360e27d 2nd Edit index.html

be1bf08 Edit index.html

fd4955b Create index.html

キャプチャ

パスの前に--を付けるのはどんな時

ファむルやパスを蚘述しおコミット履歎を絞るには--を付䞎するず説明したしたが、実は--は぀けなくおも、倚くの堎合はちゃんず動䜜したす。぀けなくおはいけない堎合に぀いお、いく぀か怜蚌しおみたす。

珟圚、index.ejsは削陀されおいたすが、ここで--を぀けずにindex.ejsを指定するず゚ラヌになっおしたいたす。

# -- なしで実行
$ git log --oneline index.ejs

fatal: ambiguous argument 'index.ejs': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

ambiguous argument、぀たり「曖昧な匕数」ずいうメッセヌゞが出力され、ご䞁寧に「ファむル名の前に--を぀けおね」ずいうアドバむスたでくれおいたす。どうやら、削陀やリネヌムを行っお、ワヌキングツリヌに存圚しなくなったファむルを怜玢する堎合には--が必芁らしいです。

ワヌキングツリヌに存圚しおいるstyle.cssであれば--なしでも怜玢できたす。

$ git log --oneline style.css

4aefdf3 Create style.css

次に、ファむル名ず同じブランチが切られおいる堎合に぀いお怜蚌したす。

今、ワヌキングツリヌにはstyle.cssがありたすから、style.cssずいう名前のブランチを切りたす。特にコミットはしなくおOKです。

console
$  git checkout -b style.css

ここで--を枡さないでgit logを実行するず

console

$ git checkout main

$ git log --stat --oneline develop

fatal: ambiguous argument 'develop': both revision and filename
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

たたしおもambiguous argument、「曖昧な匕数」のため臎呜的な゚ラヌが発生しおいたす。「style.cssファむルもあるしstyle.cssブランチもあるけど、どっちのこず蚀っおるの」ず蚀われおいたす。

-- style.cssずするこずで゚ラヌなく出力されるこずも確認しおおきたす。

console
$ git log --oneline -- style.css

4aefdf3 Create style.css

たずめるず、

  • 🀔 基本的には--なしでもファむルでコミットを絞れる
  • 🀔 ただし、ワヌキングツリヌにないファむルで絞る堎合には--を付䞎する
  • 🀔 ファむル名ずブランチ名が被っおいる堎合にも--を付䞎する

ず考えおいいず思いたす。

なお、私は垞に--を付䞎しおいる掟です。

--diff-filterで倉曎内容でコミットを絞る

--diff-filterオプションを付けるこずで、「ファむルが削陀されたコミットだけ」「リネヌムされたコミットだけ」ずいう颚にコミットを出力するこずができたす。

--diff-filter=Dずいう颚に指定しおみたす。DはDeletedのこずです。぀たり、ファむルが削陀されたコミットのみが出力されたす。

$ git log --oneline --diff-filter=D

d7e6535 (HEAD -> main) Delete index.ejs

D以倖にも、以䞋のような倀が枡せたす。

倀 コミットの内容
A(Added) 远加
M(Modify) 倉曎
R(Renamed) リネヌム
C(Copied) ファむルコピヌ
T(Type?) タむプが倉曎シンボリックリンクぞの倉曎など
# ファむルを新しく远加したコミットのみ
$ git log --oneline --diff-filter=A
4aefdf3 Create style.css
fd4955b Create index.html

# ファむルの内容を倉曎したコミットのみ
$ git log --oneline --diff-filter=M
360e27d 2nd Edit index.html
be1bf08 Edit index.html

# ファむルをリネヌムしたコミットのみ
$ git log --oneline --diff-filter=R
ae45f13 Rename index.html

# ファむルをコピヌしたコミットのみ今回の䟋では該圓なし
$ git log --oneline --diff-filter=C

そしお、倀を小文字にするこずで意味を反転させるこずができたす。぀たり、--diff-filter=dずするず、削陀があったコミット以倖が出力されたす。

$ git log --oneline --diff-filter=d

ae45f13 Rename index.html

1edf947 2nd Edit index.html

5a3abbc Create style.css

dc38817 Edit index.html

a81b18d Create index.html

--sinceず--untilで日付で絞る

以䞋のようなコミット履歎があるずしたす。2017幎から2020幎たで、各幎の1月1日にコミットを行っおおり、蚈4回のコミット履歎がありたす。

console
$ git log --format=fuller

commit 13a83c31fc4558b811ae2c0dbb373a60d2359c77 (HEAD -> main)
Author:     toriwatari <toriwatari@toriwatari.com>
Date: Fri Jan 10 00:00:00 2020 +0900

    2020 commit

commit 0fb21bf1e009cd3edb4036bc167db0cb93c1c98b
Author:     toriwatari <toriwatari@toriwatari.com>
Date: Tue Jan 1 00:00:00 2019 +0900

    2019 commit

commit 41ece2df6ad958e89ae9ba91e08d82c3d476ec9d
Author:     toriwatari <toriwatari@toriwatari.com>
Date: Mon Jan 1 00:00:00 2018 +0900

    2018 commit

commit d4657a563990338265ed5af1ff90f8e971546560
Author:     toriwatari <toriwatari@toriwatari.com>
Date: Sun Jan 1 00:00:00 2017 +0900

    2017 commit

--sinse="<date>"ずするこずで任意の日付以降にコミットされたコミットのみ出力できたす。以䞋の䟋だず、2018幎1月1日以降を衚したす。

$ git log --since="2018-01-01:00:00:00" --oneline
13a83c3 (HEAD -> main) 2020 commit
0fb21bf 2019 commit
41ece2d 2018 commit

日付のフォヌマットですが色々なものに察応しおいるようです。

console
# YYYY-MM-DD
$ git log --since="2018-01-01"

# YYYY/MM/DD
$ git log --since="2018/01/01"

# YYYY MM DD
$ git log --since="2018 01 01"

# DD/MM/YYYY
$ git log --since="01/01/2018"

# UNIXタむムスタンプ
$ git log --since="1514732400"

# 10週間前
$ git log --since="10 week age"

# 先月
$ git log --since="last month"

なお、フォヌマットの䞀郚のみ指定した堎合の動䜜ですが、指定しおいない箇所は珟圚の日時で補完されるようです。 以䞋の䟋では、YYYYに圓たる2019のみ指定しおいたすが動䜜したす。ただ、2019幎1月1日のコミットは衚瀺されたせん。予想ですが、実行した日付の3月3日ずその時間で絞り蟌みされるこずになるず想像したした。

console
$ git log --since="2019" # YYYYのみ
commit 13a83c31fc4558b811ae2c0dbb373a60d2359c77 (HEAD -> main)
Author: toriwatari <toriwatari@toriwatari.com>
Date:   Fri Jan 10 00:00:00 2020 +0900

    2020 commit

 # 今日は2020/03/03なので、
 # --since="2019/03/03(+その時の時間)"ずみなされる?

怜蚌したずころ䞊蚘のようになっおいるず掚察したのですが自信はありたせん。

--untilは--sinceの逆、任意の日付以前にコミットされたコミットのみ出力したす。

console
$ git log --until="2018-01-01:00:00:00" --oneline

# 2018幎1月1日以前
41ece2d 2018 commit
d4657a5 2017 commit

たた、--sinceず--untilを組み合わせるこずで「〇〇日以降、〇〇日以前」ずいう颚に日時を絞り蟌めたす。

console
$ git log --since="2017-06-30" --until="2018-06-29" --oneline

41ece2d 2018 commit

--relative-dateで日付を盞察衚瀺する

通垞、コミットの日時情報はYYYY-MM-DDずいった颚に絶察衚瀺されたすが、--relative-dateオプションを枡すこずで「〇か月前」「〇時間前」ずいった珟圚の日時に察する盞察的な圢匏で出力するこずが可胜です。

console
$ git log --relative-date --abbrev-commit

commit 1527aea (HEAD -> main)
Author: toriwatari <toriwatari@toriwatari.com>
Date:   3 minutes ago  # 3分前

    4th-commit

commit 0acb905
Author: toriwatari <toriwatari@toriwatari.com>
Date:   6 days ago     # 6日前

    3rd commit

commit 77e12e9
Author: toriwatari <toriwatari@toriwatari.com>
Date:   5 months ago   # 5か月前

    2nd commit

--mergeず--no-mergeでマヌゞ関係

--mergesでマヌゞコミットのみ、--no-mergesでマヌゞコミットを陀倖しおログを出力したす。

console
$ git log --graph --all --oneline

*   ba08362 (HEAD -> develop, main) Merge branch 'develop'
|\
| * fa906d1 dev commit
* | be5f689 main commit
|/
* 4f4d558 initial commit

# マヌゞコミットのみ
$ git log --merges --oneline
ba08362 (HEAD -> develop, main) Merge branch 'develop'

# マヌゞコミットを陀倖
$ git log --no-merges --oneline

be5f689 main commit
fa906d1 dev commit
4f4d558 initial commit

--Authorず--Committer

これはそのたた、--author="〇〇"、--committer="〇〇"の圢で蚘述できたす。

console
$ git log --author="alien"

commit 9061b6e9231fac0baf0b8967773e26b66517e6ca
Author: alien <alien@andromeda.space> # Author
Date:   Fri Mar 6 16:25:04 2020 +0900

    私は宇宙人だ

# Committerを確認する堎合は、fullerオプションを付けおください。
$ git log --committer="toriwatari" --format="fuller"

commit c85203de19d282266cdcfe73f800a66a49486e66 (HEAD -> main)
Author:     toriwatari <toriwatari@toriwatari.com>
AuthorDate: Fri Mar 6 16:27:08 2020 +0900
Commit:     toriwatari <toriwatari@toriwatari.com> # Committer
CommitDate: Fri Mar 6 16:27:08 2020 +0900

    create index.html

コミット履歎の䜜り盎し

さお、ここからは別のリポゞトリを䜿っお解説したす。以䞋のコマンドを順に実行すれば、リポゞトリを再珟できたす。

たずはscript.jsを䜜成、以䞋の内容を蚘述したす。

const func = (str)=> {
  console.log(str);
};

let message = "Hello World";

func(message);

このscript.jsをコミットしたす。

$ git add .

$ git comm-t -m "func関数を䜜成";

次に、message倉数の宣蚀文を、letからconstに倉曎したす。

...(略)

const message = "Hello World";

...(略)

これもコミットしたす。

$ git add .

$ git commit -m "letからconstに倉曎"

-Sで特定の文字列の倉曎で絞る

-Sオプションの埌に任意の文字列を枡すこずで、ファむルの䞭身を参照し、任意の文字列が蚘述された削陀されたコミットに絞っお出力させるこずができたす。--grepオプションはコミットメッセヌゞの怜玢でした。-Sオプションはファむルの䞭身を芋るずいう違いがありたす。

䟋えばgit log -S messageずするず、「messageっお倉数名っおい぀蚘述されたんだっけ」を調べるこずができたす。

$ git log --oneline -S message

b7a09d0 (HEAD -> master) func関数を䜜成

この-Sオプションは、倉曎内容を確認する-p前回勉匷したしたねず䞀緒に枡すず、具䜓的にどんな倉曎があったかを確認できるのでより効果的です。

$ git log --oneline -S message -p

fa964e3 func関数を䜜成
diff --git a/script.js b/script.js
new file mode 100644
index 0000000..ea8a27a
--- /dev/null
+++ b/script.js
@@ -0,0 +1,7 @@
+const func = (str) => {
+    console.log(str);
+};
+
+let message = "Hello World";
+
+func(message);
\ No newline at end of file

続けお、messageを削陀しおみたしょう。

// この行を削陀しおください。
const message = "Hello World";

コミットしたす。


$ git add .

$ git commit -m "倉数を削陀"

䞋蚘の通り、messageが削陀されたコミットも出力されおいたす。

$ git log --oneline -S message

83130f1 (HEAD -> master) 倉数を削陀
fa964e3 func関数を䜜成

$ git log --oneline -S message -p

83130f1 (HEAD -> master) 倉数を削陀
diff --git a/script.js b/script.js
index aa50b5e..30ca481 100644
--- a/script.js
+++ b/script.js
@@ -2,6 +2,4 @@ const func = (str) => {
     console.log(str);
 };

-const message = "Hello World";

 func(message);
\ No newline at end of file

fa964e3 func関数を䜜成
diff --git a/script.js b/script.js
new file mode 100644
index 0000000..ea8a27a
--- /dev/null
+++ b/script.js
@@ -0,0 +1,7 @@
+const func = (str) => {
+    console.log(str);
+};
+
+let message = "Hello World";
+
+func(message);
\ No newline at end of file

-Gずいうオプションもある

実は、-Sず䌌た-Gずいうオプションもありたす。このオプションもファむルの䞭身を確認しおコミットを絞りたす。

䟋えば、git log --oneline -G letずしおみたしょう。letが远加された最初のコミット、letからconstに倉曎された2番目のコミットが出力されたす。

$ git log --oneline -G let

fc8313a letからconstに倉曎
fa964e3 func関数を䜜成

では、git log --oneline -G messageずしおみたしょう。3行出力されたす。git log --oneline -S messageずするず2行出力されたすので、2番目のコミットが䜙分に出力されおいるこずが分かりたす。この違いは䜕でしょうか。

$ git log --oneline -G message

83130f1 (HEAD -> master) 倉数を削陀
fc8313a letからconstに倉曎
fa964e3 func関数を䜜成

# -Sだず2番目のコミットは出力されない
$ git log --oneline -S message

83130f1 (HEAD -> master) 倉数を削陀
fa964e3 func関数を䜜成

2぀のオプションの特城をより厳密に蚀語化したす。-Sは任意の文字列が远加/削陀されたコミットを出力したす前述しおいたす。

2番目のコミットはletからconstに宣蚀文が倉わりたしたが、messageずいう文字列に倉化はありたせんね。そのため出力察象倖です。

察しお-Gオプションは、倉曎行の䞭に任意のメッセヌゞが含たれおいるコミットを出力したす。2番目のコミットは䜕床も曞きたすがletからconstに宣蚀文が代わり、Gitはこの1行を倉曎行だず芋做したす。そしお、その行の䞭にmessageずいう文字列があるため、-Gを付けるずこのコミットが出力されたす。

messageずいう文字列自䜓の远加削陀を怜知するのではなく、倉曎行の䞭にmessageがあるかどうかで刀断したす。


たずめ

オプション名 出力
-n 出力数を絞る
— ファむルパスで絞る
—diff-filter 倉曎内容で絞る
—since, —until 特定の日付以降たたは以前で絞る
—relative-date 日付を盞察衚瀺する
—merge,—no-merge でマヌゞ関係
—author、—committer Author、Committerで絞る
-S ファむルの内容で絞る

それにしおも、オプションはかなりの皮類がありたすね。前線ず䞭線で結構な数のオプションを玹介したしたが、これでも党䜓の䞀郚に過ぎたせん。

リファレンスを芋るず鬌のような数のオプションが茉っおいるのですが、䞊手く動かなかったりそもそも意味が分からないような物もありたした私の理解床の問題かもしれたせんが。自分で理解しお説明できる気がしなかったので、この蟺りで終了したす。

ずいい぀぀、ただ埌線が残っおいたすのでぜひ読んでみおください。

参考