git pull과 fetch
한 줄 요약
원격 저장소의 변경사항을 로컬로 가져오기
선행 지식
pull vs fetch
| git fetch | git pull |
|---|---|
| 다운로드만 | 다운로드 + 병합 |
| 로컬 브랜치 변경 안 함 | 로컬 브랜치에 병합 |
| 안전함 | 충돌 가능 |
| 검토 후 병합 가능 | 바로 병합 |
git pull = git fetch + git merge
기본 사용법
# fetch: 다운로드만
git fetch origin
# pull: 다운로드 + 병합
git pull origin main주요 옵션
git fetch
| 옵션 | 설명 | 예시 |
|---|---|---|
| (없음) | 기본 Remote fetch | git fetch |
<remote> | 특정 Remote | git fetch origin |
--all | 모든 Remote | git fetch --all |
--prune | 삭제된 브랜치 정리 | git fetch --prune |
git pull
| 옵션 | 설명 | 예시 |
|---|---|---|
| (없음) | 기본 pull | git pull |
--rebase | merge 대신 rebase | git pull --rebase |
--ff-only | fast-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 originpull 시 충돌
원격과 로컬에서 같은 파일을 수정했다면:
$ 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 mainmerge 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 mainfast-forward가 불가능하면 실패합니다. 충돌 가능성을 미리 알 수 있습니다.
fetch를 권장하는 상황
- 원격 변경사항 검토 필요: 무엇이 바뀌었는지 확인 후 결정
- 충돌 예상: 미리 확인하고 준비
- 여러 브랜치 작업: 모든 브랜치 정보 업데이트
# 추천 워크플로우
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 poppull 했는데 파일이 안 바뀜
원인: 다른 브랜치를 pull 했거나, 이미 최신 상태
확인:
git branch # 현재 브랜치 확인
git log --oneline -5 # 최근 커밋 확인관련 명령어
- git remote - Remote 관리
- git push - 원격에 업로드
- git merge - 브랜치 병합
더 알아보기
- Remote란 - 원격 저장소 개념
- 충돌 해결하기 - pull 시 충돌 해결
- 다른 사람 코드 가져오기 - 상황별 가이드