Computer >> 컴퓨터 >  >> 문제 해결 >> Linux

Git 오류 해결 방법: '다음 파일에 대한 로컬 변경 사항이 병합으로 덮어써집니다'

Git 버전 관리 시스템에서 "Your local changes to the following files will be overwritten by merge"(다음 파일에 대한 로컬 변경 사항이 병합으로 인해 덮어써집니다)라는 오류 메시지가 나타나는 경우가 있습니다. 이 오류는 원격 저장소에서도 수정된 파일을 로컬에서 함께 수정한 상태로 병합을 시도할 때 발생합니다.

Git 오류 해결 방법:  다음 파일에 대한 로컬 변경 사항이 병합으로 덮어써집니다

원격 저장소에도 변경 사항이 있는 커밋되지 않은 파일이 없다면 이 오류 메시지를 피할 수 있습니다. 이 메시지가 표시될 때는 다른 팀원들에게 의견을 물어보는 것이 가장 좋습니다. 로컬 변경 사항을 병합할지, 저장소의 버전을 유지할지와 관계없이 모든 팀원이 상황을 공유하는 것이 바람직합니다.

저장소란 무엇인가? Git의 Push와 Pull이란?

저장소(repository)는 GitHub 버전 관리 메커니즘을 통해 팀원들이 지속적으로 수정하고 가져오는 코드 저장 공간입니다. 'Pull(풀)'은 원격 저장소의 최신 버전을 로컬 저장소나 PyCharm 같은 IDE(통합 개발 환경)로 가져오는 것을 의미합니다.

Pull 이후에는 코드를 수정하거나 새로운 기능을 추가합니다. 작업이 끝나면 'Push(푸시)' 명령으로 코드를 저장소에 올려 변경 사항을 저장하고 추가 내용을 반영합니다. 그러면 다른 사람들도 해당 코드에 접근할 수 있게 됩니다.

GitHub 버전 관리를 처음 접한다면 기본 개념부터 먼저 익히는 것을 권장합니다. 이 글에서는 독자가 이미 기본 지식을 갖추고 있다고 가정하고 설명하겠습니다.

'로컬 변경 사항이 병합으로 덮어써집니다' 오류 해결 방법

이 오류의 해결 방법은 사용자가 무엇을 원하는지에 따라 달라집니다. 로컬 변경 사항을 버리고 저장소의 코드를 가져올 수도 있고, 로컬 변경 사항을 stash에 임시 저장한 후 저장소 버전을 Pull할 수도 있습니다. 모든 것은 사용자의 선택에 달려 있습니다.

따라서 진행하기 전에 팀원들과 충분히 상의하여 모두가 같은 페이지에 서 있는지 확인하는 것이 좋습니다. 잘못 커밋하거나 잘못된 버전을 푸시하면 팀 전체에 영향을 미칠 수 있습니다.

방법 1: 강제 Pull로 로컬 변경 사항 덮어쓰기

로컬에서 진행한 변경 사항이 중요하지 않고 저장소의 코드를 그대로 가져오고 싶다면 강제로 Pull할 수 있습니다. 이렇게 하면 컴퓨터의 모든 로컬 변경 사항이 덮어써지고 저장소 버전과 동일한 코드가 나타납니다.

IDE에서 다음 명령어를 실행하세요:

git reset --hard

git pull

이 명령은 로컬 변경 사항을 즉시 삭제하므로, 자신이 무엇을 하는지 정확히 알고 있고 로컬 변경 사항이 더 이상 필요 없다는 것을 확실히 해야 합니다.

방법 2: 양쪽 변경 사항 모두 유지하기 (로컬 + 저장소)

로컬 변경 사항과 저장소의 변경 사항을 모두 유지하고 싶다면 변경 사항을 add하고 commit하면 됩니다. Pull 시 당연히 병합 충돌(merge conflict)이 발생하는데, 이때 IDE의 도구(Difftool, mergetool 등)를 사용해 두 코드를 비교하고 어떤 변경 사항을 유지하고 어떤 것을 제거할지 결정할 수 있습니다. 이것이 중간 지점으로, 직접 제거하기 전까지는 어떤 변경 사항도 손실되지 않습니다.

git add $the_file_under_error

git commit

git pull

병합 충돌이 발생하면 충돌 해결 도구를 열고 한 줄씩 확인하세요.

방법 3: 양쪽 변경 사항을 유지하되 커밋하지 않기

디버깅 중인 일부 불완전한 코드가 있어 아직 커밋할 준비가 되지 않은 경우가 종종 있습니다. 이때는 변경 사항을 stash에 안전하게 임시 저장한 후, 저장소 버전을 Pull하고, 다시 stash를 복원하면 됩니다.

git stash save --keep-index

또는

git stash
git pull

git stash pop

stash를 pop한 후 충돌이 발생하면 평소처럼 해결하면 됩니다. 또한 충돌로 인해 stash된 코드를 잃고 싶지 않다면 pop 대신 다음 명령을 사용할 수 있습니다:

git stash apply

병합이 적합하지 않다고 판단되면 rebase를 고려해 보세요. Rebase는 일련의 커밋을 새로운 베이스 커밋으로 옮기거나 합치는 과정입니다. Rebase를 사용할 경우 명령어를 다음과 같이 변경합니다:

git stash

git pull --rebase origin master

git stash pop

방법 4: 코드의 '특정' 부분만 변경하기

모든 것을 교체하지 않고 코드의 특정 부분만 변경하고 싶다면, 덮어쓰고 싶지 않은 부분을 먼저 commit한 후 방법 3을 따르면 됩니다. 저장소 버전으로 되돌리고 싶은 파일에는 다음 명령어를 사용하세요:

git checkout path/to/file/to/revert

또는

git checkout HEAD^ path/to/file/to/revert

또한 다음 명령으로 해당 파일이 스테이징되지 않았는지 확인해야 합니다:

git reset HEAD path/to/file/to/revert

그런 다음 pull 명령을 실행합니다:

git pull

그러면 저장소에서 해당 버전을 가져오려고 시도합니다.