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 순서로 작업하는 방식이 자주 사용됩니다.
원격 저장소와의 상호작용을 명확히 이해하고, 상황에 맞는 명령어를 유연하게 선택하는 습관이 안정적이고 예측 가능한 협업 환경을 만드는 데 큰 도움이 됩니다.
'DevOps > Git' 카테고리의 다른 글
| [Git] 브랜치 통합 : merge, rebase, cherry-pick (0) | 2025.04.23 |
|---|---|
| [Git] 브랜치 전략 이해 : branch, checkout, switch, restore, fetch (0) | 2025.04.19 |
| [Git] 변경 이력 관리 : commit, log, diff, show (0) | 2025.04.17 |
| [Git] Git 파일 관리 : add, status, rm (0) | 2025.04.16 |
| [Git] Git 저장소 생성 및 연결 : init, clone, remote (0) | 2025.04.15 |