git pull과 fetch

한 줄 요약

원격 저장소의 변경사항을 로컬로 가져오기

선행 지식

pull vs fetch

git fetchgit pull
다운로드만다운로드 + 병합
로컬 브랜치 변경 안 함로컬 브랜치에 병합
안전함충돌 가능
검토 후 병합 가능바로 병합
git pull = git fetch + git merge

기본 사용법

# fetch: 다운로드만
git fetch origin
 
# pull: 다운로드 + 병합
git pull origin main

주요 옵션

git fetch

옵션설명예시
(없음)기본 Remote fetchgit fetch
<remote>특정 Remotegit fetch origin
--all모든 Remotegit fetch --all
--prune삭제된 브랜치 정리git fetch --prune

git pull

옵션설명예시
(없음)기본 pullgit pull
--rebasemerge 대신 rebasegit pull --rebase
--ff-onlyfast-forward만 허용git pull --ff-only

시각적 이해

fetch

Before fetch:
┌─ Remote ────────────────────────┐
│ main: [c1]──▶[c2]──▶[c3]──▶[c4] │
└─────────────────────────────────┘

┌─ Local ─────────────────────────┐
│ origin/main: [c1]──▶[c2]        │ ← 예전 상태
│ main:        [c1]──▶[c2]        │
└─────────────────────────────────┘

After fetch:
┌─ Local ─────────────────────────┐
│ origin/main: [c1]──▶[c2]──▶[c3]──▶[c4]  │ ← 업데이트됨
│ main:        [c1]──▶[c2]                │ ← 그대로
└─────────────────────────────────────────┘

fetch 후 origin/main만 업데이트됩니다. 로컬 main은 그대로!

pull (fetch + merge)

After pull:
┌─ Local ─────────────────────────────────┐
│ origin/main: [c1]──▶[c2]──▶[c3]──▶[c4]  │
│ main:        [c1]──▶[c2]──▶[c3]──▶[c4]  │ ← 병합됨
└─────────────────────────────────────────┘

실제 예제

fetch 후 검토하고 merge

# 1. 원격 변경사항 가져오기
git fetch origin
 
# 2. 어떤 변경이 있는지 확인
git log main..origin/main --oneline
# a1b2c3d feat: 새 기능
# 9x8y7z6 fix: 버그 수정
 
# 3. 변경 내용 확인
git diff main origin/main
 
# 4. 확인 후 병합
git merge origin/main

바로 pull

# 한 번에 가져오고 병합
git pull origin main

모든 Remote fetch

git fetch --all

삭제된 원격 브랜치 정리

# 원격에서 삭제된 브랜치 참조 제거
git fetch --prune
# 또는
git remote prune origin

pull 시 충돌

원격과 로컬에서 같은 파일을 수정했다면:

$ git pull origin main
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.

충돌 해결하기 참고

pull 전략

1. 기본 (merge)

git pull origin main

merge commit이 생성될 수 있습니다.

2. Rebase

git pull --rebase origin main

로컬 커밋을 원격 커밋 위로 재배치합니다.

Before:
Remote: [c1]──▶[c2]──▶[c3]
Local:  [c1]──▶[c2]──▶[L1]

After (--rebase):
Local:  [c1]──▶[c2]──▶[c3]──▶[L1']  ← L1이 재배치됨

rebase 장점

  • 히스토리가 깔끔해짐
  • merge commit이 생기지 않음

3. Fast-forward only

git pull --ff-only origin main

fast-forward가 불가능하면 실패합니다. 충돌 가능성을 미리 알 수 있습니다.

fetch를 권장하는 상황

  1. 원격 변경사항 검토 필요: 무엇이 바뀌었는지 확인 후 결정
  2. 충돌 예상: 미리 확인하고 준비
  3. 여러 브랜치 작업: 모든 브랜치 정보 업데이트
# 추천 워크플로우
git fetch origin
git log --oneline HEAD..origin/main
# 변경사항 확인 후
git merge origin/main

자주 하는 실수

”Your local changes would be overwritten”

$ git pull
error: Your local changes to the following files would be overwritten by merge:
        app.js

해결:

# 방법 1: 커밋 후 pull
git add .
git commit -m "WIP"
git pull
 
# 방법 2: stash 사용
git stash
git pull
git stash pop

pull 했는데 파일이 안 바뀜

원인: 다른 브랜치를 pull 했거나, 이미 최신 상태

확인:

git branch   # 현재 브랜치 확인
git log --oneline -5  # 최근 커밋 확인

관련 명령어

더 알아보기