JAN's History

git pull=git fetch+git merge 본문

협업

git pull=git fetch+git merge

JANNNNNN 2025. 10. 3. 17:42

git pull의 2단계 작동 원리

git pull이 git fetch + git merge 를 합친 명령어라는걸 알고 계셨나요? 이 원리에 대해서 알아보겠습니다.

그 전에 git merge는 언제 사용할까요 ? 먼저 일반적인 git merge의 사용 시나리오에 대해서 알아보겠습니다.

개발자는 보통 로컬에서 기능 개발 브랜치(feature-A)를 완료한 후, 이를 메인 브랜치(main)에 합칠 때 git merge를 사용합니다.

 

  1. git checkout main (메인 브랜치로 이동)
  2. git pull (혹시 모를 서버의 최신 변경 사항을 먼저 받아옴)
  3. git merge feature-A (로컬 feature-A 브랜치를 main에 합침)
  4. 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은 L2R2를 합치는 새로운 커밋 **M (Merge Commit)**을 생성합니다. 이 M 커밋은 L2R2를 부모로 가집니다.
  • 그래프 모양: 두 이력이 **분기(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