Git fetch와 pull 차이
원격 저장소의 변경을 받을 때 git fetch와 git pull을 자주 사용한다.
두 명령 모두 원격 데이터를 가져오지만 현재 브랜치를 바꾸는 범위는 다르다.
fetch는 먼저 변경을 받아서 확인하는 명령에 가깝다.
pull은 변경을 받은 뒤 현재 브랜치에 통합하는 단계까지 이어서 수행한다.
fetch가 갱신하는 참조
git fetch는 다른 저장소에서 커밋과 그 이력에 필요한 객체, 브랜치와 태그 같은 ref를 내려받는다.
일반적인 remote 설정에서는 origin/main 같은 remote-tracking branch가 최신 원격 상태로 갱신된다.
git fetch origin
git branch --remotesorigin/main은 원격 서버의 브랜치를 실시간으로 가리키는 값이 아니다.
마지막 fetch에서 확인한 origin 저장소의 main 위치를 로컬에 기록한 참조다.
기본 fetch는 현재 로컬 브랜치와 working tree를 통합하지 않는다.
그래서 작업 중인 파일을 유지한 채 원격 변경을 먼저 내려받아 비교할 수 있다.
이 설명은 일반적인 remote refspec을 기준으로 한다.
명시적인 refspec을 사용하면 fetch로 다른 로컬 ref를 갱신할 수도 있으므로 “fetch는 어떤 로컬 참조도 바꾸지 않는다”라고 이해하면 안 된다.
pull의 두 단계
git pull은 먼저 fetch를 실행한 뒤 선택한 원격 브랜치를 현재 브랜치에 통합한다.
통합 방식은 fast-forward, rebase, merge, squash 중 명령 옵션과 설정에 맞는 방식을 사용한다.
git switch main
git pull --ff-only origin main이 명령은 origin의 main을 가져오고 현재 main과 원격 main의 이력이 갈라지지 않았을 때만 fast-forward한다.
로컬 커밋과 원격 커밋이 서로 갈라졌다면 실패하므로 이력을 확인한 뒤 통합 방식을 선택할 수 있다.
브랜치 이름을 명시해도 통합 대상은 항상 현재 브랜치다.
예를 들어 feature 브랜치에서 git pull origin main을 실행하면 원격 main을 로컬 main이 아니라 현재 feature에 통합한다.
인자 없이 pull을 실행하면 현재 브랜치에 설정된 upstream이 기본 대상이 된다.
upstream은 .git/config의 remote와 merge 설정으로 연결되며 clone이나 git push --set-upstream 과정에서 설정되는 경우가 많다.
확인 후 통합하는 흐름
원격 변경을 검토한 뒤 반영하고 싶다면 fetch와 통합 명령을 나누는 편이 명확하다.
git fetch origin
git log --oneline HEAD..origin/main
git diff HEAD..origin/main
git merge --ff-only origin/mainHEAD..origin/main 로그는 현재 브랜치에는 없고 원격 추적 브랜치에만 있는 커밋을 보여준다.
diff로 실제 변경을 확인한 뒤 fast-forward가 가능할 때만 현재 브랜치를 옮긴다.
원격에서 삭제한 브랜치의 추적 참조까지 정리하려면 git fetch --prune origin처럼 prune을 함께 사용할 수 있다.
prune은 remote-tracking ref를 refspec 기준으로 정리한다.
태그까지 명시적으로 fetch하는 설정에서는 예상보다 넓게 정리될 수 있으므로 refspec을 먼저 확인해야 한다.
통합 방식과 충돌 처리
pull을 사용할 때는 원하는 통합 방식을 옵션으로 드러내는 편이 안전하다.
git pull --ff-only
git pull --rebase
git pull --no-rebase--ff-only는 분기된 로컬 이력이 없을 때만 브랜치 포인터를 앞으로 옮긴다.--rebase는 로컬 커밋을 가져온 원격 이력 위에 다시 적용한다.--no-rebase는 merge를 사용하며 필요한 경우 merge commit을 만든다.
rebase는 로컬 커밋 ID를 새로 만들 수 있으므로 이미 공유한 커밋에는 신중하게 사용해야 한다.
두 방식의 커밋 그래프 차이는 Git merge와 rebase 차이에서 자세히 정리했다.
통합 중 충돌을 지금 해결하지 않으려면 선택한 방식에 따라 git merge --abort 또는 git rebase --abort를 사용한다.
선택 기준과 버전 차이
원격 상태를 확인만 하거나 변경을 검토한 뒤 합치려면 fetch를 사용한다.
현재 브랜치를 정해진 정책으로 바로 최신화하려면 pull과 명시적인 통합 옵션을 사용한다.
2026년 8월 현재 git-scm.com의 최신 git-pull 문서인 2.55.0 버전은 별도 통합 방식을 지정하지 않았을 때 --ff-only를 기본으로 설명한다.
이전 Git 버전 중에는 fetch 뒤 merge를 기본으로 사용하거나 분기된 이력에서 통합 방식 선택을 요구하는 버전도 있고, pull.rebase, pull.ff, 브랜치별 설정도 결과에 영향을 준다.
팀 문서에는 “pull은 항상 fetch와 merge”라고 적기보다 지원하는 Git 버전과 --ff-only, --rebase, --no-rebase 중 사용할 명령을 명시하는 편이 정확하다.
참고 자료























