본문 바로가기
DevOps/Git

[Git] 원격 저장소와 동기화 : fetch, pull, push

by okbear3 2025. 4. 18.

Git은 로컬(Local)에서 개발하고, 원격(Remote) 저장소와 주기적으로 동기화하는 구조입니다.
이때 핵심적으로 사용되는 명령어들이 바로 push, pull, fetch입니다.

이 글에서는 각 명령어의 역할, 차이점, 사용 예제를 구체적으로 알아보겠습니다.


fetch – 원격 변경 이력만 가져오기

원격 저장소의 변경 이력을 로컬로 가져오되, 실제 파일 변경이나 병합은 하지 않습니다.
원격의 최신 상태를 확인한 후 수동으로 병합하는 경우에 유용합니다.

git fetch origin
옵션 설명
--all 연결된 모든 원격 저장소에서 변경사항을 가져옴
--prune 원격 저장소에서 삭제된 브랜치 정보를 정리

 

 

fetch는 어떻게 동작할까?

git fetch는 원격 저장소의 커밋을 로컬로 받아올 때, 이를 이름 없는 임시 브랜치 형태로 관리합니다. 이 정보는 내부적으로 FETCH_HEAD라는 파일에 기록됩니다.

FETCH_HEAD란?

.git/FETCH_HEAD 파일은 git fetch를 실행할 때마다 자동으로 갱신됩니다.

여기에 기록되는 정보는 원격 저장소에서 가져온 최신 커밋의 참조값(commit hash) 으로, 이후 사용자가 직접 병합 작업을 할 때 참고되는 기반이 됩니다.

git fetch origin
git checkout FETCH_HEAD

→ 이렇게 직접 FETCH_HEAD를 체크아웃하여 가져온 커밋을 살펴볼 수도 있습니다.

 

 

fetch pull 순서가 더 안전할까?

만약 원격 저장소에 다른 개발자의 변경 사항이 존재하는 상황에서 git pull을 바로 실행하면, 다음과 같은 위험이 생길 수 있습니다.

  • 현재 작업 중인 파일이 자동 병합되며 예상치 못한 충돌이 발생하거나,
  • 경우에 따라 변경된 내용이 작업 복사본에 덮어쓰여 손실될 가능성도 있습니다.

이를 방지하기 위해 다음과 같은 순서가 권장됩니다:

git fetch
git diff origin/main        # 변경사항 확인
git merge origin/main       # 직접 병합 (또는 pull)

특히 로컬에서 변경사항이 존재하는 상태라면, fetch → diff → merge 흐름을 사용하는 것이, 보다 안정적이고 신중한 업데이트 방법입니다.

 

pull - 원격 저장소의 변경사항을 로컬에 가져와 병합

원격 저장소의 변경 사항을 로컬 저장소로 가져오고 자동으로 병합합니다.

협업시 다른 사람의 변경을 반영하여 최신 상태를 유지하기 위해 사용합니다.

#원격 저장소 origin의 main 브랜치 변경 사항을 로컬로 가져오고, 자동 병합합니다.
git pull origin main

#rebase 옵션을 사용하여 커밋 내역을 깔끔하게 적용합니다.
git pull --rebase origin main
옵션 설명
--rebase 병합 대신 rebase 방식으로 변경 내역 적용
--no-commit 병합은 수행되지만, 자동 커밋은 하지 않음
--ff-only fast-forward 병합만 허용

 

병합 방식 - merge vs rebase

git pull은 기본적으로 두 단계 작업으로 이루어집니다

git fetch # 원격 저장소에서 최신 커밋을 가져오고
git merge # 그 커밋을 로컬 브랜치에 병합합니다.

하지만 이 병합 방식에는 두 가지 주요 전략이 있으며, 팀의 Git 사용 정책에 따라 병합 히스토리가 달라질 수 있습니다.

 

1) merge : 기본 병합 방식

git pull 
  • 원격 저장소의 커밋을 가져온 후, 별도의 병합 커밋(merge commit) 을 만들어 현재 브랜치와 통합합니다.
  • 커밋 히스토리 상에서 분기와 합류가 명확하게 표시되며, 작업 흐름 추적이 쉬운 장점이 있습니다.

예시 히스토리 :

*   c7d8e9a (HEAD -> main) Merge branch 'origin/main'
|\
| * 1a2b3c4 origin에서 추가된 커밋
* | 5f6g7h8 로컬에서 작업한 커밋
|/

 

2) rebase : 히스토리 정리 중심

git pull --rebase
  • 로컬에서 작업한 커밋을 원격 브랜치 커밋 뒤로 재배치(replay) 합니다.
  • 히스토리가 일직선(linear) 으로 이어져 보기 쉽고 깔끔해집니다.

예시 히스토리 :

* 1a2b3c4 origin에서 추가된 커밋
* 5f6g7h8 내 로컬 커밋이 그 뒤에 재배치됨 (rebased)

rebase 방식은 히스토리가 직선형으로 깔끔하게 유지가 되어 관리가 편하지만, 충돌 발생 시 해결 방법이 복잡해질 수 있습니다. 
팀원들과 협업중인 공유 브랜치에서는 주의가 필요합니다.

 

push - 로컬 커밋 내용 원격 저장소로 업로드

로컬 브랜치의 변경사항(커밋, 브랜치, 태그 등)을 원격 저장소에 업로드(push) 합니다.

협업시 다른 사람들과 코드를 공유하기 위해 필요한 작업입니다.

git push origin <브랜치>

→ 최초 push 시 로컬의 브랜치를 원격 저장소에 업로드 하고 연결설정을 하게 되는데, 이후에는 브랜치명을 생략해도 git push 명령어 만으로도 간단하게 업로드 가능합니다.

옵션 설명
-u 최초 push 시, 로컬 브랜치와 원격 브랜치를 연결
--force 강제 push (다른 팀원의 작업을 덮어쓸 위험이 있으므로 주의)
--tags 태그도 함께 업로드 (릴리즈 등의 버전 공유 가능)

 

→ 로컬에서 작업한 commit 을 공동으로 작업하는 협업 프로젝트로 push 하는 경우, 원격 저장소에 반영되는 내용이기 때문에 신중하게 진행해야합니다.


원격 저장소와의 동기화는 Git을 협업 도구로 만드는 핵심 기능입니다.

  • push내 작업을 공유하고,
  • pull다른 사람의 작업을 반영하며,
  • fetch신중하게 확인한 후 병합할 수 있는 기회를 제공합니다.

특히 실무에서는 변경 이력을 보다 안정적으로 관리하기 위해 fetch → diff → merge 순서로 작업하는 방식이 자주 사용됩니다.

원격 저장소와의 상호작용을 명확히 이해하고, 상황에 맞는 명령어를 유연하게 선택하는 습관이 안정적이고 예측 가능한 협업 환경을 만드는 데 큰 도움이 됩니다.