git fetch로 원격 저장소 변경분 가져오기
git fetch는 원격 저장소(remote repository)의 최신 변경분을 로컬로 가져오되, 현재 작업 중인 코드에는 영향을 주지 않는 명령어입니다.
git pull과 혼동하기 쉬운데, git pull이 가져오기와 합치기를 한번에 하는 반면, git fetch는 가져오기만 하고 합치는 건 개발자에게 맡깁니다.
git fetch vs. git pull
이 둘의 관계를 코드로 표현하면 다음과 같습니다.
# git pull은 사실 이 두 명령어를 합친 것
$ git fetch origin
$ git merge origin/main
# 위와 동일한 효과
$ git pull origin main
git fetch는 원격 저장소의 변경 내용을 origin/main 같은 원격 추적 브랜치(remote-tracking branch)에만 업데이트합니다.
내가 작업하고 있는 main 브랜치에는 아무런 영향을 주지 않는 것이죠.
그래서 “원격에 어떤 변경이 있는지 먼저 확인하고, 그 다음에 합칠지 말지 결정하고 싶다”는 상황에서 git fetch가 유용합니다.
기본 사용법
가장 간단한 사용법은 git fetch만 실행하는 것입니다.
$ git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/example/project
a1b2c3d..e4f5g6h main -> origin/main
기본적으로 현재 설정된 원격 저장소(보통 origin)의 모든 브랜치 정보를 가져옵니다.
특정 원격 저장소를 지정하려면 이름을 넘기면 됩니다.
$ git fetch origin
특정 브랜치만 가져오고 싶다면 브랜치명까지 지정합니다.
$ git fetch origin main
가져온 변경분 확인하기
git fetch의 진짜 장점은 변경 내용을 합치기 전에 미리 살펴볼 수 있다는 것입니다.
fetch를 실행한 뒤에 git log로 원격 브랜치의 새 커밋을 확인할 수 있습니다.
$ git fetch origin
$ git log main..origin/main --oneline
e4f5g6h 사용자 프로필 API 응답 형식 변경
b7c8d9e 로그인 실패 횟수 제한 추가
main..origin/main은 “내 main에는 없고 origin/main에만 있는 커밋”을 의미합니다.
변경 내용을 더 자세히 보고 싶다면 git diff를 사용합니다.
$ git diff main origin/main
이렇게 어떤 변경이 있는지 확인한 뒤에, 문제가 없다고 판단되면 merge합니다.
$ git merge origin/main
모든 원격 저장소에서 가져오기
여러 원격 저장소가 설정되어 있을 때 한 번에 모든 원격 저장소의 변경분을 가져오려면 --all 옵션을 사용합니다.
$ git fetch --all
Fetching origin
Fetching upstream
오픈소스 프로젝트를 fork해서 작업할 때 origin(내 fork)과 upstream(원본 저장소) 모두의 최신 상태를 확인하고 싶을 때 유용합니다.
삭제된 브랜치 정리
원격 저장소에서 이미 삭제된 브랜치가 로컬의 원격 추적 브랜치에 남아 있는 경우가 있습니다.
--prune 옵션을 사용하면 원격에서 삭제된 브랜치의 추적 정보를 로컬에서도 정리할 수 있습니다.
$ git fetch --prune
From https://github.com/example/project
- [deleted] origin/feature/old-feature
-p로 줄여서 쓸 수도 있습니다.
$ git fetch -p
브랜치를 자주 만들고 삭제하는 팀이라면 주기적으로 --prune을 실행하거나, git config로 fetch할 때 항상 prune하도록 설정해두면 편합니다.
$ git config --global fetch.prune true
언제 fetch를 쓸까
git fetch는 다음과 같은 상황에서 특히 유용합니다.
코드 리뷰를 할 때 동료가 올린 브랜치를 로컬에서 확인하고 싶다면, fetch로 가져온 뒤 체크아웃합니다.
$ git fetch origin
$ git switch -c review-pr origin/feature/new-api
main에 합치기 전에 원격의 최신 변경분을 미리 확인하고 싶을 때도 fetch가 적합합니다.
pull처럼 바로 합쳐버리는 게 아니라, 내가 결정권을 갖고 싶을 때 사용하는 것이죠.
CI/CD 파이프라인이나 자동화 스크립트에서도 fetch를 먼저 실행해서 원격 상태를 확인한 뒤에 필요한 작업을 수행하는 패턴을 자주 사용합니다.
마치며
git fetch는 원격 저장소의 변경분을 “안전하게” 가져오는 명령어입니다.
현재 작업 중인 코드에 영향을 주지 않고 원격의 최신 상태를 확인할 수 있다는 점이 git pull과의 가장 큰 차이입니다.
급하게 합칠 필요가 없다면 fetch로 먼저 확인하고, 괜찮다고 판단되면 merge하는 습관을 들이면 실수를 줄일 수 있습니다.
더 자세한 내용은 Git 공식 문서를 참고하세요.
This work is licensed under
CC BY 4.0