'git status'는 변경된 파일을 보여 주지만 'git diff'는 그렇지 않습니다


181

나는 비슷한 질문을 모두 보았습니다. 그러나, 나는 두 번 확인했고 이상한 일이 분명히 일어나고 있습니다.

한 서버 (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 출력이 표시됩니다.


9
색인에 있습니까? 그렇다면를 사용하여 diff를 볼 수 있습니다 git diff --cached.
jeremyharris

2
git diff --cached빈 출력도 제공합니다.
Oliver P

git log또한 출력을 제공하지 않습니다.
Oliver P

실제로 버그가 있다고 가정하면 최소한의 예를 만들 수 있어야합니다. 그것을 재현하고 샘플을 공유하십시오.
mheinzerling

1) 파일 모드가 변경 되었습니까? 여기 에서 core.fileMode옵션을 찾으 십시오. 2) 또한 Console2가 실제로 실행 중일 때 Console2 구성 (git 아래에 있음)과 비슷한 문제가 있습니다. 어쩌면 파일 잠금의 일종으로 파일이 변경된 것을 git로 만들 수 있습니다.
madhead

답변:



63

git status차이를 보일 git diff수 있지만 그렇지 않을 수 있는 몇 가지 이유 가 있습니다 .

  • 파일의 모드 (권한 비트)가 예를 들어 777에서 700으로 변경되었습니다.

  • 줄 바꿈 스타일이 CRLF (DOS)에서 LF (UNIX)로 변경되었습니다.

어떤 일이 git format-patch HEAD^발생했는지 확인하는 가장 쉬운 방법 은 생성 된 패치의 내용을 확인하고 실행 하는 것입니다.


11
변경 권한 파일이 적용되는 경우 : git config core.filemode 파일의 권한 무시에 대해 false
jruzafa

CRLF에서 LF 로의 줄 바꿈 변경이 git status에 차이가 있고 git diff가 표시되지 않는 상황 중 하나라는 것을 어떻게 알았습니까?
Alex Spurling

Windows를 사용하는 동료가 있으면 줄 끝에 관한 모든 종류의 재미있는 것을 찾을 수 있습니다. "git diff"에 CRLF에서 LF 로의 변경이 표시되는 경우가있을 수 있습니다. 구성에 따라 다를 수 있습니다. 한동안 Windows에서 작업하지 않았으므로 현재 기본값이 무엇인지 모르겠습니다.
cmccabe 2016 년

59

나에게는 파일 권한과 관련이 있습니다. 내 프로젝트에 Mac / Linux를 가진 사람이 Windows git 클라이언트가 재현하지 못한 기본 권한이 아닌 일부 파일을 커밋하는 것 같습니다. 나를위한 해결책은 git에게 파일 권한을 무시하도록 지시하는 것이 었습니다.

git config core.fileMode false

다른 통찰력 : Git이 파일 모드 (chmod) 변경을 무시하도록하려면 어떻게합니까?


이렇게하면 파일이 생성 / 수정 된 시간과 관련이 있다고 생각하지만 많은 파일에서 발생하는 문제가 해결되었습니다.
Derek

이것은 나를 위해 해결했습니다. Mac / Linux 볼륨에서는 fileMode 값이 true로 설정되고 Windows 볼륨에서는 false로 표시됩니다. Mac에서 Windows로 프로젝트를 옮겼는데 false로 전환해야했습니다.
geekinit

1
Windows 10에 디렉토리를 마운트하는 Docker 컨테이너를 사용하여 VSCode를 실행하는 경우에도 도움이되었습니다. 컨테이너 외부에서 git 상태를 확인하면 파일을 변경하지 않은 것으로 올바르게 표시됩니다. 그러나 컨테이너 내부의 자식 상태를 확인하면 파일이 변경되었음을 보여줍니다. 컨테이너 내에서 위의 명령을 실행하면 문제가 해결되었습니다.
Frederick Ollinger

39

일부 프로그램에서 수백 줄 끝이 수정 git diff되어 모든 소스 파일이 변경된 것으로 나열 되는 문제가있었습니다 . 줄 끝 git status을 수정 한 후에도 여전히 파일을 수정 된 것으로 나열했습니다.

모든 파일을 색인에 추가 한 다음 색인을 재설정하여이 문제를 해결할 수있었습니다.

git add -A
git reset

core.filemode 거짓으로 설정되었습니다.


감사합니다! 매력처럼 일했다!
Starwave

1
로 해결했습니다 . 아래 답변을git add --renormalize . 참조하십시오 .
Stefano M

17

Git 설치 또는 저장소에 문제가 있다고 생각합니다.

달리기를 시도하십시오.

GIT_TRACE=2 git <command>

유용한 정보가 있는지 확인하십시오. 그래도 도움이되지 않으면 strace를 사용하여 무엇이 잘못되었는지 확인하십시오.

strace git <command>

6
@towi : 이것은 당신에게 현상금의 가치가 있기 때문에, 당신이 비슷한 실패의 이유에 대해 배운 것을 보는 데 관심이 있습니다.
cfi

5
필자의 경우, env 변수에 -F플래그를 추가하여 표시 할 LESS정보로 가득 찬 화면이 하나 미만인 경우 종료를 지시합니다. git은 호출기로 덜 사용하고 작은 차이가 있었으므로 아무것도 표시되지 않았습니다. 더 적은 종료 후에도 화면에 내용을 표시 -X하는 LESSenv 에 추가 하거나 제거해야했습니다 -F. 내가 최근 에 변수를 변경했음을 상기시키는 실행되고 GIT_TRACE있음을 보여주었습니다 . @rcwxok의 답변과 같은 이유이지만 어떻게 도움이 되었는지에 대한 의견을 원했습니다 . lessLESSGIT_TRACE
Raghu Dodda

이 대답은 나에게 "호출기"와에 리드 나가의 힌트를 제공하는 솔루션 설정 core.pager.gitconfig나를 위해 완벽하게 작동합니다.
ytu

10

나는 비슷한 문제가 있었다 : git diff차이점을 보여주지 만 git diff <filename>그렇지 않다. ( )을 LESS포함한 문자열로 설정 한 것으로 나타났습니다 . 해당 플래그를 제거하면 문제가 해결되었습니다.-F--quit-if-one-screen


1
을 제거하는 대신 -F추가하는 -X것도 효과가있을 수 있습니다. 비슷한 경우 아래 답변을 참조하십시오.
avivr

감사합니다! 나를 미치게했다.
hackel

9

이전 답변 에서 이미 언급 했듯이이 상황은 줄 끝 문제 (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.

새로운 최고의 답변입니다.
PHPst

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

1
병은 여러 가지 일 수 있습니다. 다른 사람들이 언급했듯이 권한 문제이거나 줄 끝이있는 것일 수 있습니다. 이미 단계적으로 변경 될 수도 있습니다. 그러나이 마지막 가능성은 귀하의 예에 맞지 않습니다. 그럼에도 불구하고 솔루션을 사용하면 이유 (질병)를 알 수 없으며 문제가있는 것처럼 보입니다 (비어있는 빈 diff (증상)). 명확하게 : 나는 그것이 나쁜 해결책이라고 말하는 것이 아닙니다. 문제가 사라지기를 원하는 경우 누군가에게 도움이 될 수 있습니다. ... 바람직하게 나는 병사에 대해 약간의 빛을 비췄다. :)
einjohn

@einjohn 대부분의 경우 줄 끝인 것 같습니다. 보인다 statusdiff그 처리의 별도의 방법이 있습니다.
Shaun Luttin

5

나는이 문제에 부딪쳤다. 내 경우는 유사했다 rcwxok에 의해 게시 문제 .LESS

필자의 경우 PAGER환경 변수를로 설정 했습니다 PAGER='less -RSF'.

그러나 이전 답변과 달리 -F옵션 을 제거하고 싶지 않았습니다 . 왜냐하면 diff less가 화면보다 짧으면 diff가 표시되지 않도록 명시 적으로 지정했기 때문 입니다.

원하는 결과를 얻으려면을 제거하는 대신 :을 -F추가했습니다 . 이로 인해 문제가 해결되었으며 또한으로 짧은 차이가 표시되지 않습니다 .-XPAGER='less -RSFX'git diffless


대문자는 이상하게 보입니다. "LESS -RSFX"대신 "less -RSFX"를 의미합니까? 옵션이 올바른 경우입니까?
StackzOfZtuff

1
예, 감사합니다. 실수였습니다. 어떻게되었는지 잘 모르겠습니다. 이제 수정되었습니다.
avivr

3

방금 비슷한 문제가 발생했습니다. git diff file파일 이름을 대문자로 Git 인덱스에 추가했기 때문에 아무것도 표시하지 않았습니다.GeoJSONContainer.js .

나중에 이름을 바꾸고 GeoJsonContainer.js변경 내용 추적을 중지 했습니다 . git diff GeoJsonContainer.js아무것도 보이지 않았다. force 플래그를 사용하여 색인에서 파일을 제거하고 파일을 다시 추가해야했습니다.

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

2

실제로 실제 질문을하지는 않았지만 이것이 일반적인 사용 사례이므로 여기에서 자주 사용하는 것이 있습니다. 직접 시도하여 오류가 지속되는지 확인할 수 있습니다.

사용 사례에 대한 나의 가정 :

파일과 디렉토리를 포함하는 기존 디렉토리가 있으며 현재 디렉토리의 데이터를 변경하지 않고 다른 곳에서 복제 된 Git 저장소로 변환하려고합니다 .

실제로 두 가지 방법이 있습니다.

복제 저장소 .git-mv-git reset --hard

이 방법은 기존 저장소를 빈 디렉토리로 복제 한 다음 .git디렉토리를 대상 디렉토리로 옮기는 것 입니다. 문제없이 작업하려면 일반적으로 다음을 실행해야합니다.

git reset --hard

그러나 현재 디렉토리의 파일 상태가 변경됩니다. 디렉토리의 전체 복사 / 동기화에서 이것을 시도하고 변경 사항을 연구 할 수 있습니다. 적어도 이후에 git log와 (과)의 불일치가 더 이상 발생하지 않아야합니다 status.

새 저장소 초기화-시작점

두 번째는 방해가 덜 cd합니다. 목적지로 향하고 새로운 저장소를 시작하십시오.

git init

그런 다음 새로운 저장소에 다른 곳에 다른 조상이 있다고 말합니다.

git remote add origin original_git_repo_path

그럼 안전하게

git fetch origin master

로컬 파일을 변경하지 않고 데이터를 복사합니다. 이제 모든 것이 괜찮을 것입니다.

항상 오류가 적은 두 번째 방법을 권장합니다.


이것이 git 오류 임을 암시하는 것 같습니다 . 알았어 나는 Linus만큼 똑똑하지 않기 때문에 여전히 적절한 git 이해가 부족하다고 가정했다. ;-)
towi

@towi : 아니요, 이것이 git 오류임을 암시하지 않으며 반대의 의미도 아닙니다. 나는 자식 내부에 익숙하지 않다. 그러나 일반적으로 .git폴더를 다른 작업 영역으로 이동 하면 잠재적으로 자식에 대한 가정을 위반하는 것입니다. 만약 이것이 불규칙한 행동을한다면 우리는 자식을 비난 할 수 없으며, 자식으로 트릭을 플레이한다고 스스로를 비난해야합니다. git은이를 수정하는 수단을 제공합니다 (예 : reset --hard. 그것은 우리가 원하는 것이 아닙니다. 이것이 바로 init/remote add길이 권장 되는 이유 이며 모든 것이 잘됩니다.
cfi

@towi와 Oliver P : 특정 오류 사례가 해결되기를 원하지만 일반적인 권장 사항, 특히 사용 사례에 완벽하게 부합하는 경우가 있습니다. 데이터 손실도 없습니다. 그리고 일을하는 remote add방식은 Oliver P
cfi

1
의견이없는 downvote는이 답변이나 사이트 전체를 개선하는 데 도움이되지 않습니다. 공감하는 사람은 문제를 해결할 수 있도록 의견을 남겨주십시오.
cfi

1

나는이 문제를 다시 우연히 발견했다. 그러나 이번에는 다른 이유로 일어났습니다. 이전 버전을 덮어 쓰기 위해 파일을 저장소에 복사했습니다. 이제 파일이 수정되었지만 diff는 diff를 반환하지 않습니다.

예를 들어 mainpage.xaml 파일이 있습니다. 파일 탐색기에서 현재 메인 저장소의 파일 위에 새로운 mainpage.xaml 파일을 붙여 넣었습니다. 다른 컴퓨터에서 작업을하고 파일을 여기에 붙여 넣었습니다.
자식 쇼 수정

파일은 수정 된 것으로 표시되지만 git diff를 실행하면 변경 내용이 표시되지 않습니다. 아마도 파일의 파일 정보가 변경되었고 git이 실제로 같은 파일이 아니라는 것을 알고 있기 때문일 것입니다. 흥미 롭군

자식 diff는 아무것도 보여주지 않는다

파일에서 diff를 실행할 때 아무것도 표시하지 않고 프롬프트를 반환한다는 것을 알 수 있습니다.


1

나는 다음과 같은 방식으로 같은 문제를 겪었다.

$ git diff

힘내는 단순히 오류없이 프롬프트로 돌아 왔습니다.

내가 입력하면

$ git diff <filename>

힘내는 단순히 오류없이 프롬프트로 돌아 왔습니다.

마지막으로, 주변을 읽음으로써 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.