힘내 풀 : 오류 : 항목 foo가 업데이트되지 않았습니다. 병합 할 수 없습니다.


87

원격 지점에서 내 저장소를 업데이트하고 "git pull"을 수행 할 때이 오류가 계속 발생합니다. 로컬 변경 사항을 적용하지 않았으며 변경 사항이 있어도 유지할 필요가 없습니다.

난 노력 했어:

git reset --hard

그리고 같은 문제가 발생합니다

작동하는 것처럼 보이는 유일한 것은 문제가되는 파일을 삭제하고 git pull을 다시 시도하는 것입니다.

나는 또한 시도했다 git stasha로 다음 git pull. 안돼.

편집 : PortableGit-1.6.4-preview20090729를 사용하여 가짜 오류가있는 이전 버그를 수정해야합니다.


git.or.cz/gitwiki/GitFaq의 설명이 도움이 되는지 확인하십시오 .
Jakub Narębski

Ditto " 작동하는 것처럼 보이는 유일한 것은 문제가되는 파일을 삭제하고 git pull을 다시 시도하는 것입니다. ". 나를 위해 적어도 하나의 파일이 git에 없었습니다. 와일드 카드 규칙에 의해 .gitignored되었습니다. 하지만 왜 그들이 차단제 였는지 확실하지 않습니다.
ruffin

3
나는 실행하여 이것을 해결할 수 있었다 git rm --cached learned/tests/temp_funcs.py-어쨌든 파일이 Untracked Files 목록 에 남아 있기를 원했기 git rm --cached때문에이 경우에는 나를 차단 해제했습니다.
Deep

1
이것은 내가 원했던 병합 중에 나에게 일어났습니다 --abort. 제안 된 솔루션 중 어느 것도 문제가되는 파일을 삭제하는 것 외에는 중단 할 수 없었습니다.
Trevor Reid

답변:


56

이 문제를 해결하는 몇 가지 방법이 있지만 git stash가 나에게 잘 작동한다는 것을 알았습니다. 일시적으로 로컬 변경 사항을 다른 위치에 둡니다. 그런 다음 당겨서 최신 변경 사항을 가져올 수 있습니다. 그런 다음 로컬 변경 사항을 다시 가져올 수 있습니다.

다음과 같이 :

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop

21
원래 질문에서 : "저는"git stash "다음에"git pull "을 시도했습니다. No go."
Charles Wood

나를 위해 작동하지 않았다-내 경우에는 git rm --cached전체 댓글을 작성해야했습니다. stackoverflow.com/questions/1248029/…
Deep

39

특정 파일을 무시하도록 색인을 업데이트하면 이러한 상황이 발생할 수 있습니다.

git update-index --assume-unchanged <file>

예를 들어 다른 지점을 확인하십시오.

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.

인덱스 새로 고침을 강제하면 다음과 같은 문제가 해결됩니다.

git update-index --really-refresh
<file>: needs update

뒤에 :

git reset --hard 

그리고 모든 것이 정상으로 돌아올 것입니다.


2
나는 실행하여 이것을 해결할 수 있었다 git rm --cached learned/tests/temp_funcs.py-어쨌든 파일이 Untracked Files 목록 에 남아 있기를 원했기 git rm --cached때문에이 경우에는 나를 차단 해제했습니다.
Deep

3
git update-index --really-refresh없는 작품이었다! 잘 했어,이 찾기 힘들었다
베르나르도 달 Corno

29

이러한 종류의 문제는 대소 문자 만 다른 두 개의 파일 이름을 가진 저장소에서 가져 오려고 할 때 자주 발생합니다. FAT, NTFS는 대소 문자를 구분하지 않는 모드 (본질적으로 Windows에서 사용되는 경우) 또는 HFS +는 대소 문자를 구분하지 않고 두 개의 파일 "foobar"및 "FOOBAR"이있는 경우 Git은 서로 다른 두 개의 파일을 보게됩니다. 파일 시스템은 하나만 볼 수 있으므로 모든 종류의 문제가 발생합니다. Git은 "FOOBAR"이라고 말하고 체크 아웃 한 다음 "foobar"를 체크 아웃합니다. 파일 시스템은 "FOOBAR"의 내용을 단순히 교체하지만 그대로 두는 것으로 간주합니다. 이제 Git에서는 "FOOBAR"이 "foobar"의 내용으로 바뀌고 "foobar"가 사라진 것으로 보입니다.

이 기본적인 문제에는 두 가지 다른 표현이 있습니다. 하나는 저장소에 실제로 대소 문자 만 다른 두 개의 파일이 포함되어있는 경우입니다. 이 경우 대소 문자를 구분하는 파일 시스템에서 작업하거나 이러한 종류의 충돌이 발생하지 않도록 저장소를 편집해야합니다. 대소 문자를 구분하지 않는 파일 시스템은 단순히이 저장소의 내용을 저장할 수 없습니다.

해결할 수있는 다른 경우는 파일의 대소 문자를 변경하는 이름 바꾸기가 발생하는 경우입니다. 예를 들어 Git 저장소에 "EXAMPLE"에서 "example"로의 이름이 포함되어 있다고 가정합니다. Git은 새 버전을 확인하기 전에 디스크에있는 기존 파일을 덮어 쓰지 않는지 확인합니다. "example"이 새 파일 이름이라고 생각하기 때문에 파일 시스템에 존재하는지 묻고 파일 시스템은 "EXAMPLE"을보고 예라고 말하므로 Git은 새 버전을 덮어 쓸 것이라고 생각하므로 체크 아웃을 거부합니다. 추적되지 않은 파일. 이 경우 관심있는 로컬 변경 사항이없는 경우 간단한git reset --hard <revision-to-checkout>일반적으로 문제를 극복하고 새 개정판으로 이동하는 데 충분합니다. 대소 문자를 구분하지 않는 파일 시스템을 사용하는 경우에만 다른 이름으로 파일 이름을 바꾸지 마십시오. 이렇게하면 이와 같은 문제가 발생할 수 있습니다.


14

@Brian Campbell의 게시물에 대해 더 자세히 설명하기 위해 (하드 리셋도 작동하지 않았기 때문에) 저를 막는 엣지 케이스를 지적하고 싶습니다.

파일 OldFile을 다른 폴더 로 옮기고 이름을 변경했습니다 NewFile. 그런 다음 파일을 assume-unchanged.

이로 인해 분기를 전환 할 수 없었고 저장하거나 푸시 할 은닉처도 없었습니다. 문제는 assume-unchanged플래그 를 설정하기 전에이 파일 변경을 새 이름으로 커밋하지 않았다는 것 입니다. 그래서 다시로 설정하고 no-assume-unchanged커밋 한 다음로 다시 설정하고 assume-unchanged분기를 다시 전환 할 수 있습니다.


1
이 대답은 저를 올바른 길로 인도했습니다. 감사합니다. "git ls-files -v | grep '^ [[: lower :]]'| awk '{print $ 2}'| xargs git update-index --no-assume-unchanged"를 사용하여 변경되지 않은 가정 플래그를 재설정했습니다. , 그런 다음 오류없이 --hard를 재설정 할 수있었습니다.
ocroquette

나는 이것이 '변경되지 않은 것으로 가정'이라고 표시된 모든 파일에도 적용된다고 생각합니다. 원래 이름을 가진 로컬 파일의 변경 사항을 무시하는 것과 동일한 문제가있었습니다. 귀하의 의견은 내가 그 파일을 표시했다는 것을 상기시켜주었습니다. 감사합니다!
Jake_ jul.

5
나도 같은 문제를 안고있어. 기본적으로 "변경되지 않은 것으로 가정"은 사악한 기능입니다. 일단 사용하면 다른 지점을 확인하기가 매우 어렵습니다. 을 checkout -f사용해도 실패합니다.
John Henckel

13

일반적으로 이것은 로컬 저장소에 커밋되지 않은 로컬 파일에 변경 사항이 있음을 의미합니다. 좀 더 자세한 내용 은이 stackoverflow 질문 을 볼 수도 있습니다 .


11
질문에서 : "나는 로컬 변경 ...하지 않았"
찰스 우드

git 버그이거나 git 저장소 손상입니다.
Warren P

12

비슷한 문제가 발생했습니다 (Windows 10). branchA계속해서 master. 그래서 처음 엔 몇 가지 미트되지 않은 변경 한 git stash다음 git checkout -f master그러나 나는 아직도있어 Entry 'fileName' not uptodate. Cannot merge.

git status 커밋 할 것이 아무것도 보이지 않았습니다.

결국 수동으로 파일을 제거하고 다른 브랜치 (물론 내 파일을 다시 가져옴)로 이동할 수 있었으므로 git 어딘가에 버그가있는 것 같습니다.


1
이것은 나를 위해 일한이 질문에 대한 유일한 해결책입니다. .gitignore파일에 오류가 발생했습니다 ! 비록 내가 그것을 변경하지 않았고 git은 내가 그것을 "숨기도록"허용하지 않을 것이다 (로컬 변경이 없기 때문에, 이런!). 그래서 .gitignore파일을 저장소 외부 로 옮긴 다음 (일종의 "백업"으로) git reset --hard저장소를 정상 상태로 "고정"하는을 수행했습니다.
Masked Man

git status어떤 파일이 변경되었는지 보여주고 git restore myFile삭제 하는 대신 사용할 수 있다고 암시 했습니다.
Noumenon

7

파일 권한에도 문제가있을 수 있습니다. config에서 달리 언급하지 않는 한 Git도 버전을 관리합니다. 비슷한 문제가 거의없는 사람들을 위해이 대답을 추가하십시오.


5

시도 할 가치가있는 :

이 업데이트에 대해서만 config 매개 변수core.trustctime 를 false로 설정할 수 있습니까?

core.trustctime

false이면 인덱스와 작업 복사본 간의 ctime 차이가 무시됩니다. inode 변경 시간이 Git 외부 (파일 시스템 크롤러 및 일부 백업 시스템)에 의해 정기적으로 수정 될 때 유용합니다.


2
"git reset --merge"를 실행할 때 위의 오류 메시지를 보았을 때 이것은 실제로 저에게 효과적이었습니다. 이 매개 변수를 false로 설정하면 오류가 제거되었습니다.
DemitryT 2013 년

1
"git merge <feature> --no-ff --no-commit"을 사용하여 다른 브랜치와의 충돌을 확인한 다음 "git merge --abort"로 되돌릴 때 저를 위해 일했습니다. 이 경우 Xcode는 "Git 외부의 것"이었습니다. 거의 10 년 후 감사합니다!
Ralfonso

@Ralfonso 거의 10 년 후, 당신은 : 대부분 환영합니다
VonC

2

다른 사람이 이것을 언급하지 않기 때문에 내 대답을 추가합니다. 제 경우에는 -N플래그 를 사용하여 새 파일을 색인에 추가 한 후 발생 하므로 콘텐츠를 추가하지 않고 색인에 추가하기 만하면됩니다. 이 상태에서 수행 git stash하면이 오류가 발생합니다.


0

스테이징 영역에 추가 되지 않은 파일에 대해 git status말한 상황 후 동일한 오류가 발생했습니다 . 즉, "커밋을 위해 준비되지 않은 변경 사항"제목 아래에 있습니다. 매우 이상합니다. 이것은 일반적으로 발생하지 않습니다.new file: foo.cpp

솔루션 : git add foo.cpp, 그리고 다시 git stash작동했습니다.


0

git merge --abort를 수행하려고했습니다. git restore your_file 명령으로 문제가 해결되었습니다.

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