Open1

Git初心者がハマる!git diffで差分が出ない理由と解決法

tech_mwtech_mw

gitはチーム開発×業務で毎日使っていたのですが、深く追求する事がなかったため不意に意図しない状況に陥ると都度調べてなんとか解決してきました

調べてすぐ解決できる程度であればまだしも中には複雑で状況が把握できず困った状況に覚えがあったため改めてShell操作(CLI)と SourceTreeで操作(GUI)でそれぞれgitの理解を深めようとしている。といった経緯があります

備忘録としてメモします

問題

git diffはワーキングツリー(ローカルの作業ディレクトリ)とステージング(インデックス)の差分表示。
ワーキングツリーで作業、ワーキングツリーとステージングに差分があるにも関わらず検知しない

結果

git diffが検知するのは追跡対象になっているファイルのみだから

検証

STEP1. ファイル新規作成

echo "testfile create" >> test.txt

STEP2.作成したファイルの状態を確認

git status

結果:test.txtは「Untracked files(未追跡ファイル)」状態なので、この段階ではgit diffしても何も表示されません

On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	test.txt
nothing added to commit but untracked files present (use "git add" to track)

STEP3.ファイルをaddしてステージングへ

git add test.txt

結果:addしたので「Changes to be committed」となり追跡対象ファイルになった事が分かります

On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   test.txt

git ls-filesでも確認できます(現在Gitが追跡しているファイル一覧)

作成ファイルは追跡対象ファイルになっていますが、ワーキングツリーとステージングのファイルに差がないため今git diffしても何も表示されません。同じ内容のtest.txtが存在しているだけです

この段階で差分を確認したい場合はオプションをつける事でも確認できます。

# git diff --no-index /dev/null [対象ファイル]
git diff --no-index /dev/null test.txt

結果:

diff --git a/test.txt b/test.txt
new file mode 100644
index 0000000..166645f
--- /dev/null
+++ b/test.txt
@@ -0,0 +1 @@
+testfile create

STEP4.ワーキングツリー内ファイルを編集

echo "testfile edit" >> test.txt

これで追跡ファイルのワーキングツリーとステージングで差分が発生したのでgit diffで差分が表示できます

diff --git a/test.txt b/test.txt
index 166645f..b4930e6 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
 testfile create
+testfile edit