현록

Git fetch와 pull 차이

원격 저장소의 변경을 받을 때 git fetchgit pull을 자주 사용한다.
두 명령 모두 원격 데이터를 가져오지만 현재 브랜치를 바꾸는 범위는 다르다.

fetch는 먼저 변경을 받아서 확인하는 명령에 가깝다.
pull은 변경을 받은 뒤 현재 브랜치에 통합하는 단계까지 이어서 수행한다.

fetch가 갱신하는 참조

git fetch는 다른 저장소에서 커밋과 그 이력에 필요한 객체, 브랜치와 태그 같은 ref를 내려받는다.
일반적인 remote 설정에서는 origin/main 같은 remote-tracking branch가 최신 원격 상태로 갱신된다.

git fetch origin
git branch --remotes

origin/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

이 명령은 originmain을 가져오고 현재 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/main

HEAD..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 중 사용할 명령을 명시하는 편이 정확하다.

참고 자료

관련 포스트
HTTP Content-Type과 Accept 차이 thumbnail
HTTP Content-Type과 Accept 차이
HTTP Content-Type과 Accept 헤더의 방향, JSON 요청과 응답 예제, 콘텐츠 협상과 406·415 상태 코드의 차이를 정리합니다.
HTTP PUT과 PATCH 차이 thumbnail
HTTP PUT과 PATCH 차이
HTTP PUT과 PATCH의 차이를 리소스 교체와 변경 명령, 멱등성, JSON Patch와 JSON Merge Patch, ETag를 이용한 동시 수정 방지 기준으로 정리합니다.
HTML label과 input 연결 방법 thumbnail
HTML label과 input 연결 방법
HTML label과 input을 for와 id로 연결하는 방법, 암시적 연결, 폼 그룹과 보조 설명, 접근성 오류 패턴을 정리합니다.
HTML section과 article 차이 thumbnail
HTML section과 article 차이
HTML section과 article의 의미, 독립성 판단 기준, 중첩 구조, 제목과 접근성을 고려한 선택 방법을 정리합니다.
HTML div와 span 차이 thumbnail
HTML div와 span 차이
HTML div와 span의 차이를 기본 display, 담을 수 있는 내용, 시맨틱 태그, CSS와 JavaScript에서 그룹화하는 기준으로 정리합니다.
HTTP 상태 코드 정리 thumbnail
HTTP 상태 코드 정리
HTTP 상태 코드의 2xx, 3xx, 4xx, 5xx 의미와 200, 201, 204, 301, 304, 400, 401, 403, 404, 500, 502, 503 차이를 정리합니다.
HTML id와 class 차이 thumbnail
HTML id와 class 차이
HTML id와 class의 차이를 문서 내 유일성, 여러 값 사용, CSS 선택자, JavaScript 탐색, fragment 링크와 이름 작성 기준으로 정리합니다.
HTML button과 a 태그 차이 thumbnail
HTML button과 a 태그 차이
HTML button과 a 태그의 차이를 이동과 동작의 의미, href, type 속성, 폼 제출, 키보드 접근성, 잘못된 사용 패턴으로 정리합니다.
HTTP GET과 POST 차이 thumbnail
HTTP GET과 POST 차이
HTTP GET과 POST의 차이를 초보자 기준으로 정리합니다. 조회와 변경, query string과 request body, 캐시, safe, idempotent, form과 fetch 사용 기준을 함께 봅니다.
npm outdated와 npm update 차이 thumbnail
npm outdated와 npm update 차이
npm outdated와 npm update의 차이를 초보자 기준으로 정리합니다. Current, Wanted, Latest의 의미와 semver 범위 안에서 업데이트되는 방식, package-lock.json 변화까지 함께 봅니다.
npm install -g와 npx 차이 thumbnail
npm install -g와 npx 차이
npm install -g와 npx의 차이를 초보자 기준으로 정리합니다. 전역 설치, 로컬 설치, 일회성 실행, 프로젝트 scripts에 넣는 기준까지 함께 봅니다.
package.json에서 ^와 ~ 차이 thumbnail
package.json에서 ^와 ~ 차이
package.json 의존성 버전 앞에 붙는 ^와 ~의 차이를 초보자 기준으로 정리합니다. semantic versioning, 버전 범위, 0.x 예외, package-lock.json과의 관계까지 함께 봅니다.
Git merge와 rebase 차이 thumbnail
Git merge와 rebase 차이
Git merge와 rebase가 커밋 그래프를 어떻게 바꾸는지 정리합니다. fast-forward, merge commit, rebase의 커밋 ID 변경, 충돌 처리, 공유 브랜치에서의 안전한 사용 기준까지 살펴봅니다.
npx와 npm exec 차이 thumbnail
npx와 npm exec 차이
npx와 npm exec가 어떤 명령어인지 초보자 기준으로 정리합니다. 로컬 패키지 실행, 원격 패키지 임시 실행, --package 옵션, -- 인자 전달 차이까지 함께 봅니다.
npm scripts와 npm run 정리 thumbnail
npm scripts와 npm run 정리
npm scripts란 무엇인지, package.json scripts와 npm run의 관계를 초보자 기준으로 정리합니다. npm run dev, npm start, npm test, node_modules/.bin, -- 인자 전달 방식까지 함께 봅니다.
dependencies와 devDependencies 차이 thumbnail
dependencies와 devDependencies 차이
package.json의 dependencies와 devDependencies 차이를 초보자 기준으로 정리합니다. npm install과 npm install -D, 배포 환경 설치, package-lock.json과의 관계까지 함께 봅니다.
npm ci와 npm install 차이 thumbnail
npm ci와 npm install 차이
npm ci와 npm install의 차이를 초보자 기준으로 정리합니다. clean install의 의미, package-lock.json 조건, CI에서 npm ci를 쓰는 이유, .npmrc 플래그 주의점까지 함께 봅니다.
.npmrc 파일이란? thumbnail
.npmrc 파일이란?
storybook을 사용해보려고 하다 마주한 이슈의 해결법을 알아보다가 등장한 .npmrc라는 파일에 대해 공부해보았다. .npmrc 파일이란? .npmrc 파일은 npm에 대한 config 파일이다. (npm에 대한 rc 파일) 프로젝트별 registry, install 옵션, 인증 토큰처럼 npm CLI가 읽는 설정을 관리할 때 사용한다.
스토리북이란? thumbnail
스토리북이란?
Storybook은 UI 컴포넌트를 독립적으로 개발하고, 문서화하고, 테스트하기 위한 프론트엔드 워크샵입니다. Storybook 10.4 기준 설치 흐름과 stories, 문서화, 테스트 활용 방식을 정리합니다.
TTV와 TTI 차이 thumbnail
TTV와 TTI 차이
TTV와 TTI의 차이를 초보자 기준으로 정리합니다. 사용자가 화면을 보는 시점, 상호작용 가능한 시점, FCP, LCP, INP, Core Web Vitals와의 관계까지 함께 봅니다.
Maria DB 외부 접속 설정하기 thumbnail
Maria DB 외부 접속 설정하기
안녕하세요. 오늘은 Maria DB 초기 세팅 시, 외부에서 접속이 안될 때 매뉴얼을 작성해보겠습니다. dotenv 패키지를 통해서 환경변수로 관리한다면, 별도의 추가 작업을 할 일이 없으실 겁니다.
package-lock.json 파일의 역할 thumbnail
package-lock.json 파일의 역할
안녕하세요. 오늘은 node 환경의 개발자라면 한번쯤 궁금했을만한 package-lock.json의 역할에 대해 알아보겠습니다. 우리는 node 환경에서 개발을 할 때 다양한 패키지들을 설치하여 활용하곤 합니다. 우리가 설치하는 패키지 또한 다른 npm 패키지를 활용하여 만든 패키지들이고 이들 또한 설치를 하게 됩니다. 이렇게 직간접적으로 설치된 패키지들은 대부분 호환성을 "^1.1.5"와 같이 표현하여, 범위로 지정해두고 있습니다.
Linux 환경 배포 자동화 체험해보기 thumbnail
Linux 환경 배포 자동화 체험해보기
안녕하세요. 요즘 포트폴리오를 만들면서 서버 상에 자주 반영할 일이 생겼는데, 매번 명령어들을 타이핑하는 것이 비효율적이라 생각이 들어 배포 자동화를 생각해보게 되었습니다. 현재 레벨에서는 단순히 명령어들만 단축시켜도 효율적이라 생각이 들어 간단한 쉘 스크립트만 작성하였습니다. 정말 간단하니 여러분도 도전해보시길 바랍니다.
협업 필수품. Prettier thumbnail
협업 필수품. Prettier
안녕하세요. 오늘은 Prettier이라는 도구에 대해 알려드리고자 합니다. 개발자는 각자의 코딩스타일이 존재합니다. 그러다보니 같은 프로젝트에서도 작성하는 소스마다 스타일이 제각기 다르기 일쑤입니다. 그럴 때 도입하면 좋은 것이 Prettier입니다. 프로젝트 root 폴더에 .prettierrc 라는 파일을 생성한 뒤, 위 예시와 같이 원하는 옵션을 JSON 형식으로 작성해주면 됩니다.