「git status」は変更されたファイルを表示しますが、「git diff」は表示しません


181

私はすべての同様の質問を見てきました。しかし、私は再確認しましたが、何か奇妙なことが起こっています。

1つのサーバー(Solaris with Git 1.8.1)で、Gitリポジトリのクローンを作成してから、.gitフォルダーを既存のライブファイルにコピーしました。これは完璧に機能し、実行できました

git status

その後

git diff [filename]

異なるファイルをチェックします。

別のサーバー(Solaris with Git 1.7.6)でもまったく同じです

git diff [filename]

ファイルの内容が明確に異なる場合でも、何も表示されません。新しいファイルの追加、コミット、編集のテストも行いました。同じ問題で、git status変更されたファイルがgit diff表示されますが、何も表示されません。変更したファイルをダウンロードしてローカルでdiffを実行すると、diff出力が表示されます。


9
それはあなたのインデックスにありますか?その場合は、で差分を表示できますgit diff --cached
jeremyharris 2013年

2
git diff --cached空白の出力も表示されます。
Oliver P

git logまた、何も出力しません。
Oliver P

本当にバグがあると仮定すると、最小限の例を作成できるはずです。それを再現してサンプルを共有してみてください。
mheinzerling 2013

1)ファイルモードが変更されましたか?ここcore.fileModeオプションを探します2)また、Console2が実際に実行されているときに、Console2構成(gitの下にあります)でも同様の問題が発生しています。たぶんファイルロックのようなものは、ファイルが変更されたことにgitを作るでしょう。
マッドヘッド2013

回答:



63

git status違いが示される可能性があるが、示されない可能性がある理由はいくつかありgit diffます。

  • ファイルのモード(許可ビット)が、たとえば777から700に変更されました。

  • 改行スタイルがCRLF(DOS)からLF(UNIX)に変更されました

何が起こったかを知る最も簡単な方法は、実行git format-patch HEAD^して、生成されたパッチの内容を確認することです。


11
変更許可ファイルが適用される場合:git config core.filemode false for files permission of files
jruzafa

改行がCRLFからLFに変わるのは、gitステータスが違いを示し、git diffがそうでない状況の1つであることをどのようにして知りましたか?
Alex Spurling

Windowsを使用する同僚がいると、行末に関するあらゆる種類の楽しいことがわかります。「git diff」がCRLFからLFへの変更を表示するケースかもしれませんが、おそらく構成によって異なります。私はしばらくWindowsを使用していなかったので、今のデフォルトがどうなっているのかわかりません。
cmccabe

59

私にとっては、ファイルのアクセス許可と関係があります。私のプロジェクトでMac / Linuxを使用している誰かが、デフォルト以外の権限でいくつかのファイルをコミットしているようですが、私のWindows gitクライアントはその複製に失敗しました。私の解決策は、ファイルのアクセス許可を無視するようにgitに指示することでした:

git config core.fileMode false

その他の洞察:Gitにファイルモード(chmod)の変更を無視させるにはどうすればよいですか?


これにより、多くのファイルで発生していた問題が解決しましたが、代わりにファイルの作成/変更時刻が原因であったと思います。
Derek

これで解決しました。fileMode値は、Mac / Linuxボリュームではデフォルトでtrueに、Windowsボリュームではfalseに表示されます。プロジェクトをMacからWindowsに移動したところ、falseに切り替える必要がありました。
geekinit

1
これは、Windows 10でディレクトリをマウントするDockerコンテナーを使用してVSCodeを実行している場合にも役立ちました。コンテナーの外側でgitステータスを確認すると、ファイルを変更していないことが正しく示されます。ただし、コンテナ内のgitステータスを確認すると、ファイルが変更されたことが示されます。コンテナー内で上記のコマンドを実行すると、問題が解決しました。
Frederick Ollinger

39

何百もの行末がプログラムによって変更され、git diffすべてのソースファイルが変更されたものとしてリストされるという問題がありました。行末を修正した後git statusも、変更されたファイルがリストされます。

すべてのファイルをインデックスに追加してから、インデックスをリセットすることで、この問題を解決できました。

git add -A
git reset

core.filemode falseに設定されました。


ありがとうございました!魅力のように働いた!
Starwave

1
私はで解決しましたgit add --renormalize .、以下の私の答えを見てください。
Stefano M

17

Gitのインストールまたはリポジトリに問題があると思います。

実行してみてください:

GIT_TRACE=2 git <command>

何か役立つものがあるかどうか確認してください。それでも問題が解決しない場合は、straceを使用して、問題の原因を確認してください。

strace git <command>

6
@towi:これはあなたにとっては報奨金の価値があったので、同様の失敗の理由について学んだことを知りたいと思います。
cfi 2013

5
私の場合は-FLESSenv変数にフラグを追加しました。これにより、表示する情報でいっぱいの画面が1つ未満の場合に終了するように指示します。gitはページャーとして使用する量が少なく、差分が小さいため、何も表示されませんでした。終了した後でも画面にコンテンツを表示-XするLESSenv に追加するか、単に削除する必要がありました-F。実行中であることGIT_TRACEを示し、最近変数lessを変更したことを思い出させましたLESS。@rcwxokの回答でも同じ理由ですが、どのようにGIT_TRACE役立つかについてコメントを求めていました。
Raghu Dodda

この答えは私に「ページャー」のヒントを提供し、設定の解決策に導きますcore.pager中で.gitconfig私のために完璧に動作し、。
ytu 2018年

10

私は同様の問題を抱えていました:git diff違いは表示されますが、表示されgit diff <filename>ません。()LESSを含む文字列に設定したことがわかりました。そのフラグを削除すると問題が解決しました。-F--quit-if-one-screen


1
を削除する代わりに-F、追加-Xも機能する可能性があります。同様のケースについては、以下の私の回答を参照してください。
avivr 2016年

これありがとう!私を狂わせていた。
hackel '19年

8

以前の回答ですでに述べたように、この状況は行末の問題(CR / LFとLF)が原因で発生する可能性があります。私はこのコマンドでこの問題を(Gitバージョン2.22.0で)解決しました:

git add --renormalize .

マニュアルによると:

       --renormalize
           Apply the "clean" process freshly to all tracked files to
           forcibly add them again to the index. This is useful after
           changing core.autocrlf configuration or the text attribute in
           order to correct files added with wrong CRLF/LF line endings.
           This option implies -u.

5

短い答え

実行するgit addと役立つことがあります。

Gitステータスに変更されたファイルが表示され、git diffには何も表示されません...

> git status
On branch master
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:   package.json

no changes added to commit (use "git add" and/or "git commit -a")
> git diff
> 

... git addを実行すると不整合が解決されます。

> git add
> git status
On branch master
nothing to commit, working directory clean
> 

2
これは、「病気を治す」のではなく「症状と戦う」ように聞こえます...;)
einjohn

@einjohnこの場合の病気は何だと思いますか?
Shaun Luttin、2016年

1
病気にはいくつかの原因が考えられます。他の人が述べたように、権限の問題か、行末に問題がある可能性があります。すでに段階的な変更である可能性もあります。ただし、この最後の可能性はあなたの例に適合しません。それにもかかわらず、あなたの解決策では理由(病気)を知ることができず、問題(一見欠陥のある空の差分(症状)の)を取り除くだけです。明確にするために:それが悪い解決策であると言っているのではありません。問題を解消したいだけの場合に役立ちます。...うまくいけば、病気のメタファーに光を当てることができた。:)
einjohn

@einjohnほとんどの場合、行末であるようです。それはそうですstatusし、diffそれらを処理する別の方法があります。
Shaun Luttin、2016年

5

私はこの問題に遭遇しました。私のケースはrcwxokが投稿LESS問題に似てました

私の場合、PAGER環境変数をに設定しましたPAGER='less -RSF'

ただし、前の回答とは異なり、-Fオプションを削除したくありませんでしたless。画面全体よりも短い場合に差分が表示されないようにするために、明示的にそこに配置したためです。

代わりに削除するので、目的の結果を得るために-F、私が追加しました-XPAGER='less -RSFX'。これによりgit diff問題が解決され、さらにで短い差分を表示できなくなりましたless


大文字化は奇妙に思えます。「LESS -RSFX」ではなく「less -RSFX」という意味ですか?オプションは正しいケースですか?
StackzOfZtuff 2017

1
はい、ありがとう、それは間違いでした。どうやって起こったのかわかりません。修正されました。
avivr 2017

3

同様の問題が発生しました。git diff fileファイルの名前の一部を大文字でGitインデックスに追加したため、何も表示されませんでしたGeoJSONContainer.js

その後、名前をGeoJsonContainer.jsに変更し、変更の追跡を停止しました。git diff GeoJsonContainer.js何も見せていなかった。強制フラグを使用してインデックスからファイルを削除し、ファイルを再度追加する必要がありました。

git rm -f GeoJSONContainer.js
git add GeoJSONContainer.js

2

あなたは実際には実際の質問をしませんでしたが、これは一般的なユースケースであるため、私が頻繁に使用しているのは、ここで行うことです。これを自分で試して、エラーが続くかどうかを確認してください。

あなたのユースケースに関する私の仮定:

ファイルとディレクトリを含む既存のディレクトリがあり、現在のディレクトリのデータ変更せずに、他の場所から複製されたGitリポジトリに変換したいとします。

実際には2つの方法があります。

クローンリポジトリ.git-mv-git reset --hard

この方法はあなたがしたことです-既存のリポジトリを空のディレクトリに複製してから、その.gitディレクトリを宛先ディレクトリに移動します。問題なく動作するためには、通常、実行する必要があります

git reset --hard

ただし、これにより、現在のディレクトリ内のファイルの状態が変更されます。あなたはあなたのディレクトリの完全なコピー/ rsyncでこれを試して、何が変わるかを調べることができます。少なくともその後、git logとの間の不一致はなくなりますstatus

新しいリポジトリの初期化-起点へのポイント

もう1つは、邪魔にならない場所ですcd。目的の場所に移動し、新しいリポジトリを

git init

次に、新しいリポジトリに、祖先がどこか別の場所にあることを伝えます。

git remote add origin original_git_repo_path

その後、安全に

git fetch origin master

ローカルファイルを変更せずにデータをコピーします。すべては今大丈夫です。

エラーが発生しにくい2番目の方法を常にお勧めします。


これはgitエラーであることを暗示しているようです。わかりました。私はLinusほど賢くないので、適切なgit理解が欠けていたとまだ思いました;-)
towi

@towi:いいえ、これはgitエラーであることを意味しているわけではなく、反対の意味でもありません。私はgitの内部に詳しくありません。しかし、一般的な経験則として、.gitフォルダーを他の作業領域に移動することにより、gitの前提に違反する可能性があります。これによりgitのせいにできない不安定な動作が発生する場合は、gitでトリックをプレイしたことを自分のせいにする必要があります。gitはそれを修正する手段を提供しますreset --hard。それが私たちの望んでいないことだけです。これがまさにそのinit/remote add方法が推奨される理由であり、すべてが順調です。
cfi 2013

@towiとOliver P:エラーの特定のケースを解決して欲しいと思っていますが、特に一般的な推奨事項に従うことをお勧めします。データの損失もありません。そして、remote add物事のやり方は、オリバーPによって説明されたような混乱した状況にも適用できます
cfi

1
コメントのない反対投票は、この回答やサイト全体の改善に役立ちません。誰が反対票を投じた場合でも、問題を解決できるようにコメントを残してください。
cfi 2013年

1

私は再びこの問題に遭遇しました。しかし、今回は別の理由で発生しました。以前のバージョンを上書きするために、リポジトリにファイルをコピーしました。これでファイルが変更されたことがわかりますが、diffはdiffを返しません。

たとえば、mainpage.xamlファイルがあります。ファイルエクスプローラーで、現在のリポジトリのファイルに新しいmainpage.xamlファイルを貼り付けました。別のマシンで作業を行い、ファイルをここに貼り付けました。
gitは修正を示しています

ファイルは変更されたように見えますが、git diffを実行すると、変更は表示されません。これはおそらく、ファイルのfileinfoが変更され、gitが実際には同じファイルではないことを認識しているためです。面白い。

git diffは何も表示しません

ファイルに対してdiffを実行すると、何も表示されず、プロンプトが返されるだけです。


1

私はこれと同じ問題を次のように説明しました:入力した場合

$ git diff

Gitは単にエラーなしでプロンプトに戻りました。

入力した場合

$ git diff <filename>

Gitは単にエラーなしでプロンプトに戻りました。

最後に、周りを読んで、git diff実際にがmingw64\bin\diff.exe作業を実行するように呼び出していることに気付きました。

これが契約です。私はWindowsを実行していて、別のBashユーティリティをインストールしていて、それが私のパスを変更したため、mingw64 \ binディレクトリをポイントしなくなりました。

したがって、次のように入力した場合:

git diff

そしてそれはあなたがこの問題を抱えているかもしれないプロンプトに戻るだけです。

によって実行される実際のdiff.exeはgit、mingw64 \ binディレクトリにあります。

最後に、これを修正するために、実際にmingw64\binディレクトリをGitが探していた場所にコピーしました。試してみましたが、それでも機能しませんでした。

次に、Git Bashウィンドウを閉じ、再び開いて、失敗していた同じリポジトリに移動しましたが、現在は機能しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.