Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

Git 오류 해결 가이드: '다음 추적되지 않은 작업 트리 파일이 병합에 의해 덮어쓰여집니다'

Git 작업 중 "error: The following untracked working tree files would be overwritten by merge"(오류: 다음 추적되지 않은 작업 트리 파일이 병합에 의해 덮어쓰여집니다)이라는 메시지를 마주한 적이 있으신가요? 이 오류는 대부분 원격 저장소를 제대로 클론(clone)하지 않은 상태에서 git pull을 실행할 때 발생합니다.

프로젝트 자체는 동일해 보일 수 있습니다. 하지만 로컬에서 직접 만들거나 복사해 온 프로젝트와 GitHub 저장소의 버전은 서로 연결되어 있지 않기 때문에, 원격 저장소에 새로운 파일이나 기능이 추가되어 있어도 로컬 브랜치가 이를 추적하지 못해 충돌이 일어납니다.

다행히 이 문제를 해결하는 방법은 여러 가지가 있습니다. 상황에 맞는 해결책을 하나씩 살펴보겠습니다.

1. 로컬 브랜치가 원격 브랜치를 추적하도록 설정하기

가장 먼저 시도해볼 방법은 로컬 브랜치가 원격 브랜치를 추적(tracking)하도록 지정하는 것입니다. 아래 명령어를 사용하세요.

git branch --track <branch-name> origin/<branch-name>

이렇게 하면 로컬 브랜치와 원격 브랜치가 서로 연결되어 이후 pull 작업이 정상적으로 수행됩니다. 명령 실행 후 git status를 입력하면 두 저장소 간의 차이를 확인할 수 있습니다.

2. 스테이징(Staging)과 스태시(Stash) 활용하기

버전 관리에의해 로컬 파일이 덮어쓰이는 것을 방지하면서 pull을 하고 싶다면, 변경 사항을 스테이징한 뒤 스태시로 임시 저장하는 방법을 사용할 수 있습니다.

git add -A
git stash
git pull

git add -A란?

git add -A는 모든 변경 사항을 스테이징 영역에 추가합니다. 일반적인 git add처럼 작업 트리 전체를 확인하여 수정되었거나 새로 생성된 파일, 그리고 무시(ignore)되지 않은 모든 경로를 스테이징합니다. 또한 git add -u처럼 이미 추적 중인 파일도 함께 살펴보아, 삭제되었거나 내용이 달라진 파일의 변경 사항까지 스테이징합니다.

git stash란?

git stash는 커밋되지 않은 변경 사항(스테이징된 것과 그렇지 않은 것 모두 포함)을 임시 공간에 저장해 두고, 작업 디렉터리를 깨끗한 상태로 되돌립니다. 이렇게 하면 충돌 없이 자유롭게 새 파일을 pull할 수 있고, 나중에 필요할 때 stash에 보관해 둔 변경 사항을 다시 불러올 수도 있습니다.

3. 페치(Fetch)와 리셋(Reset)으로 초기화하기

앞선 두 가지 방법으로도 해결되지 않는다면 fetch와 reset을 조합해볼 수 있습니다. 단, 이 방법은 --hard 옵션을 사용하기 때문에 주의가 필요합니다. --hard는 커밋되지 않은 모든 변경 사항을 영구적으로 삭제하는 위험한 명령어입니다.

따라서 아래 명령어를 실행하기 전에 반드시 git status를 먼저 입력하여 출력 결과가 비어 있는지, 즉 커밋되지 않은 변경 사항이 없는지 확인하세요.

git fetch --all
git reset --hard origin/<branch-name>

git fetch --all은 모든 원격 브랜치의 최신 정보를 가져옵니다. fetch는 원격 브랜치의 로컬 복사본만 업데이트할 뿐, 원격 브랜치를 추적 중인 로컬 브랜치까지 갱신하지는 않습니다. 로컬 브랜치까지 모두 업데이트하려면 git pull --all을 사용해야 합니다.

git reset --hard origin/<branch-name>은 쉽게 말해 "내 로컬 브랜치의 모든 내용을 버리고, 원격 브랜치와 완전히 동일하게 맞춰라"라는 의미입니다. 스테이징 여부와 관계없이 모든 변경 사항이 삭제되므로 반드시 신중하게 사용해야 합니다.

마무리

"다음 추적되지 않은 작업 트리 파일이 병합에 의해 덮어쓰여집니다" 오류는 로컬 브랜치에 있는 상태에서 원격 브랜치를 pull하려고 할 때 발생합니다. 프로젝트가 동일해 보여도, 로컬 브랜치가 원격 브랜치를 추적하고 있어야 pull이 성공적으로 완료됩니다.

이 오류는 개발자가 저장소를 클론하는 것을 잊었을 때 특히 자주 발생합니다. 해결 방법은 브랜치 추적 설정, 스테이징 후 스태시, 그리고 fetch 후 reset의 순서로 시도하는 것이 좋으며, 특히 --hard 옵션이 포함된 reset은 데이터 손실 위험이 있으므로 앞선 두 가지 방법으로 해결되지 않을 때만 사용하는 것이 안전합니다.