"변경 사항을 커밋하거나 병합하기 전에 숨기십시오"라는 git을 어떻게 해결합니까?


762

로컬 컴퓨터에서 일부 업데이트를 수행하여 원격 리포지토리로 푸시 한 후 서버로 변경 내용을 가져 오려고합니다. 메시지가 나타납니다.

오류 : 다음 파일에 대한 로컬 변경 사항을 병합하여 덮어 씁니다.

wp-content / w3tc-config / master.php

변경 사항을 커밋하거나 숨기려면 병합하십시오.

그래서 나는 달렸다

git checkout -- wp-content/w3tc-config/master.php

다시 시도했는데 같은 메시지가 나타납니다. w3tc서버의 구성 파일에서 무언가 가 변경 되었다고 가정 합니다. 로컬 사본 또는 원격 사본이 서버에 있는지 여부는 상관 없으며 (원격이 가장 좋다고 가정) 나머지 변경 사항 (플러그인 업데이트)을 병합 할 수 있기를 원합니다.

어떤 아이디어?



11
자세한 내용과 더 나은 답변이 포함 된보다 명확한 질문입니다. 나는 이것을 유지하는 것이 가치 있다고 생각합니다. 예, 다른 쪽은 기술적으로 먼저 요청되었지만이 쪽을 제거하면 사람들이 원하는 답을 찾기가 더 어려워집니다.
Jo Sprague

답변:


1300

로컬 수정과 병합 할 수 없습니다. 힘내 당신이 잠재적으로 중요한 변화를 잃지 않도록 보호합니다.

세 가지 옵션이 있습니다.

  • 다음을 사용하여 변경 내용 커밋

    git commit -m "My message"
    
  • 그것을 숨겨라.

    스 태싱은 스택으로 작동하여 변경 사항을 푸시하고 역순으로 팝합니다.

    숨기려면 다음을 입력하십시오.

    git stash
    

    병합을 수행 한 다음 숨김을 당기십시오.

    git stash pop
    
  • 로컬 변경 사항을 폐기하십시오.

    사용 git reset --hard
    또는git checkout -t -f remote/branch

    또는 : 특정 파일에 대한 로컬 변경 사항 삭제

    사용 git checkout filename


104
git checkout filename
ckb

6
감사. 내가 추가하면 git reset --hard추적 할 수없는 파일을 삭제하고 싶을 수도 있습니다git clean -dfx
Jo Sprague

13
기본적으로 git stash히스토리가없는 파일은 숨겨지지 않습니다. 따라서 아직 추가하지 않았지만 병합으로 덮어 쓰거나 "만들어진"파일이 있으면 병합이 여전히 차단됩니다. 이 경우 git stash -u커밋되지 않은 파일을 숨길 수도 있습니다 . 아니면 그냥 삭제할 수 있습니다!
joeytwiddle

25
달리기 git clean -dfx는 끔찍한 생각이었습니다. 실제로 필요한 일부 .gitignored 파일을 제거했습니다.
ezuk

5
을 (를) 수행 한 후에도 git reset --hard여전히 병합되지 않은 변경 사항이 있는 상황이 발생했습니다 !
Amedee Van Gasse

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

첫 번째 명령은 변경 사항을 숨김에 임시로 저장 하고 작업 디렉토리에서 변경 사항을 제거합니다.

두 번째 명령은 분기를 전환합니다.

세 번째 명령은 숨김에 저장 한 변경 사항을 복원합니다 ( --index옵션은 준비된 파일이 여전히 준비되도록하는 데 유용합니다).


1
stackoverflow.com/questions/15286075/… , 유용 할 수 있습니다
vikramvi

2
@vikramvi의 요점을 설명하기 위해 : git stash pop대신 사용할 수도 있습니다 git stash apply. 전자는 그것을 숨겨두고 후자는 여전히 그것을 유지합니다
Anupam

27

다음 방법 중 하나를 시도 할 수 있습니다.

리베이스

간단한 변경을 위해 변경 사항을 가져 오는 동안 그 위에 rebase를 시도하십시오.

git pull origin master -r

따라서 가져 오기 후 현재 분기를 업스트림 분기 위에 적용합니다.

이는 checkout master, fetchrebase origin/mastergit 명령 과 같습니다 .

이것은 잠재적으로 위험한 작동 모드입니다. 기록을 다시 작성하므로 기록을 이미 게시했을 때 제대로 표시되지 않습니다. git-rebase(1)주의 깊게 읽지 않으면이 옵션을 사용하지 마십시오 .


점검

로컬 변경 사항에 신경 쓰지 않으면 임시로 다른 분기로 전환하고 (강제로) 다시 전환 할 수 있습니다 (예 :

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

초기화

로컬 변경 사항에 신경 쓰지 않으면 HEAD (원래 상태)로 재설정하십시오.

git reset HEAD --hard

위의 방법으로 도움이되지 않으면 git 정규화 파일 ( .gitattributes)의 규칙 일 수 있으므로 말한 내용을 커밋하는 것이 좋습니다. 또는 파일 시스템이 권한을 지원하지 않으므로 filemodegit config에서 비활성화 해야합니다.

관련 : "git pull"을 사용하여 로컬 파일을 덮어 쓰려면 어떻게합니까?


1
작동하지 않습니다. "변경 사항을 먼저 저장하십시오"와 같은 메시지가 계속 표시됩니다. "git stash"를 입력 한 다음 "git pull"-> "오류 : 저장되지 않은 변경 사항이 있습니다. 먼저 숨김을 수행하십시오". 내 컴퓨터를 파괴하기 직전
trinity420

@ trinity420 파일 권한이 될 수 있으므로 git status숨김 후 어떤 변경 사항이 있는지 확인하십시오 . 답변이 없으면 새 질문 추가를 고려하십시오.
kenorb

.. 당신이지만 내 문제 감사는 아무것도, 다음 PHPStorm에서 "병합"후 I unstashed 변경 "변경 내용을 커밋"을 클릭하지 일했다, 여기에 모든 노력을, 해결하며 일
trinity420


13

그래서 내가 겪은 상황은 다음과 같습니다.

error : 다음 파일에 대한 로컬 변경 사항은 병합으로 덮어 쓰게됩니다. wp-content / w3tc-config / master.php 변경 사항을 커밋하거나 병합하려면 병합하십시오.

그 직전을 제외하고는 원격이었습니다.

remote : error : 다음 파일에 대한 로컬 변경 사항을 merge로 덮어 씁니다. some / file.ext 병합하기 전에 변경 사항을 커밋하거나 숨기십시오.

무슨 일이 있었는지 (100 % 긍정적이지 않다고 생각합니다) git post receive hook이 시작되고 원격 서버 저장소의 이동 변경으로 인해 망가졌습니다.

그래서 수신 후 후크를 통해 추적하고 이것을 찾아서 결국 서버에서 원격 저장소로 이동해야했고 변경 사항이있었습니다 (사실 로컬 저장소에는 없었습니다. 로컬에있는 동안 서버에 변경이 없었지만 git checkout -- some/file.ext로컬 및 원격 리포지토리가 실제로 일치하여 일치 할 수있었습니다. 계속 작동하고 배포하십시오. 이 상황이 어떻게 발생했는지는 확실하지 않지만, 수십 명의 개발자와 IT 변경은 ​​그와 관련이있을 수 있습니다.


2
질문입니까, 대답입니까?
stdcall

2
@stdcall-둘 다. 질문에 설명 된 대로이 상황에 처했을 때 이것이 문제를 해결하기 위해해야했던 일입니다. 그것은 정상적인 git 해결이 아니 었습니다. 질문에서 그것은 동일한 비정상 상황 (예 : 서버의 구성 변경이지만 로컬에는 변경 사항이 없음) 인 것처럼 보입니다. 누군가 왜 이런 일이 일어 났는지에 대해 더 많은 아이디어를 가지고 있다면 통찰력을 환영합니다.
Mike

7

경고 : 이렇게하면 추적되지 않은 파일이 삭제되므로이 질문에 대한 답이 아닙니다.

제 경우에는 파일을 보관하고 싶지 않아서 저에게 효과적이었습니다.

힘내 2.11 이상 :

git clean  -d  -fx .

더 오래된 힘내 :

git clean  -d  -fx ""

참조 : http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x는 무시할 파일과 git에 알려지지 않은 파일도 제거됨을 의미합니다.

  • -d는 추적되지 않은 파일 외에 추적되지 않은 디렉토리를 제거함을 의미합니다.

  • 강제로 실행하려면 -f가 필요합니다.


4

이 문제를 해결하면서 새로 만든 파일을 기록하려면 :

새로 만든 파일 이있는 경우 로컬 변경 패치를 만들고 원격 병합을 가져 와서 아래에 단계별로 정의 된대로 원격 병합이 완료된 후 로컬 패치를 적용 할 수 있습니다.

  1. 로컬 변경 사항을 준비하십시오. (커밋하지 마십시오). 새로 작성된 파일의 패치를 작성하려면 스테이징이 필요합니다 (아직 추적되지 않음).

git add .

  1. 기록을 유지하기 위해 패치 만들기

git diff --cached > mypatch.patch

  1. 로컬 변경 사항 삭제 및 새 로컬 파일 삭제

git reset --hard

  1. 풀 변경

git pull

  1. 패치 적용

git apply mypatch.patch

Git은 변경 사항을 병합하고 병합되지 않은 변경 사항에 대한 .rej 파일을 만듭니다.

패치를 적용하는 데 문제가있는 경우 Anu에서 제안한대로 다음을 시도하십시오.

git apply --reject --whitespace=fix mypatch.patch 이 답변 git : patch 이 문제에 대해 자세히 이야기 하지 않습니다

기능에 대한 지속적인 작업을 즐기고 완료되면 로컬 변경 사항을 커밋하십시오.


코드의 일부를 새로운 변경 사항으로 푸시하고 싶었습니다. 1. 로컬 개발 지점에서 패치를 만들었습니다. 2. 하드 재설정을 수행했습니다. 3. 마스터에서 dev로 새로운 변경 사항을 가져옵니다 (병합 충돌을 피하기 위해) 4 . 내 로컬 개발자 5.에서 약간의 변경을 수행했습니다. 5. 원격 dev로 푸시 6. 적용된 패치 다시-> 오류가 발생했습니다 : error: patch failed: yourfile.py:33 error: yourfile.py: patch does not apply, 여전히 mypatch.patch가 있지만 왜 적용되지 않고 변경 사항을 잃었는지 모르겠습니다. !
Anu

나는 그것을 얻었고, 올바른 명령은이었다 git apply --reject --whitespace=fix mypatch.patch. [감사합니다] ( stackoverflow.com/a/15375869/6484358 )
Anu

1
Anu, git apply mypatch.patch 명령은 패치를 적용하는 것이 정확합니다. 이것은 내가 항상 사용하는 것입니다. 생성 된 패치 자체에 약간의 문제가있을 수 있습니다. 패치가 있으면 변경 사항을 잃지 않을 것입니다. 모든 통합 된 변경 사항이 포함되어 있습니다.
Manpreet

2

끌어 오기 전에 커밋 요청

  • 자식 숨김
  • 자식 풀 원점 << branchname >>

필요한 경우 :

  • 자식 숨김 적용

1
작업 디렉토리 및 색인의 현재 상태를 기록하지만 깨끗한 작업 디렉토리로 돌아가려면 git stash를 사용하십시오. 이 명령은 로컬 수정 사항을 저장하고 HEAD 커밋과 일치하도록 작업 디렉토리를 되돌립니다.
Pushpak Sharma

2

나에게만 git reset --hard효과가있었습니다.

커밋하는 것은 아무것도 없었기 때문에 커밋은 옵션이 아닙니다.

숨기는 것이 없기 때문에 스 태싱은 옵션이 아니 었습니다.

그것은 같은 외모에서 제외 된 파일에서 수 있었다 .git/info/exclude및 한 git update-index --assume-unchanged <file>'일부 파일을 에드.


0

내 경우에는 백업 한 다음 Git이 불평하는 파일을 삭제하고 커밋 한 다음 다른 지점을 마침내 확인할 수있었습니다.

그런 다음 파일을 교체하고 내용을 다시 복사하고 아무 일도 일어나지 않은 것처럼 계속했습니다.



0

첫 번째 답변을 시도했지만 git stash가장 높은 점수를 받았지만 오류 메시지가 계속 나타납니다.이 문서는 숨김 'Reluctant Commit' 대신 변경 사항을 커밋하는 것으로 나타났습니다.

오류 메시지가 마침내 사라졌습니다.

1: git add .

2 : git commit -m "this is an additional commit"

삼: git checkout the-other-file-name

그런 다음 작동했습니다. 이 답변이 도움이 되길 바랍니다. :)


0

Git Extensions 를 사용하는 경우 Working directory아래와 같이 로컬 변경 사항을 찾을 수 있습니다.

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

변경 사항이 표시되지 않으면 잘못된 하위 모듈에 있기 때문일 수 있습니다. 아래 그림과 같이 잠수함 아이콘으로 모든 항목을 확인하십시오.

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

커밋되지 않은 변경 사항을 발견 한 경우 :

로 줄을 선택하고 Diff 탭으로 Working directory이동 한 다음 연필 ( 또는 ) 아이콘 이있는 행을 마우스 오른쪽 버튼으로 클릭 하고 Reset (재설정)을 선택 하여 먼저 커밋 , 커밋 또는 숨김 또는 원하는 작업을 수행하십시오.+-


0

나를 위해 이것은 효과가 있었다 :

git reset --hard

그리고

git pull origin <*current branch>

그 후

git checkout <*branch>


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