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

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



답변

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.


답변

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

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

git checkout --theirs -- .

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


답변