【git】git diff にもっと詳しくなる
git diff
git diff
は非常によく使うgitコマンドで、gitで管理されたファイルの差分をチェックするのに重宝しています。
ただ他にも使い方がないのか調べてみると、以外と使ったことがないオプションや引数指定の仕方がたくさんあったので、簡単にまとめてみました。
1. addしてないファイルの差分を表示
git diff
基本。デフォルト操作。
今いるブランチのHEADの状態と、アンステージング状態(addしてない)ファイルの最新状態の差分を表示します。
# hoge1.txt -> アンステージング状態 # hoge2.txt -> ステージング状態 $ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: hoge2.txt Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: hoge1.txt # hoge1.txtの差分表示 $ git diff diff --git a/hoge1.txt b/hoge1.txt index 1e3893b..84ec994 100644 --- a/hoge1.txt +++ b/hoge1.txt @@ -1,3 +1,4 @@ hoge hoge piyo +foo
addされたファイルの差分を表示
git diff --cached
git diff
のステージング版。
今いるブランチのHEADの状態と、ステージング状態のファイルの最新状態の差分を表示します。
# hoge2.txtの差分表示 $ git diff diff --git a/hoge2.txt b/hoge2.txt index 2262de0..e42f4ce 100644 --- a/hoge2.txt +++ b/hoge2.txt @@ -1 +1,2 @@ hoge +fuga
addされたファイル・されていないファイル両方の差分を表示
git diff HEAD
ファイルの現在の状態(ワーキングツリー)と最新のコミット(HEAD)との差分を表示します。
git diff
とgit diff --cached
両方の結果を合わせて見たいときに。
# ステージングされたファイル・されていないファイルがある $ git status On branch master Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits) Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: hoge1.txt Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: hoge1.txt # 両方の差分を見る $ git diff HEAD diff --git a/hoge1.txt b/hoge1.txt index 84ec994..1e3893b 100644 --- a/hoge1.txt +++ b/hoge1.txt @@ -1,4 +1,3 @@ hoge hoge piyo -foo diff --git a/hoge2.txt b/hoge2.txt index e42f4ce..1a57997 100644 --- a/hoge2.txt +++ b/hoge2.txt @@ -1,2 +1,3 @@ hoge fuga +piyo
ブランチHEAD間の差分を表示
git diff [branch1] [branch1]
指定した二つのブランチbranch1``branch2
の、同じファイルパスに存在するファイル同士全てを比較します。
ファイルの状態はブランチのHEAD時点のものです。
branch1
からbranch2
に至るまで、どのファイルのどの行が増えたか(消えたか)が表示されます。
# 二ブランチ間の比較 $ git diff branch1 branch2 diff --git a/hoge1.txt b/hoge1.txt index 0ef7e93..1e3893b 100644 --- a/hoge1.txt +++ b/hoge1.txt @@ -1 +1,3 @@ +hoge +hoge piyo diff --git a/hoge2.txt b/hoge2.txt new file mode 100644 index 0000000..9128c3e --- /dev/null +++ b/hoge2.txt @@ -0,0 +1 @@ +fuga diff --git a/hoge3.txt b/hoge3.txt new file mode 100644 index 0000000..0ef7e93 --- /dev/null +++ b/hoge3.txt @@ -0,0 +1 @@ +piyo
別ブランチの別ファイル同士の差分を表示
git diff [branch1]:[file1] [branch2]:[file2]
ブランチbranch1
中のfile1
と、ブランチbranch2
中のfile2
を比較します。
これも、ファイルの状態はブランチのHEAD時点のものとなります。
$ git diff branch1:hoge1.txt branch2:hoge1.txt diff --git a/branch1:hoge1.txt b/branch2:hoge1.txt index 0ef7e93..1e3893b 100644 --- a/branch1:hoge1.txt +++ b/branch2:hoge1.txt @@ -1 +1,3 @@ +hoge +hoge piyo
二つのコミット履歴間の差分を表示
git diff [commit1] [commit2]
二コミット間の差分を表示します。
commit1``commit2
はコミットのSHAで指定可能ですが、HEADとかHEAD~とかHEAD^も指定できます。
# ブランチのHEADと、その一つ前のコミット時点との差分を表示 $ git diff HEAD~ HEAD diff --git a/hoge2.txt b/hoge2.txt new file mode 100644 index 0000000..2262de0 --- /dev/null +++ b/hoge2.txt @@ -0,0 +1 @@ +hoge # SHAで指定 $ git diff ebc2e989bc3eab80ae3e34790c01c591de4f2287 2969a1d4dc0face926b0d50343a9d506f71924f7 diff --git a/hoge2.txt b/hoge2.txt deleted file mode 100644 index 2262de0..0000000 --- a/hoge2.txt +++ /dev/null @@ -1 +0,0 @@ -hoge
差分が存在するファイル名だけ表示
git diff --name-only
名前だけ表示。差分が存在するかどうかチェックするのに便利です。
# ファイル名表示 $ git diff --name-only hoge1.txt # 他のdiffパターンにも付加できる $ git diff HEAD~ HEAD hoge2.txt
ローカルブランチとリモートブランチの差分を比較
git diff [remote][local]
ローカルとリモートの差分を見たい人用。
pull/pushするときなどに。
$ git diff master origin/master diff --git a/hoge1.txt b/hoge1.txt index 1e3893b..432a4b6 100644 --- a/hoge1.txt +++ b/hoge1.txt @@ -1,3 +1,2 @@ hoge hoge -piyo diff --git a/hoge2.txt b/hoge2.txt deleted file mode 100644 index 2262de0..0000000 --- a/hoge2.txt +++ /dev/null @@ -1 +0,0 @@ -hoge
差分の統計情報を表示
git diff --stat
変更された行や削除された行の数がファイルごとに表示されます。
# アンステージング状態のファイル $ git status On branch master Your branch is ahead of 'origin/master' by 3 commits. (use "git push" to publish your local commits) Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: hoge1.txt modified: hoge2.txt no changes added to commit (use "git add" and/or "git commit -a") # どのファイルに、何行の修正・削除があったか $ git diff --stat hoge1.txt | 1 - hoge2.txt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-)