DEV Community

n350071🇯🇵
n350071🇯🇵

Posted on • Edited on

[git] history reading

👍 Basic

just log

git log --name-status
git log -p -S xxx # see commits that include changes with xxx
git log -p -S xxx --pickaxe-all # with all files


git log --pretty=format:"%p => %h %s %an"
# 010ae6aba4 => 0f96ad607d :shirt: rubocop
# 9bc53da9c3 => 010ae6aba4 add facker lorem
# 0fd91176dc => 9bc53da9c3 remove unused
# f44be56a4b => 0fd91176dc ControllerSpec

git log --pretty=format:"%ar [%an] %s %h"
# 47 minutes ago [n350071] :shirt: rubocop  0f96ad607d
# 53 minutes ago [n350071] add facker lorem 010ae6aba4
# 2 days ago [n350071] remove unused 9bc53da9c3
# 5 days ago [n350071] ControllerSpec 0fd91176dc
option 内容
%ad Authorの日付 ( --date= オプションの形式 )
%ar Authorの相対日付
%h commitのハッシュ(短縮形)
%p 親commitのハッシュ(短縮形)
%an Authorの名前
%s コミットメッセージ
--date= 内容 見た目
iso ISO8601 2019-05-23 18:34:42 +0900
rfc FRC2822 Thu, 23 May 2019 18:34:42 +0900
raw UNIX時間 1558400483 +0900
local 端末のタイムゾーン Thu May 23 18:34:42 2019
relative 相対時間 4 weeks ago

なお、Authorは作業を行った人, Commiterはその作業を適用した人という意味らしいです。%adを%cdに変更すると対象がAuthorからComitterに変わります。

Filter

git log -- path/to/*.rb
git log --grep [commit-message]
git log --since="4 days ago" --until="2015/01/22"
git log --author='name'

# list commits that modified 'config/routes.rb'
git log --oneline  --diff-filter=M -- config/routes.rb

📚 reference: --diff-filter

This Branch history

#  --first-parent: Follow only the first parent commit upon seeing a merge commit. This option can give a better overview when viewing the evolution of a particular topic branch
git log -n 3 --oneline --first-parent --no-merges
git log -n 3 --oneline --graph

Find the commit which removes the file

$ git log --oneline | cut -d' ' -f1 | xargs git show --name-only | grep -B100 path/to/file.rb

🦄Advanced

👍 Search/Find the log

Search all remote branches by the specific word

# git grep 'search-string' $(git ls-remote . 'refs/remotes/*' | cut -f 2)
git grep 'search-string' $(git ls-remote . 'refs/remotes/*' | grep -v HEAD | cut -f 2)
git grep 'search-string' $(git rev-list --all)

Find the commit that the branch made from

# list the checkout reflog informations, the last one is the base commit of the branch
git reflog |grep checkout |grep [branch-name]

Find the commit that the branch made from 2

Faster, but not accurate. This actually shows how much the two branches merged?

git show-branch branchA branchB

#  * [feature/KX-155^2^^2^2] Fix something
#  -- [develop~23] Merge branch 'feature/jsx-1902' into 'develop'

Find the merged branch from the commit message

(git コミットメッセージからマージ元ブランチを特定する(原始的バージョン))

# 1. --more= の数字を適当に切り替える
git show-branch --more=400 master | grep 'hoge'

# 2. [master~70^2~3] hoge というような行がみつかるので、、その数字でもういちど実行してスクロールすると、見つけられる
git show-branch --more=400 master

# [master~70] Merge pull request #306 from organize/branch-name
# [master~70^2] buzz
# [master~70^2^] fizz
# [master~70^2~2] fuga
# [master~70^2~3] hoge

Search the Commits by the specific word

git blame TargetFile | grep TargetWord | cut -d" " -f1 | xargs git show
git blame TargetFile | peco | cut -d" " -f1 | xargs git show

👍 log history reading

make sure which lines modified in the specific Tickets(commit messages)

# Basic
git diff --name-only aj194z^ aj194z         # see the diff between one commit
git diff aj194z^ aj194z -- config/routes.rb # see the diff of the commit

# list the commits of the specifig tickets
git log --first-parent --oneline | egrep TICKET-18[1234]

# Find the files named 'controller' which is modified in the specific tickets in this branch history
git log --first-parent --oneline | egrep TICKET-18[1234] | cut -d' ' -f1 | xargs -I{} git diff --name-only  {}^ {} | grep controller | grep -v spec
git log --first-parent --oneline | egrep TICKET-18[1234] | cut -d' ' -f1 | xargs -I{} git diff  {}^ {} -- config/routes.rb | grep +

$ git log --first-parent --oneline | grep TICKET-18[1234] | cut -d' ' -f1 | xargs -I{} git diff --name-only {}^ {} | grep view | xargs -I{} echo '{}' | sort | uniq

🔗 Parent Note

Top comments (0)