Git은 병합(merge) 작업으로 인해 커밋하지 않았거나 추적되지 않은(untracked) 변경사항이 덮어써질 위험이 있을 때, 원격 저장소의 파일을 로컬 환경으로 가져오는 것을 차단합니다. 이런 경우에는 강제 풀(force pull) 방식을 사용하면 원하는 변경사항을 로컬 컴퓨터로 강제로 받아올 수 있습니다.
이 가이드에서는 예시를 바탕으로 Git 저장소의 내용을 강제로 가져오는 방법을 살펴봅니다. git pull과 fetch 명령어의 차이점, 그리고 reset 옵션을 활용해 강제로 pull을 실행하는 방법까지 함께 알아보겠습니다.
Pull(풀)이란 무엇일까요?
Git의 pull 작업은 원격 저장소에서 모든 메타데이터와 파일을 다운로드한 뒤, 그 데이터를 기반으로 로컬 저장소를 업데이트하는 과정입니다.
풀(Pull)은 로컬 파일을 원격 저장소의 최신 버전과 일치시키는 데 사용되는 방법입니다. 다른 사람이 원격 저장소에 반영한 변경사항을 내려받고 싶다면 반드시 풀 작업을 수행해야 하며, 이 작업은 자동으로 실행되지 않습니다.
단, 풀 과정에서 덮어쓰여질 추적되지 않은 파일이 있다면 pull은 실행되지 않습니다. 즉, 로컬 브랜치에 아직 Git에 추가되지 않은 파일이 존재하고, pull이 진행될 경우 해당 파일이 대체될 가능성이 있는 상황을 말합니다.
마찬가지로, 로컬에 커밋하지 않은 변경사항이 있어 pull 작업 시 덮어써지게 된다면 역시 pull을 진행할 수 없습니다.
Git 강제 Pull 하는 방법
예시로 웹 프로젝트 코드가 담긴 ck-git이라는 저장소를 사용한다고 가정해 보겠습니다. 협업자가 README.md 파일을 방금 수정했고, 우리도 같은 파일을 로컬에서 수정한 상태지만 아직 변경사항을 저장소에 push하지 않았습니다.
이 상태에서 pull을 시도하면 어떻게 되는지 확인해 보겠습니다:
git pull
그러면 다음과 같은 오류 메시지가 출력됩니다:
error: Your local changes to the following files would be overwritten by merge: README.md
Please, commit your changes or stash them before you can merge.
이때 선택할 수 있는 방법은 세 가지입니다. 변경사항을 커밋하거나, stash로 임시 저장하거나, 아니면 Git에게 강제로 pull을 실행하도록 지시하는 것입니다. 마지막 방법을 선택하면 기존 파일들이 덮어써지게 됩니다.
강제 pull은 원격 저장소의 모든 변경사항을 먼저 fetch한 후, 저장소를 해당 상태로 리셋(reset)하는 방식으로 수행할 수 있습니다. 먼저 git fetch 명령어로 변경사항을 가져와 보겠습니다:
git fetch --all
이 명령어는 원격 저장소에 적용된 모든 변경사항의 메타데이터를 가져옵니다. 다음으로, 현재 작업 중인 브랜치를 백업합니다. 코드가 덮어써진 이후에도 작업 내용을 잃지 않도록 하기 위함입니다.
브랜치 백업은 git branch 명령어로 간단히 할 수 있습니다:
git branch backup
이 명령어는 "backup"이라는 새 브랜치를 생성합니다. 백업 브랜치가 준비되었으니, 이제 저장소를 원격 저장소의 내용으로 리셋할 수 있습니다.
git reset 명령어를 사용해 저장소를 업데이트해 보겠습니다:
git reset --hard origin/master
--hard 옵션은 원격 저장소의 모든 파일을 다운로드하여 로컬 작업 사본에 적용합니다. 이 과정에서 로컬에서 작업한 변경사항은 모두 덮어써진다는 점에 유의하세요.
origin/master는 가져오려는 브랜치를 의미합니다. 즉, "origin"이라는 이름의 원격 저장소에서 "master" 브랜치의 내용을 내려받는 것입니다.
만약 다른 브랜치나 원격 저장소 이름을 사용하고 있다면, 아래 형식을 참고해 reset 명령어를 활용하세요:
git reset --hard <remote>/<branch>
git reset 명령어는 저장소를 fetch로 가져온 가장 최신 커밋 상태로 되돌립니다.
커밋하지 않은 변경사항 저장하기
커밋하지 않은 변경사항은 git stash 명령어로 임시 저장할 수 있습니다. 이 명령어를 사용하면 작업 중인 코드를 나중에 꺼내 쓸 수 있도록 "stash(임시 보관)"해 둘 수 있습니다. 코드를 stash에 담아 보겠습니다:
git stash
저장소에 가한 모든 변경사항이 stash에 안전하게 저장됩니다. 나중에 해당 작업을 이어서 진행하고 싶다면 stash를 "pop"하면 됩니다:
git stash pop
git stash 활용법에 대해 더 자세히 알고 싶다면 관련 튜토리얼 문서를 참고하세요.
결론
Git 저장소는 원격 저장소의 내용을 강제로 pull할 수 있습니다. 이를 위해서는 먼저 저장소의 내용을 fetch한 뒤, 원격 저장소의 특정 브랜치 상태로 로컬 변경사항을 리셋하면 됩니다.
이제 여러분도 전문가처럼 Git pull 작업을 강제로 수행할 준비가 되었습니다!