git reset --hard 후에 남은 변경되지 않은 변경 사항


275

git reset --hard, git status나를 내 파일을 제공합니다 Changes not staged for commit:섹션.

나는 또한 시도했다 git reset ., git checkout -- .그리고 git checkout-index -f -a아무 소용.

그렇다면 단계적 변경을 어떻게 제거 할 수 있습니까?

이것은 Visual Studio 프로젝트 파일에만 적용되는 것 같습니다. 기묘한. 이 붙여 넣기를 참조하십시오 http://pastebin.com/eFZwPn9Z을 . 이 파일들에서 특별한 점은 .gitattributes에 내가 가지고있는 것입니다.

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf

또한 autocrlf내 global에서 false로 설정되어 .gitconfig있습니다. 어떻게 든 관련이있을 수 있습니까?


저장소의 루트에서 해당 명령을 적용 했습니까? 공지 사항 .은 루트 디렉토리가 아닌 현재 디렉토리를 나타냅니다
Alexander

1
루트 저장소에서 실제로 수행했습니다.
Norswap

당신의 git버전 은 무엇입니까 ? 당신은 바보 같은 실수를하거나 버그가 오래된 버전이 있습니까?
Shahbaz

git 1.7.4 msysgit입니다. 실수 일 수도 있지만 명령이 단순 해 보였으므로 실수를 발견 할 수 없었습니다.
Norswap

기록을 위해 최신 버전의 msysgit (1.7.11)를 사용해 보았지만 문제는 지속됩니다.
Norswap

답변:


361

나는 같은 문제가 있었고 .gitattributes파일 과 관련이 있었다 . 그러나 문제를 일으킨 파일 형식이에 지정되지 않았습니다 .gitattributes.

간단히 실행하여 문제를 해결할 수있었습니다.

git rm .gitattributes
git add -A
git reset --hard

7
gitattributes 파일의 * text = auto 지시문입니다. 파일 끝을 자동으로 변경하므로 상태를 확인할 때 파일이 "수정 됨"으로 자동 표시됩니다.
코디 장고

3
이것은 효과가 있지만 왜 그런지 정확히 이해하지 못합니다. 누구나 각 명령을 설명해야합니까?
Edwin Stoteler

18
@NLwino, git rm .gitattributes인덱스에서 .gitattributes를 제거합니다. git add -A모든 인덱스에 (.gitattributes의 제거 포함)을 추가 해야 하는 정말 문제라면 만, .gitattributes를 제거합니다. git reset --hard커밋되지 않은 모든 변경 사항을 재설정합니다. 여기에는 .gitattributes 제거가 포함됩니다. 본질적으로 이것은 * text=auto한 커밋에 대한 .gitattributes (및 지시문)를 삭제 한 다음 삭제하는 동안 인덱스를 재설정하여 다시 배치하지만 다시 배치하지만 다른 파일을 이미 재설정 한 후에는 다시 수정되지 않았습니다.
cloudworks

4
@ GameScripting,이 솔루션은 저에게 효과적이지 않습니다. 같은 그런 파일이 없습니다 .gitattributes: "치명적인 : pathspec '.gitattributes는'모든 파일과 일치하지 않습니다"
Pacerier

4
나는 그렇게하고 말한다 fatal: pathspec '.gitattributes' did not match any files . 내가 뭘 잘못하고 있죠?
Honey

136

해결 !!!

다음 단계를 사용하여이 문제를 해결했습니다.

1) Git의 인덱스에서 모든 파일을 제거하십시오.

git rm --cached -r .

2) Git 인덱스를 다시 작성하여 모든 새로운 줄 끝을 가져옵니다.

git reset --hard

해결책은 자식 사이트 https://help.github.com/articles/dealing-with-line-endings/ 에 설명 된 단계의 일부였습니다.


5
이 작업은 다른 작업이 없을 때 작동합니다! 우리는 이것과 다른 많은 스레드에서 모든 것을 시도했습니다. 큰 개발 팀이므로 동일한 crlf에있는 모든 사람을 얻는 것은 악몽이지만 문제를 해결합니다.
tkersh

흥미있는 ... 나는 모든 것을 삭제하는 대신 "git rm --chached <one_specific_file>을 사용했습니다."git status "는 그 파일이 삭제되고 추적되지 않은 것으로보고했습니다. 그런 다음"git reset --hard "는 그 파일 다른 모든 파일을 수정 합니다. "git
rms를

아시다시피 모든 캐시를 삭제합니다. 대규모 프로젝트에서는 많은 시간이 낭비 될 수 있습니다.
Ohar

그것은 잔인합니다. repo 디렉토리를 삭제하고 다시 복제하여 동일한 작업을 수행 할 수 있습니다.
ingyhere

4
Windows를 사용 중이고 대소 문자를 구분하지 않는 것을 고려하십시오. Mac 또는 Linux와 같이 대소 문자를 구분하는 파일 시스템을 사용하는 개발자와 함께 작업하는 경우 태그, 브랜치 또는 파일을 다른 경우에 커밋 할 수 있습니다. 이 상황에서 인덱스는 OS가 가져올 때 덮어 쓴 기존 파일을 표시합니다. 이를 해결하는 유일한 방법은 Git 서버에 이름 지정 정책을 설정하거나 (후크) 오류를 미리 감지하는 것입니다.
ingyhere

97

힘내는 저장소에없는 파일을 재설정하지 않습니다. 따라서 다음을 수행 할 수 있습니다.

$ git add .
$ git reset --hard

이렇게하면 모든 변경 사항이 준비되어 Git에서 해당 파일을 인식 한 다음 다시 설정합니다.

그래도 문제가 해결되지 않으면 변경 사항을 숨기고 삭제하십시오.

$ git stash
$ git stash drop

4
파일이 이미 추적되었습니다. 어쨌든 시도했지만 작동하지 않습니다. 내 저장소에 실제로 문제가 있어야하지만 단서가 없습니다. git stash thingy에 대해서는 Shahbaz에 대한 나의 대답을 참조하십시오.
Norswap

자식 상태를 할 때 무슨 일이 일어나고 있습니까?
YuriAlbuquerque

1
나는 해결책에 대해 생각했다. 커밋과 대화식 리베이스를 만들어 커밋을 지 웁니다.
YuriAlbuquerque

나는 한 시점에서 그것을 시도했고, 효과가 있었고, 나중에 나는 그것을 한 번 더 시도하고 내 대답의 편집에 요약 된 놀라운 결과를 생각해 냈습니다.
Norswap

@YuriAlbuquerque, Git은 POLA를 잘 이해하지 못합니다 . git reset --hard" 스테이징 영역과 작업 디렉토리를 모두 일치하도록 재설정 " 하는 것이 중요하지 않습니까? 파일이 준비되지 않은 경우 분명히 할 때 제거하려고합니다 reset --hard.
Pacerier

71

Windows 용 Git을 사용하는 경우 이것이 문제 일 수 있습니다.

나는 똑같은 문제가 있었고 숨김, 하드 리셋, 청소 또는 심지어 모든 변경 사항이 여전히 남아 있습니다. 문제로 밝혀진 것은 git에 의해 올바르게 설정되지 않은 x 파일 모드였습니다. 이것은 Windows 용 git의 "알려진 문제"입니다. 로컬 변경 사항은 실제 파일 차이없이 gitk 및 git 상태에서 이전 모드 100755 새 모드 100644로 표시됩니다.

수정은 파일 모드를 무시하는 것입니다.

git config core.filemode false

더 많은 정보는 여기에


2
rm -rf *; git checkout HEAD .그렇지 않은 경우에도 작동했습니다 . 휴!
forumulator

stash drop / hard reset / rm .attributes 모두 실패하는 동안 나를 위해 일했습니다.
kakyo

나는 맥에서 호스팅되었습니다 리눅스에서 자식의 repo 작업에 문제가있을 때이 또한 나를 위해 일한
prmph을

나를 위해 일했다-다른 모든 것을 시도하고 그렇습니다 예전 모드 대 새로운 모드는 문제였습니다 (내가 다른 번호를 가지고 있지만 파일은 동일
하다는

생명과 시간 절약.
Yogesh Patil

31

좋아, 나는 문제를 해결했다.

그것은 그 보였다 .gitattributes포함 파일 :

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf

프로젝트 파일이 스테이지되지 않은 것처럼 보이게 만들었습니다. 나는 그것이 왜 그런지에 대한 단서가 없으며, git의 방법에 대해 누군가가 우리에게 좋은 설명을 해주길 정말로 바라고 있습니다.

내 수정이 파일을 제거하고, 추가했다 autocrlf = false아래 [core]에서 .git/config.

이것은 모든 개발자가 필요로하기 때문에 이전 구성과 정확히 같은 것은 아닙니다 autocrlf = false. 더 나은 수정을 찾고 싶습니다.

편집하다:

나는 유죄 판결을 내리고 주석을 풀고 효과가있었습니다. 뭐야 ... 나도 ...!


1
방금 동일한 문제가 발생했으며 이것이 유일한 해결책이었습니다. 필자의 경우 기능 분기에서 마스터로 전환하고 업스트림에서 새로운 변경 사항을 가져 왔으며 수정 된 2 개의 파일에 대해 시작되었습니다. 파일이 Unix에서 Windows 줄 끝으로 전환되어 관련이있을 수 있습니다. 어떻게 또는 왜 확실하지 않습니다.
Steven Surowiec

+1 Windows Git에서 동일한 문제. 이미 있었다 autocrlf = false. 업스트림 svn repo ( git svn fetch/ git merge git-svn)의 변경 사항을 병합했으며 수정 된 것으로 표시된 1 개의 파일이 남았습니다. 이상한 점은 내가 전에이 문제를 겪었고 내가해야 할 모든 것은 다른 -f플래그 ( 플래그 포함)를 확인한 다음 다시 전환하는 것입니다. 나는 그것을하고 작동했지만 기능 지점으로 전환했을 때 "변경"이 돌아 왔습니다! 답의 맨 아래에서 편집 한 것이 해결책이었습니다. 내 경우에는 .gitattributes 파일 맨 위에 한 줄을 주석 처리하거나 주석 처리를 제거했습니다.* text=auto !eol
Aaron Blenkush

1
EDIT도 나를 위해 일했습니다 :의 행을 주석 처리하고 .gitattributes, 실행 git status을 취소하고에서 행을 주석 해제하고 다시 .gitattributes실행 git status하십시오.
Ignitor

git이 해당 파일을 재설정 한 다음 .gitattributes다시 지정된 줄 끝을 적용하기 때문 입니다. 는 git diff아마 유명한 보여줍니다 녹색 빨강 / 벽의 벽 라인 끝 차이의 전형이다.
Dagrooms

21

가능한 원인 # 1-라인 종료 정규화

이러한 상황이 발생할 수있는 상황 중 하나는 라인 엔딩에 대한 올바른 구성없이 해당 파일을 리포지토리에 체크인 한 경우 (1) 잘못된 라인 엔딩 또는 혼합 된 라인 엔딩으로 리포지토리에 파일을 생성 한 경우입니다. 확인하려면 git diff줄 끝의 변경 사항 만 표시 되는지 확인 git diff | cat -v하십시오 ( 기본적으로 표시되지 않을 수 있음 ^M). 캐리지 리턴을 리터럴 문자 로 보십시오 .

결과적으로 누군가가 줄 끝을 정규화하기 .gitattributes위해 core.autocrlf설정을 추가 하거나 수정했습니다 (2). .gitattributes또는 전역 구성을 기반으로 Git은 요청한 줄 끝 정규화를 적용하는 작업 복사본에 로컬 변경 사항을 적용했습니다. 불행히도, 어떤 이유로 git reset --hard이러한 라인 정규화 변경을 취소하지 않습니다.

해결책

로컬 줄 끝이 재설정되는 해결 방법으로는 문제가 해결되지 않습니다. 파일이 git에 의해 "보일"때마다, 정규화를 다시 시도하여 동일한 문제가 발생합니다.

최선의 선택은 자식이 일치하도록 REPO의 모든 라인 엔딩 정상화에 원하는 정상화를 적용 할 수 있도록하는 것입니다 .gitattributes참조 - 및 변경 사항을 커밋 자식 필터 - 분기 수정 라인 엔딩을 시도하지만, 운이없는 .

실제로 변경 사항을 수동으로 파일로 되돌리려 고하면 가장 쉬운 해결책은 수정 된 파일을 지우고 git에게 파일을 복원하도록 지시하는 것 같습니다.이 솔루션은 지속적으로 100 % 작동하지 않는 것으로 보입니다. 시간 ( 경고 : 수정 된 파일에 줄 끝 이외의 변경 사항이있는 경우 이것을 실행 하지 마십시오 !!)

    git status --porcelain | grep "^ M" | cut -c4- | xargs rm
    git checkout -- .

어떤 시점에서 저장소의 줄 끝을 정규화하지 않으면이 문제가 계속 발생합니다.

가능한 원인 # 2-대소 문자 구분

두 번째 가능한 원인은 Windows 또는 Mac OS / X에서 대소 문자를 구분하지 않기 때문입니다. 예를 들어, 저장소에 다음과 같은 경로가 있다고 가정하십시오.

/foo/bar

이제 Linux의 누군가가 /foo/Bar(아마도 빌드 도구 또는 해당 디렉토리를 만든 것으로 인해) 파일을 커밋 하고 푸시합니다. Linux에서 이것은 실제로 두 개의 별도 디렉토리입니다.

/foo/bar/fileA
/foo/Bar/fileA

변경 될 수 있습니다 Windows 또는 Mac에서 출력이 REPO 확인 fileA밖으로 윈도우 수표에 있기 때문에 각 리셋, 리셋 할 수없는, 자식 /foo/bar/fileA윈도우의 경우를 구분하고 있기 때문에, 내용 덮어 쓰기 fileA로를 /foo/Bar/fileA"수정"하고 그 결과.

다른 경우는 저장소에 존재하는 개별 파일 일 수 있으며, 대소 문자를 구분하지 않는 파일 시스템에서 체크 아웃하면 겹칩니다. 예를 들면 다음과 같습니다.

/foo/bar/fileA
/foo/bar/filea

이러한 문제를 일으킬 수있는 다른 유사한 상황이있을 수 있습니다.

대소 문자를 구분하지 않는 파일 시스템의 git 은 실제로이 상황을 감지하고 유용한 경고 메시지를 표시하지만 현재는 그렇지 않습니다 (향후 변경 될 수 있습니다 -git.git 메일 링리스트 에서이 토론 및 관련 제안 패치 참조 ).

해결책

해결책은 git 인덱스의 파일 케이스와 Windows 파일 시스템의 케이스를 정렬하는 것입니다. 이것은 실제 상황을 보여주는 Linux 또는 Windows에서 매우 유용한 오픈 소스 유틸리티 Git-Unite을 사용하여 수행 할 수 있습니다 . Git-Unite은 필요한 경우 변경 사항을 git 인덱스에 적용하여 리포지토리에 커밋 할 수 있습니다.

(1)이 어떤없이, Windows를 사용하는 사람이 대부분이었다 .gitattributes문제의 파일에 대한 정의 및 대한 기본 전역 설정을 사용하여 core.autocrlffalse((2) 참조).

(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/


젠장, 이쪽까지 갔다 첫 줄을 마치고 커밋해야했지만 마침내 마스터를 체크 아웃 할 수있었습니다. 재미 있지 않았다.
Tim Lieberman

16

다른 답변이 작동하지 않으면 파일을 추가하고 재설정을 시도하십시오.

$ git add -A
$ git reset --hard

내 경우에는 git이 추적하는 빈 파일이 많을 때 도움이되었습니다.


작동합니다. 방금 $ git add .대신 사용$ git add -A
Bjarne Gerhardt-Pedersen

8

이에 대한 또 다른 원인은 대소 문자를 구분하지 않는 파일 시스템 일 수 있습니다. 같은 레벨에있는 레포에 여러 개의 폴더가 있다면 이름이 대소 문자 만 다릅니다. 웹 인터페이스 (예 : GitHub 또는 VSTS)를 사용하여 소스 저장소를 찾아보십시오.

자세한 정보 : https://stackoverflow.com/a/2016426/67824


이러한 파일의 이름을 찾으려면 다음을 실행하십시오.git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d
Diomidis Spinellis


5

이 방법들 중 어느 것도 나를 위해 효과가 없었으며 유일한 해결책은 전체 저장소를 핵 복제하고 다시 복제하는 것이 었습니다. 여기에는 숨김, 재설정, 추가 및 재설정, clrf 설정, 대소 문자 구분 등이 포함됩니다.


업데이트, 마운트 된 대소 문자 구분 파일 시스템이 실제로 대소 문자를 구분하지 않는 것으로 나타났습니다. 위에서 언급 한 기술을 사용 하여이 문제를 해결할 수 있다고 수정 한 후.
존 헌트

4

clean 명령을 실행하십시오 .

# Remove all untracked files and directories. (`-f` is `force`, `-d` is `remove directories`)

git clean -fd

3
불행히도 이것은 줄 끝과 관련된 문제를 해결하지 못합니다.
Christopher Schneider

이것은 내 문제가 무엇이든간에 내 문제를 해결하는 것입니다. 나는 .gitattributes리눅스 상자에 있고 모든 개발자와 우리 서버가 리눅스이기 때문에 파일과 줄 끝이 문제가되지 않았습니다.
Samuel Neff

4

확인하십시오 .gitattributes.

내 경우에는 *.js text eol=lf그것에 있고 git 옵션 core.autocrlf은이었다 true.

git이 파일 줄 끝을 자동 변환하고 수정하지 못하게하고 git reset --hard HEAD아무것도하지 않은 상황에 처하게합니다 .

나는 *.js text eol=lf내 의견을 주석 으로 고치고 그 .gitattributes후에 주석 처리를 제거했습니다.

마법처럼 보이는 것 같습니다.


이것은 나를 위해 그것을이었다 내 프로젝트 업그레이드 소개 *.bat text eol=crlf내 프로젝트를.
레오

1

비슷한 문제가 발생 .gitattributes했지만 GitHub의 LFS와 관련이 있습니다. 이것이 OP의 시나리오는 아니지만 .gitattributes파일이 수행하는 작업과 파일이 "팬텀"차이의 형태로 비 단계적 변경을 야기 할 수있는 이유를 설명 할 수 있는 기회를 제공한다고 생각합니다 .

제 경우에는 파일이 이미 시작된 이후와 같이 이미 저장소에있었습니다. 최근의 커밋에서, 나는 git-lfs track너무 넓게 보이는 패턴을 사용하여 새로운 규칙을 추가 하고이 고대 파일과 일치하게되었습니다. 이 파일을 변경하고 싶지 않다는 것을 알고 있습니다. 파일을 변경하지 않았다는 것을 알았지 만 이제는 파일이 스테이지되지 않은 변경 사항에 있었으며 해당 파일의 체크 아웃이나 하드 리셋이 수정되지 않았습니다. 왜?

GitHub LFS 확장은 주로 파일 git을 통한 액세스를 제공 하는 후크를 활용하여 작동 .gitattributes합니다. 일반적으로 항목의 항목은 .gitattributes일치하는 파일을 처리하는 방법 을 지정합니다. OP의 경우에는 라인 엔딩 정규화와 관련이있었습니다. LFS가 파일 저장소를 처리하도록할지 여부는 내 것입니다. 두 경우 모두 gita를 계산할 때 표시 되는 실제 파일이 git diff파일을 검사 할 때 표시되는 파일과 일치하지 않습니다. 따라서 파일 .gitattributes과 일치 하는 패턴을 통해 파일이 처리되는 방식을 변경하면 실제로 파일이 변경되지 않은 경우에도 상태 보고서에서 비 단계적 변경으로 표시됩니다.

모든 질문에 대한 나의 대답은 .gitattributes파일 의 변경 이 당신이하고 싶은 일이라면 실제로 변경 사항을 추가하고 계속 진행해야한다는 것입니다. 그렇지 않다면, .gitattributes하고 싶은 것을 더 잘 표현 하기 위해 를 수정하십시오 .

참고 문헌

  1. GitHub LFS 사양 - 객체 의 파일을 간단한 텍스트 파일로 해시 로 대체하기 위해 cleanand smudge함수 호출에 연결하는 방법에 대한 훌륭한 설명 git.

  2. gitattributes Documentation-문서git 처리 방법을 사용자 정의하는 데 사용할 수있는 모든 세부 사항입니다 .


0

나는 같은 문제가 있었다. 나는 git reset --hard HEAD하지만 여전히 내가 할 때마다 git status일부 파일이 수정 된 것을보고있었습니다.

내 솔루션은 비교적 간단했습니다. 방금 IDE (여기서는 Xcode)를 닫고 명령 줄 (여기서는 Mac OS의 터미널 임)을 닫고 다시 시도해 보았습니다.

그러나 나는 문제의 원인을 찾지 못했습니다.


0

git이 Windows에서 무작위로 잘못된 줄 끝을 체크 아웃 할 때 문제가 있다고 생각하며 유일한 해결 방법은 다른 분기를 체크 아웃하고 git이 변경 사항을 무시하도록하는 것입니다. 그런 다음 실제로 작업하려는 지점을 확인하십시오.

git checkout master -f
git checkout <your branch>

이렇게하면 의도적으로 변경 한 내용이 삭제되므로 체크 아웃 직후에이 문제가 발생하는 경우에만 수행하십시오.

편집 : 나는 실제로 처음 운이 좋을 수도 있습니다. 지점을 전환 한 후 다시 조금 알게되었습니다. 브랜치 변경이 변경된 후 git 파일이 수정 된 것으로보고 된 것으로 나타났습니다. (git이 CRLF 줄 끝을 파일에 올바르게 적용하지 않았기 때문일 것입니다.)

Windows 용 최신 git으로 업데이트했으며 문제가 사라지기를 바랍니다.


0

비슷한 문제이지만 표면에만 확신합니다. 어쨌든, 그것은 누군가를 도울 수 있습니다 : 내가 한 일 (FWIW, SourceTree) : 커밋되지 않은 파일을 보관하고 하드 리셋을 수행했습니다.


0

다른 답변에서 지적했듯이 문제는 라인 엔드 자동 수정 때문입니다. * .svg 파일에서이 문제가 발생했습니다. 내 프로젝트에서 아이콘에 svg 파일을 사용했습니다.

이 문제를 해결하려면 git에 gitgittributes에 아래 줄을 추가하여 svg 파일을 텍스트 대신 이진 파일로 처리해야 함을 알립니다.

* .svg 바이너리


0

비슷한 상황에서. 한 줄에 여러 줄의 끝 (. asp , .js, .css ...이 아닌)을 다른 인코딩으로 채울 수있는 많은 프로그래머들과 함께 수년간 고통을 겪었습니다. 얼마 전에 .gitattributes를 거부했습니다. 리포지터리 설정 autorclf = truesafecrlf = warn.

아카이브에서 서로 다른 라인 끝을 동기화 할 때 마지막 문제가 발생했습니다. 아카이브에서 복사 한 후 git 상태에서 많은 파일이 메모와 함께 변경됩니다

The line will have its original line endings in your working directory. warning: LF will be replaced by CRLF in ...

Git에서 작업 트리 라인 엔딩을 정규화하는 방법의? 도움

git add -u


0

내가 겪은 또 다른 가능성은 저장소의 패키지 중 하나가 분리 된 HEAD로 끝날 수 있다는 것입니다. 여기에 대한 답변이 도움이되지 않고 이와 같은 자식 상태 메시지가 표시되면 동일한 문제가있을 수 있습니다.

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:   path/to/package (new commits)

로 가는데 path/to/package폴더 A를 git status다음과 같은 결과를 산출한다 :

HEAD detached at 7515f05

그런 다음 다음 명령으로 문제를 해결 master해야합니다. 여기서 로컬 지점으로 대체해야합니다.

git checkout master

그리고 당신은 당신의 로컬 브랜치가 원격 브랜치 뒤에 어떤 양의 커밋이 될 것이라는 메시지를 보게 될 것입니다. git pull그리고 당신은 숲에서 나와야합니다!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.