JAN's History
git pull=git fetch+git merge 본문
git pull의 2단계 작동 원리
git pull이 git fetch + git merge 를 합친 명령어라는걸 알고 계셨나요? 이 원리에 대해서 알아보겠습니다.
그 전에 git merge는 언제 사용할까요 ? 먼저 일반적인 git merge의 사용 시나리오에 대해서 알아보겠습니다.
개발자는 보통 로컬에서 기능 개발 브랜치(feature-A)를 완료한 후, 이를 메인 브랜치(main)에 합칠 때 git merge를 사용합니다.
- git checkout main (메인 브랜치로 이동)
- git pull (혹시 모를 서버의 최신 변경 사항을 먼저 받아옴)
- git merge feature-A (로컬 feature-A 브랜치를 main에 합침)
- git push origin main (합쳐진 최종 결과를 서버에 전송)
이처럼, git merge는 코드를 통합하는 단계이고, git push는 통합된 결과를 전송하는 다음 단계입니다.
git pull과의 비교
git pull은 git fetch + git merge의 조합으로, 원격 서버의 내용을 가져와서 내 로컬 브랜치에 자동으로 합치는 역할을 합니다.
이 경우에는 git pull 명령어 한 번 안에 다운로드와 로컬 merge가 모두 포함되지만, 이 역시 merge 이후에 로컬에서 다시 push를 해주어야 서버에 최종 반영됩니다.
요약하자면, merge는 로컬 통합이고, push는 네트워크 전송이므로, merge가 완료된 후에야 push를 통해 그 결과를 다른 사람들과 공유할 수 있게 됩니다.
1. git fetch: 원격 이력 가져오기
git pull이 가장 먼저 하는 일은 원격 저장소(origin 등)의 최신 커밋 이력을 다운로드하는 것입니다.
- 역할: 원격 서버에 있는 새로운 커밋 정보를 내 로컬 저장소의 특별한 공간(origin/main과 같은 원격 추적 브랜치)으로 가져옵니다.
- 특징: 이 단계에서는 아직 내 로컬 작업 브랜치(main 등)의 코드가 변경되지 않습니다. 단순히 "서버에 이런 변경사항들이 있구나" 하고 이력만 확인하는 것입니다.
2. git merge: 로컬 브랜치에 통합하기
fetch를 통해 다운로드한 최신 원격 이력을 현재 작업 중인 로컬 브랜치로 통합합니다.
- 역할: 로컬 브랜치(main)와 방금 가져온 원격 이력(origin/main)을 합칩니다.
- 특징: 이 과정에서 두 브랜치의 내용이 다를 경우 새로운 Merge Commit이 생성되거나, 충돌(Conflict)이 발생하여 사용자가 직접 해결해야 할 수 있습니다.
따라서, git pull을 실행하면 원격의 최신 코드를 다운로드(fetch)하고, 그 코드를 내 현재 작업 파일에 자동으로 합치는(merge) 것까지 한 번에 처리됩니다.
git pull 후 그래프 모양
1. Fast-Forward Merge (가장 흔함)
상황: 로컬 브랜치에 원격 저장소에 없는 새로운 커밋이 전혀 없을 때 발생합니다. 즉, 로컬 브랜치가 원격 브랜치보다 뒤쳐져만 있을 때입니다.
| 로컬 main | A — B — C |
| 원격 main | A — B — C — D — E |
- git pull 실행 후: 로컬 브랜치의 포인터(main)가 원격 브랜치의 최신 커밋인 E로 단순히 이동합니다.
- 그래프 모양: 이력은 **일직선(선형)**이 됩니다. 새로운 Merge Commit은 생성되지 않습니다.
| 로컬 main | A — B — C — D — E |
2. Three-Way Merge (Merge Commit 생성)
상황: 로컬 브랜치와 원격 브랜치 모두 공통 조상 이후에 독자적인 새로운 커밋이 있을 때 발생합니다. 즉, 로컬에서 작업한 내용이 있고, 그 사이에 다른 팀원이 원격에 새로운 커밋을 추가했을 때입니다.
| 로컬 main | A — B — C ➡️ L1 — L2 (로컬 독자 커밋) |
| 원격 main | A — B — C ➡️ R1 — R2 (원격 독자 커밋) |
- git pull 실행 후: Git은 L2와 R2를 합치는 새로운 커밋 **M (Merge Commit)**을 생성합니다. 이 M 커밋은 L2와 R2를 부모로 가집니다.
- 그래프 모양: 두 이력이 **분기(Fork)**된 후 다시 합쳐지는 모양이 됩니다. Merge Commit이 생성되어 비선형적인 그래프가 됩니다.
| 로컬 main | A — B — C ➡️ L1 — L2 ➡️ M |
| _____________ R1 — R2 ↗️ |
'협업' 카테고리의 다른 글
| Git Merge(3-way merge) 알아보기 (0) | 2025.10.19 |
|---|---|
| git rebase 와 git merge의 차이점 (0) | 2025.09.29 |