병합으로 로컬 변경 사항을 덮어 쓰는 'git pull'오류를 어떻게 무시합니까?


568

Git pull에서 다음 오류 메시지를 어떻게 무시합니까?

다음 파일에 대한 로컬 변경 사항은 병합으로 덮어 씁니다.

덮어 쓰 려면 어떻게 해야합니까?

과 같은 것을 시도 git pull -f했지만 아무것도 작동하지 않습니다.

분명히하기 위해 모든 변경이 아니라 특정 변경 사항 만 덮어 쓰고 싶습니다.


관련이 있지만 중복은 없습니다 : stackoverflow.com/questions/52704/…
Daniel Hilgarth

7
@BrianKnoblauch는 완전히 동의합니다! 또한 '덮어 쓰기'인 경우 '병합'이 많지 않습니까? 나는 매일 SVN을 그리워합니다 ...
user1944491

2
git config core.fileMode false내 시간을 절약
Nolwennig


덮어 쓰고 싶지 않으면 어떻게합니까?
Philip Rego

답변:


439

작업 복사본에서 git에 의해 추적되지 않은 파일을 포함하여 모든 로컬 변경 사항을 제거하려면 간단히 숨기십시오.

git stash push --include-untracked

더 이상 필요하지 않으면 이제 그 숨겨 놓을 수 있습니다.

git stash drop

이미 준비한 변경 사항을 숨기지 않으려면 (예 : with) git add옵션을 추가하십시오 --keep-index. 그러나 단계적 변경 사항이 업스트림 변경 사항과 충돌하는 경우 여전히 병합을 방해합니다.


로컬 변경 사항의 특정 부분 만 겹쳐 쓰려면 두 가지 가능성이 있습니다.

  1. 덮어 쓰고 싶지 않은 모든 것을 커밋하고 나머지 방법은 위의 방법을 사용하십시오.

  2. git checkout path/to/file/to/revert덮어 쓰려는 변경에 사용하십시오 . 를 통해 파일이 준비되지 않았는지 확인하십시오 git reset HEAD path/to/file/to/revert.


가능성 # 2가 작동하지 않습니다. 명령을 실행 한 후 아무 일도 일어나지 않습니다. 당겨도 여전히 같은 오류가 발생합니다.
mae

1
@ user1132363 : 그것은 나를 위해 작동합니다. 먼저 하나의 파일로 테스트하십시오. 또한 덮어 쓰려는 파일이 준비되지 않았는지 확인하십시오.
Daniel Hilgarth

3
트릭을 사용하는 것이 었습니다 git checkout HEAD^ path/to/file/to/revert. HEAD ^를 사용하면 모든 차이가 생겼 습니다.
mae

2
@ user1132363 : 현재 체크인 한 버전이 아닌 이전 버전을 체크 아웃합니다. 이것이 올바른 접근법이라고 생각하지 않습니다.
Daniel Hilgarth

1
" save --keep-index" 을 (를) 제외해야했습니다 .
피터 Mortensen

318

다른 두 가지 답변의 도움으로 직접 해결책을 찾았습니다.

git checkout HEAD^ file/to/overwrite
git pull

7
이것은 나를 위해 일했습니다. 이 답변을 확장 해 주시겠습니까? 이게 실제로 뭐하는거야?
AC Patrice

3
그것은 마지막 마스터 브랜치에 커밋 아마 머리 참조에 복귀, 로컬 변경을 떨어 뜨리고 있어요
K3A

32
왜 HEAD 대신 HEAD ^?
Yura

19
HEAD ^는 HEAD ^ 1의 줄임말인데, 이는 본질적으로 HEAD 이전의 커밋을 의미합니다. 그 커밋 전에 HEAD ^ 2를 수행 할 수도 있습니다. 자세한 내용은 git-scm.com/book/en/v2/…stackoverflow.com/questions/1955985/…를 참조하십시오 .
davidneedham

4
이것이 답변에서 무엇을하는지 설명해주세요
endolith

242

이것은 모든 로컬 변경 사항을 무시하고 ID를 요구하지 않습니다.

git reset --hard
git pull

4
따라서 순위가 ​​높은 순위에서 작업해야하며 지금까지 실력이 뛰어나고 등급이 높은 답변을 찾기가 번거 롭습니다.
베네딕토 K.

3
@BenedictK. 나는 순위 시스템이 "대부분의 사람들이 가장 도움이되는 것을"반영한다고 생각합니다. 그들은 투표로 순위가 매겨집니다. 더 많은 사람들이 다른 솔루션을 선호합니다. 이것은 좋은 솔루션이지만 더 많은 사람들이 다른 답변이 도움이된다는 것을 알게 됩니다.
Kittsil

나를 위해 잘 작동
Ender

super easy =) thx ^^
lestat_kim 2009

탱크, 나를 위해 잘 작동
Igor

76

다음은 단계별 변경 사항을 버리는 솔루션입니다.

git reset file/to/overwrite
git checkout file/to/overwrite

11
화가 났을 때, 파일을 체크 아웃 할 때 파일의 줄 바꿈이 변경되었다는 사실에서 인식 된 차이가 발생하면 문제를 해결하지 못합니다.
DanielSank

1
내 문제를 해결했다.
Loïc N.

이 주소 풀을 방지하는 파일의 문제가 어떤 항목을 개최 중단,하지만하지 않기 때문에, IMO, 최고의 답변입니다
theRiley

65

병합하기 전에 변경 사항을 커밋하거나 숨길 수 있습니다.

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
요점은이 작업을 수행 할 필요가 없다는 것입니다. 현재 HEAD 재료를 가져 와서 ..... 병합하십시오! 정말 간단합니다. Git, 다른 모든 VCS는 그렇게합니다. 그러나 아닙니다. Linus는 사용하기가 번거로워 야했습니다.
Jon

@Jon이 솔루션은 우분투를위한 것입니다. 이보다 나은 것을 찾지 못했습니다.
Suneel Kumar

불행히도 --autostash옵션은 옵션으로 만 사용할 수 --rebase있습니다 (
Eugen Konkov

그것은 많은 가치가없는 문제를 야기 할 것입니다. 로드하는 데 최소 5 분이 걸립니다. 또한 "파일 연결 해제"오류가 발생합니다. downvote
Philip Rego

51

하나의 파일에서 로컬 변경 사항을 삭제하려면 다음을 수행하십시오.

git checkout -- <file>

그런 다음 최신 버전으로 파일을 덮어 쓸 수 있습니다.

git pull

@pabloasc 이것은 해당 파일의 로컬 변경 사항을 파괴합니다.
Suneel Kumar

6
예, "이를 덮어 쓰려면 어떻게해야합니까?"
David

1
원래 질문은 이것을 할 수 없습니다.이 답변은 맹목적으로 명령을 복사하여 복사 할 수있는 악몽을 줄 수 있습니다.
Suneel Kumar

커밋을 이미 git reset HEAD~git checkout
준비한

git checkout -- <file>실패error: pathspec '<file>' did not match any file(s) known to git.
A__

18

저장소에 다음에서 제거 된 파일이 몇 개 포함 된 경우 master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

때때로, 이들 중 어느 것도 작동하지 않습니다. 짜증나게, 내가 생각하는 LF로 인해 작동 하는 것은 파일을 삭제 한 다음 당기는 것입니다. 이 솔루션을 권장하지는 않지만 파일이 존재하지 않으면 git은 변경 사항이 아닌 변경 사항이 무시되고 계속 진행할 것임을 알 수 없습니다.

자신의 책임하에 사용하십시오.


줄 끝으로 인해 막힐 때이 방법은 생명의 은인입니다
Dan Pisarski

이것은 나를 위해 작동하지 않습니다. 파일이 로컬에 존재하지 않으며 여전히 오류가 발생합니다.
PRMan

11

git stash save --keep-index 나를 위해 일하지 않았다.

아래 명령이 예상대로 작동했습니다.

git reset --hard
git pull

필요하지 않은 경우 모든 로컬 변경 사항을 대체합니다.


9

여기에 너무 많은 답변이 아직 다른 것을 추가하는 것을 싫어하지만 위의 모든 내용이 필요 이상으로 복잡합니다. Git이 혼란스러워 보이고 변경되지 않은 파일을 수정했다고 말합니다 (변경되지 않았으므로 되돌릴 수는 없지만 변경되었을 것으로 생각할 수는 없습니다) 내가 지금까지 찾은 가장 빠른 것은 :

git stash
git stash drop
git pull

매력처럼 일했다
Blaze

놀랄 만한! 간단하고 효과적인 솔루션.
naïveRSA

훌륭합니다. 감사합니다
Hamza

8

최근 Git에서는 -r/ --rebaseon pull명령을 추가 하여 페치 후 업스트림 브랜치 위에 현재 브랜치를 리베이스 할 수 있습니다 . 경고가 사라져야하지만 해결해야 할 충돌이 발생할 위험이 있습니다.


또는 다른 지점을 강제로 체크 아웃 한 다음 다시 돌아갈 수 있습니다 ( master예 :

git checkout origin/master -f
git checkout master -f

그런 다음 평소대로 다시 당기십시오.

git pull origin master

이 방법을 사용하면 숨김 ( git stash) 및 잠재적 권한 문제, 파일 재설정 ( git reset HEAD --hard), 파일 제거 ( git clean -fd) 등의 시간을 절약 할 수 있습니다 . 또한 위의 내용을 기억하기가 더 쉽습니다.


8

이 문제는 파일을 로컬로 변경했으며 Git 리포지토리의 변경 사항과 동일한 파일이 존재하기 때문에 풀 / 푸시하기 전에 로컬 변경을 숨겨야합니다.

단일 파일의 로컬 변경 사항을 겹쳐 쓰려면 다음을 수행하십시오.

git reset file/to/overwrite
git checkout file/to/overwrite

모든 로컬 변경 사항 (모든 파일의 변경 사항)을 겹쳐 쓰려면 다음을 수행하십시오.

git stash
git pull
git stash pop

또한이 문제는 마스터 분기와 병합되지 않은 분기에 있기 때문일 수 있습니다.


5

git reset --hard && git clean -df

주의 : 추적되지 않은 파일을 재설정하고 삭제합니다.


27
친구의 이마에서 파리를 제거하기 위해 도끼를 사용하지 않습니다.
HonoredMule

3
일부 파일이 삭제 될 것이라는 인식이 없으면이 파일을 사용하지 마십시오.
안드로메다


4

이 문제를 해결하는 가장 좋은 방법은 다음과 같습니다.

git checkout -- <path/file_name>

그 후 다음과 같이 파일을 덮어 쓸 수 있습니다.

git pull origin master

파일이 변경되지 않은 것으로 가정하기 위해 색인을 업데이트했기 때문에 언급 된 문제가있었습니다. 그것은 여전히 ​​내가 풀을 못하게합니다. 나는 git checkout -- path/*한 번만 사용 했고 그 후 풀을 실행할 수있었습니다.
Stephen O'Flynn

4

이것은 라이브 원격 서버의 변경 사항을 버리고 소스 컨트롤 GitHub에서 가져 오는 데 도움이되었습니다.

git reset --hard
git pull origin master

4

다음은 문제를 해결하기위한 전략입니다.

문제 설명

10 개가 넘는 파일을 변경해야합니다. 우리는 시도 PULL (git pull origin master)했지만 Git은 소리 쳤다.

오류 : 다음 파일에 대한 로컬 변경 사항을 병합하여 덮어 씁니다. 병합하기 전에 변경 사항을 커밋하거나 숨기십시오.

우리는 실행하려고 commit다음과 pull하지만 중 하나가 작동하지 않았다.

해결책

파일이 "스테이지 영역"(일명 "인덱스 영역")에 있고 일부는 "헤드 영역"(일명 "로컬 Git 디렉토리")에 있었기 때문에 실제로 는 더티 스테이지에있었습니다. 그리고 우리는 서버에서 변경 사항을 가져오고 싶었습니다.

Git의 각기 다른 단계에 대한 정보는 다음의 링크를 확인하십시오 : GIT 단계

우리는 다음 단계를 따랐다

  • git stash (이것은 작업 디렉토리를 깨끗하게 만들었습니다. 변경 사항은 Git에 의해 스택에 저장됩니다).
  • git pull origin master (서버에서 변경 사항을 가져옵니다)
  • git stash apply (스택의 모든 변경 사항을 적용)
  • git commit -m 'message' (변경 사항을 커밋)
  • git push origin master (서버에 대한 변경 사항을 푸시했습니다)
  • git stash drop (스택을 떨어 뜨립니다)

언제 그리고 왜 숨겨야하는지 이해합시다

더티 상태 에있는 경우 파일을 변경하고 어떤 이유로 든 매우 긴급한 작업을 위해 다른 브랜치 를 가져 오거나 다른 지점으로 전환 해야한다는 의미입니다. 변경 사항을 적용 할 때까지 전환하십시오. 이 stash명령은 도움의 손길로 여기에 있습니다.

ProGIT , 2nd Edition 책에서 :

종종 프로젝트의 일부에서 작업 할 때 상황이 지저분하고 분기가 다른 작업을 수행하도록 전환하려고합니다. 문제는, 당신은 나중에이 시점으로 돌아갈 수 있도록 반 완료 일을 저지르고 싶지 않다는 것입니다. 이 문제에 대한 답은 git stash 명령입니다. 스 태싱은 작업 디렉토리의 더티 상태, 즉 수정 된 추적 파일 및 단계적 변경 사항을 취하여 언제든지 다시 적용 할 수있는 완료되지 않은 변경 사항 스택에 저장합니다.


3

특정 변경 사항을 덮어 쓰려면 잊고 싶은 변경 내용을 알려주는 방법이 필요합니다.

을 사용하여 포기할 변경 사항을 선택적으로 숨기고을 사용하여 git stash --patch해당 숨길 수 있습니다 git stash drop. 그런 다음 원격 변경 사항을 가져 와서 정상적으로 병합 할 수 있습니다.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

나는 이것이 왜 아직 대답하지 않았는지 알지 못하지만 해결책은 간단합니다. 여기에있는 모든 대답은 동일합니다 : 로컬 변경 사항을 삭제 / 저장하고 업스트림 save적용 한 다음 로컬 변경 사항을 적용하십시오 ().

무엇 git pull --rebase --autostash단계별 작업을 수행합니다

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

내 경우 (아마도 너의 것) :

로컬 변경 사항 (작업 디렉토리의 변경 사항)이 있습니다.

여기에 이미지 설명을 입력하십시오

원격 변경 사항을 가져 오려고하면 오류가 발생합니다.

여기에 이미지 설명을 입력하십시오

이 변경 사항은 로컬 변경 사항과 교차하지 않습니다.

여기에 이미지 설명을 입력하십시오

따라서 pull --rebase --autostash로컬 변경 사항을 자동으로 저장하고 아무런 문제없이 적용하면

여기에 이미지 설명을 입력하십시오

이제 내 로컬 변경 사항이 약간 낮아졌습니다. 여기에 이미지 설명을 입력하십시오


2

나는 이것의 특별한 경우를 가졌다 : 나는 --sumume-unchanged 파일을 가지고 있었다. git status명령이 변경 사항을 표시하지 않아 찾기가 어려웠습니다.


나는 같은 문제가 있습니다. 당신은 그것을 해결하는 방법을 찾았습니까? 변경하지 않은 것으로 가정 한 다음 제거하고 다시 추가 할 수 있다고 가정합니다. 내가 한 것은 변경되지 않은 버전을 얻기 위해 수동으로 해당 파일을 체크 아웃하는 것입니다 ... 체크 아웃 / 리베이스 / 병합을 덮어 쓸 수있는 방법이 있는지 궁금합니다. 그들.
David

1
아니요, 나는 "변경되지 않은"것으로 간주하는 전체를 포기해야했습니다.

2

서버에서 프로덕션 변경 사항을 유지하려면 새 구성 항목으로 병합하십시오. 처리 방법은 다음과 같습니다.

git stash
git pull
git stash pop

어쩌면 모든 작업을 실행하지는 않을 것입니다. 다음에 할 수있는 일을 알 수 있습니다.


그런 다음 Git diff-w + 파일 이름을 사용하여 코드 병합을 자동으로 확인합니다.
YanQing

1

내 저장소에서 파일을 무시하고 있었고 내가 할 때 git pull upstream master다음 오류가 발생했습니다.

error : 다음 파일에 대한 로컬 변경 사항이 merge로 겹쳐 써질 것입니다 : myfile.js 병합하기 전에 변경 사항을 커밋하거나 숨기십시오. 중단

그것을 해결하기 위해 나는 다음을했다.

git update-index --no-assume-unchanged myfile.js

그런 다음 git status이 메시지를 받았습니다.

지점 마스터에서 지점은 4 커밋으로 '원점 / 마스터'뒤에 있으며 빨리 감을 수 있습니다. ( "git pull"을 사용하여 로컬 브랜치를 업데이트하십시오)

커밋을 위해 준비되지 않은 변경 사항 : (커밋 될 내용을 업데이트하려면 "git add ..."사용) (작업 디렉토리에서 변경 사항을 무시하려면 "git checkout-..."사용)

수정 : myfile.js

커밋에 추가 된 변경 사항 없음 ( "git add"및 / 또는 "git commit -a"사용)

그런 다음을 git checkout myfile.js수행했습니다 git pull upstream master. 이번에는 git pull 작업이 성공했습니다.


1

마스터에서 당길 때이 문제가 발생했습니다.

Visual Studio를 사용하여 처리 한 방식;

  1. 먼저 솔루션에서 실행 취소 커밋을 수행했습니다.
  2. 그런 다음 Git pull 프로세스를 수행했습니다.

도움이 되었기를 바랍니다!


1

가장 간단한 해결책은 다음과 같습니다.

git reset --hard && git pull

1

나는 자식에 익숙하지 않으며 내 솔루션이 좋은 아이디어인지 확실하지 않습니다.

나는 모든 답변을 테스트했지만 아무도 나를 위해 일하지 않았습니다!

그러나 다른 해결책을 찾았습니다.

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

도움이 되었기를 바랍니다.


1

아직 커밋되지 않은 로컬 리포지토리에 일부 변경 사항이 있으므로 원격 리포지토리에서 가져 오기 전에 로컬 리포지토리에서 변경 내용을 커밋하기 때문에 "다음 파일에 대한 로컬 변경 사항을 병합으로 덮어 씁니다"라는 오류가 발생합니다.

원격 저장소에 분기 xyz가 있고 원격 저장소 xyz 분기가 로컬 저장소 xyz 분기에 병합 (복사)되기를 원한다고 가정 해 보겠습니다.

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

이 오류가 줄 끝으로 인해 발생한 경우

git add
git checkout mybranch

작동합니다. 왜 작동하는지 잘 모르겠습니다.


0

Pycharm의 경우 Git-> Revert를 수행 한 다음 당길 수 있습니다.


0

이 메시지는를 git-lfs사용하고 실제 파일로 파일 포인터를 덮어 쓴 경우에도 발생할 수 있습니다 .

그런 다음 사용합니다 :

git stash
git lfs migrate import
git pull

내 경우의 전체 출력

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

참조 https://github.com/git-lfs/git-lfs/issues/2839를


0

시도했지만 성공적으로 가져 오기 전에 커밋하지 않은 모든 파일을 커밋하면 AS에서 해당 메시지를받지 못합니다.

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