web-dev-qa-db-ja.com

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

私は同様の質問をすべて見てきましたが、私は二重にチェックしました、そして奇妙なことが間違いなく起こっています。

1台のサーバー(git 1.8.1を使用するSolaris)で、gitリポジトリを複製し、.gitフォルダーを既存のライブファイルにコピーしました。これは完璧に機能し、実行できました

git status

それから

git diff [filename]

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

ただし、別のサーバー(git 1.7.6を搭載したSolaris)でもまったく同じことをしています

git diff [filename] 

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

149
Oliver P

ファイルを index に追加しました:

git add file_name

その後、実行しました:

git diff --cached file_name

Git diff here の説明を見ることができます。

Git addを取り消す必要がある場合は、こちらを参照してください。 コミット前に「git add」を取り消す方法は?

68
Adrian Mann

git statusが違いを示すのにgit diffが違いを示さない理由はいくつかあります。

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

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

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

54
cmccabe

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

git config core.fileMode false

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

46

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

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

git add -A
git reset

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

32
Jaakko

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

実行してみてください:

GIT_TRACE=2 git <command>

何か役に立つものがあるかどうかを確認してください。それでも解決しない場合は、ただトレースして何が間違っているのかを確認してください。

strace git <command>
17
user1338062

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

10
rcwxok

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

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

ただし、前の回答とは異なり、-Fオプションを削除したくありませんでした。スクリーンフルより短い場合、lessに差分が表示されないように明示的にそこに配置したからです。

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

これが誰かを助けることを願っています。

5
avivr

簡潔な答え

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
> 
4
Shaun Luttin

同様の問題が発生しました。 git diff fileは、名前の一部を大文字でgitインデックスに追加したため、何も表示されませんでした:GeoJSONContainer.js。その後、名前をGeoJsonContainer.jsに変更し、変更の追跡を停止しました。 git diff GeoJsonContainer.jsは何も表示していませんでした。強制フラグを使用してインデックスからファイルを削除し、ファイルを再度追加する必要がありました。

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

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

あなたのユースケースに関する私の仮定:ファイルとディレクトリを含む既存のディレクトリがあり、それを他の場所からクローンされたgitリポジトリに変換したいwithout現在のディレクトリ内のデータを変更します。

本当に2つの方法があります。

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

この方法はあなたがしたことです-既存のリポジトリを空のディレクトリにクローンし、.git dirを宛先ディレクトリに移動します。問題なく動作するためには、一般的にこれを実行する必要があります

git reset --hard

ただし、現在のディレクトリ内のファイルの状態が変更されます。ディレクトリのフルコピー/ rsyncでこれを試して、どのような変更があるかを調べることができます。少なくともその後は、git logstatusの間に矛盾が見られなくなるはずです。

Init new repo-Originをポイント

2番目の方法はそれほど邪魔になりません。目的地にcdし、新しいレポジトリを開始します

git init

次に、新しいレポに、他の場所に祖先があることを伝えます。

git remote add Origin original_git_repo_path

その後、安全に

git fetch Origin master

ローカルファイルを変更せずにデータをコピーします。これですべてが正常になります。

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

2
cfi

次のように説明したのと同じ問題がありました:入力した場合

$ git diff 

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

入力した場合

$ git diff <filename>

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

最後に、Git diffが実際にmingw64\bin\diff.exeを呼び出して作業を実行していることに気付きました。

これが取引です。私はWindowsを実行しており、別のbashユーティリティをインストールしていたので、パスが変更されたため、mingw64\binディレクトリを指すことはなくなりました。

したがって、次のように入力すると、git diffがプロンプトに戻るだけで、この問題が発生する可能性があります。

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

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

それから、git bashウィンドウを閉じて再度開き、失敗した同じリポジトリに移動しましたが、現在は動作しています。

これがあなたにも役立つことを願っています。

1
raddevus

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

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

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

git diff shows nothing

ファイルでdiffを実行すると、何も表示されず、プロンプトが返されるだけであることがわかります。

1
raddevus

上記 で既に述べたように、この状況は行末の問題(CRLFと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.
1
Stefano M