원격 변경 사항을 버리고 파일을 "해결됨"으로 표시하려면 어떻게해야합니까?


197

로컬 파일이 있는데 원격 지점에서 가져 와서 충돌이 있습니다. 로컬 변경 사항을 유지하고 충돌을 일으키는 원격 변경 사항을 무시하고 싶습니다. 실제로 "모든 충돌을 해결 된 것으로 표시하고 로컬을 사용하십시오"라고 말하는 명령이 있습니까?


1
아래의 답변은 저에게 매우 밝게 나타났습니다. 나를 위해 정말로 명확한 것들을 만들어내는 몇 가지 미묘한 점이 있습니다. 전문가가 아닌 GIT 사용자는 아래 게시물 아래의 모든 의견을 읽어야하며 Brian에게 감사드립니다.
Tom DeMille

답변:


332

git checkout--ours로컬에 있던 파일의 버전을 확인 하는 옵션이 있습니다 (와 반대 --theirs되는 버전). 당신은 통과 할 수 .하는 git checkout트리에있는 모든 체크 아웃을 알 수 있습니다. 그런 다음 충돌을 해결 된 것으로 표시해야합니다.이를 git add통해 작업을 수행 할 수 있습니다.

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

을 참고 .git checkout명령. 그것은 매우 중요하고 놓치기 쉽습니다. git checkout두 가지 모드가 있습니다. 하나는 분기를 전환하고 다른 하나는 색인에서 파일을 작업 사본으로 검사하는 경우도 있습니다 (때로는 먼저 다른 개정판에서 색인으로 가져 오기). 구별하는 방법은 파일 이름을 전달했는지 여부입니다. 파일 이름을 전달하지 않으면 분기를 전환하려고 시도하지만 분기를 전달하지 않으면 현재 분기를 다시 체크 아웃하려고 시도하지만 수정 된 파일이 있으면 거부합니다. 그 영향을 미칠 것입니다. 따라서 기존 파일을 덮어 쓰는 동작을 원하는 경우 .에서 두 번째 동작을 얻으려면 파일 이름 또는 파일 이름 을 전달해야합니다 git checkout.

그것을 상쇄하기 위해, 파일 이름에 전달할 때 그것은 또한 가지고 좋은 습관 --같은 git checkout --ours -- <filename>. 이 작업을 수행하지 않고 파일 이름이 분기 또는 태그의 이름과 일치하면 Git은 파일 이름을 확인하는 대신 해당 버전을 확인하려고하므로 checkout명령 의 첫 번째 형식을 사용한다고 생각합니다. .

Git에서 충돌과 병합이 어떻게 작동 하는지 조금 더 설명하겠습니다 . 다른 사람의 코드를 병합 할 때 (풀 중에도 발생합니다. 풀은 기본적으로 페치와 병합이 뒤 따릅니다) 가능한 상황은 거의 없습니다.

가장 간단한 것은 당신이 같은 개정판에 있다는 것입니다. 이 경우 "이미 최신"상태이며 아무 일도 일어나지 않습니다.

또 다른 가능성은 그 개정판이 단순히 당신의 자손 일 것입니다.이 경우 기본적으로 "빨리 감기 병합" HEAD이 있으며 병합이 이루어지지 않고 커밋으로 업데이트됩니다. --no-ff)를 사용하여 병합을 기록하고 싶습니다 .

그런 다음 실제로 두 개의 수정본을 병합해야하는 상황에 처하게됩니다. 이 경우 두 가지 가능한 결과가 있습니다. 하나는 합병이 깨끗하게 일어난다는 것입니다. 모든 변경 사항이 다른 파일에 있거나 동일한 파일에 있지만 두 변경 내용을 모두 문제없이 적용 할 수있을만큼 충분히 떨어져 있습니다. 당신이이를 비활성화 할 수 있지만 기본적으로 깨끗한 병합이 발생하면, 그것은 자동으로 최선을 다하고 있습니다 --no-commit당신이 기능의 이름을 변경하는 경우는 편집해야하는 경우는 사전에 (예를 들어, foo로를 bar, 그리고 다른 사람이 전화가 새로운 코드를 추가 foo, 그것은 완전히 통합됩니다 그러나 깨진 트리를 생성하므로 커밋이 커지지 않도록 병합 커밋의 일부로 트리를 정리해야 할 수 있습니다.

마지막 가능성은 실제 병합이 있고 충돌이 있다는 것입니다. 이 경우, 힘내만큼 병합이 할 수있는 할 것, 그리고 충돌 마커 (와 생산 파일 <<<<<<<, =======그리고 >>>>>>>당신의 작업 복사본에서). 색인 ( "스테이징 영역"이라고도 함, 파일 git add을 커밋하기 전에 파일이 저장되는 위치 )에는 충돌하는 각 파일의 3 가지 버전이 있습니다. 병합하려는 두 분기의 조상에서 가져온 파일의 원래 버전, HEAD(병합 측) 및 원격 분기의 버전이 있습니다.

충돌을 해결하려면 작업 복사본에있는 파일을 편집하여 충돌 마커를 제거하고 작동하도록 코드를 수정하십시오. 또는, 당신은 하나 또는 병합의 다른 측면, 사용하는 버전을 확인할 수 있습니다 git checkout --ours또는 git checkout --theirs. 파일을 원하는 상태로 설정하면 파일 병합이 완료되었으며을 사용하여 커밋 할 준비가되었음을 git add나타내면와 병합을 커밋 할 수 있습니다 git commit.


7
당신은 아마 그주의해야한다 git add --all이이하지 않는 의도 한 것보다 더 많은 파일을 추가 할 수 있도록 저장소에있는 모든 파일을 추가 .gitignore패턴이 완벽한 상태에있다. git add -u이 상황에 더 적합 할 수 있습니다. 병합을 해결하는 동안 추가하고 싶지 않은 추적 파일을 편집 할 가능성이 적습니다.
CB Bailey

앗 미안 해요. 그게 내 뜻이야 지금 수정했습니다.
Brian Campbell

1
자세한 답변 주셔서 감사합니다. 실제로 git checkout을 시도했지만 오류 메시지가 나타났습니다 (지금은 기억하지 못합니다). 문제의 파일은 dll입니다 (우리는 대부분 제 3 자 참조를 숨기고 몇 가지를 가지고 있습니다). 나는 '좋아요. .....이 기사를 참조로 유지하고 다음에 다시 시작할 때 다시 시도하여 작동하는지 또는 해당 메시지를 게시 할 수 있는지 확인하십시오. 다시 한번 감사드립니다
Tom DeMille

그러나 귀하의 설명은 프로세스에 대해 저를 위해 많은 것을 정리합니다. 다시 감사합니다. 후속 질문 : 병합이 지워지면 git이 .orig 파일을 삭제하는 방법은 무엇입니까?
Tom DeMille

2
해야합니다 git checkout --ours .. 은 .중요하다 파일 이름 (이 경우 전체 디렉토리) checkout을 전달하면 가지를 전환하는 모드 와 색인에서 작업 사본으로 파일을 이동하는 두 가지 작동 모드 중에서 선택합니다 . 동의합니다. 매우 혼란 스럽습니다. git checkout --ours -- <filename>한 번에 개별 파일을 체크 아웃 할 수도 있습니다 .
Brian Campbell

23

충돌 원인을 확인하십시오.이 결과 인 경우 Brian Campbell답변을git merge 참조하십시오 .

그러나의 결과 인 경우 원격 변경 사항 git rebase을 삭제 하고 로컬 변경 사항을 사용하려면 다음을 수행해야합니다.

git checkout --theirs -- .

자세한 내용은 " 의 의미 왜" ours"와" theirs"반전" 방식을 볼 수 " ourstheirs합니다 (때문에 REBASE 중에 교환되는 상류 지점이 체크 아웃됩니다).

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