Summary
- Git은 **로컬(내 컴퓨터)**과 원격(GitHub 등) 저장소를 분리해서 관리하며, 두 저장소를 동기화하는 것이 핵심 흐름이다.
git fetch는 원격의 최신 정보를 다운로드만 하고,git pull은 다운로드 + 병합까지 한 번에 처리한다.git diff --name-status로 로컬과 원격의 차이를 파악한 뒤, 충돌 여부를 사전에 확인하는 습관이 중요하다.- 병합 전 백업 브랜치를 만들어 두면 실수로 변경 사항을 날려도 복구할 수 있다.
git reset --hard는 로컬 변경 사항을 완전히 삭제하는 강력한 명령어로, 반드시 백업 후 사용해야 한다.
0. 들어가며
팀 프로젝트나 여러 PC에서 작업할 때, 항상 부딪히는 질문이 있다.
“원격 저장소에 새 코드가 올라왔는데, 내 로컬 코드는 어떻게 맞춰야 하지?”
이 글에서는 Git으로 원격 저장소와 로컬 저장소를 안전하게 동기화하는 전체 흐름을 단계별로 정리한다. 명령어 나열이 아닌, 왜 이 순서대로 해야 하는지에 집중한다.
1. 개요
Git의 저장소 구조란?
Git은
원격 저장소(Remote)와로컬 저장소(Local)를 분리해서 관리하며, 두 공간을 명시적으로 동기화해야 한다.
Git을 처음 접하면 “저장했는데 왜 상대방한테 안 보이지?” 하는 상황이 생긴다. 그 이유는 Git이 **내 컴퓨터(로컬)**와 **서버(원격)**를 철저히 분리해서 관리하기 때문이다.
[원격 저장소] GitHub / GitLab / Gitea 등
↑ push (올리기)
↓ fetch / pull (가져오기)
[로컬 저장소] 내 컴퓨터
↑ add + commit (기록하기)
↓
[작업 디렉토리] 실제 파일들
| 공간 | 설명 | 명령어 |
|---|---|---|
| 작업 디렉토리 | 실제 파일을 수정하는 공간 | - |
| 스테이징 영역 | 커밋할 파일을 임시로 모아두는 공간 | git add |
| 로컬 저장소 | 내 PC에 기록된 커밋 히스토리 | git commit |
| 원격 저장소 | GitHub 등 서버에 올라간 공유 저장소 | git push / pull / fetch |
2. 핵심 명령어
2.1 원격 정보 가져오기 — git fetch
git fetch는 원격 저장소의 최신 정보를 다운로드만 하고, 내 로컬 파일은 건드리지 않는 안전한 명령어다.
git pull과 자주 혼동되는데, 핵심 차이는 아래와 같다.
| 명령어 | 하는 일 | 로컬 파일 변경 |
|---|---|---|
git fetch | 원격 정보 다운로드만 | ❌ 변경 없음 |
git pull | 다운로드 + 병합(merge)까지 | ✅ 변경됨 |
git fetch origin# 실행 결과 예시
From http://10.10.12.203:35000/happy2/industry_code
6958da7..c73a9af main -> origin/main
# → 원격 origin/main은 c73a9af 커밋까지 진행됨
# → 내 로컬 main은 아직 6958da7 (2개 커밋 뒤처짐)fetch를 먼저 쓰는 이유
git pull을 바로 쓰면 충돌이 갑자기 터질 수 있다.fetch → diff → pull순서로 먼저 차이를 확인하고 병합하는 것이 안전하다.
2.2 로컬 vs 원격 차이 확인 — git diff
git diff --name-status origin/main으로 어떤 파일이 어떻게 달라졌는지 파악하고, 충돌 가능성을 사전에 체크한다.
git diff --name-status origin/main# 출력 예시
A README.md ← 원격에 새로 추가됨
M script.py ← 내용이 수정됨 (충돌 가능)
D old_config.json ← 원격에서 삭제됨| 기호 | 의미 | 주의 사항 |
|---|---|---|
A | 원격에 새로 추가됨 (로컬 없음) | pull로 가져오면 됨 |
M | 동일 파일의 내용이 다름 | 충돌(Conflict) 가능, 수동 확인 필요 |
D | 원격에서 삭제됨 (로컬엔 존재) | 필요 시 수동 삭제 |
2.3 병합하기 — git pull / git merge
git pull은fetch + merge를 합친 단축 명령어다. 충돌이 없을 때 가장 간단하게 동기화하는 방법이다.
# 방법 1: pull (간단하지만 충돌 시 당황할 수 있음)
git pull origin main
# 방법 2: fetch → merge (단계적으로 안전하게)
git fetch origin
git merge origin/main2.4 충돌(Conflict) 해결하기
충돌은 같은 파일의 같은 줄을 로컬과 원격에서 각각 다르게 수정했을 때 발생한다. Git이 어느 쪽을 선택할지 몰라 사람에게 판단을 맡기는 것이다.
충돌이 발생하면 파일 안에 아래와 같은 표시가 생긴다.
<<<<<<< HEAD ← 내 로컬 변경 사항
로컬에서 수정한 내용
=======
원격에서 수정한 내용
>>>>>>> origin/main ← 원격 변경 사항
해결 순서:
# 1. 로컬 변경 사항을 일단 커밋해 두기
git add .
git commit -m "local backup before merge"
# 2. 원격 병합 시도
git pull origin main
# 3. 충돌 파일을 VSCode 등에서 직접 수정 후
git add .
git commit -m "resolve merge conflict"충돌 해결 시 주의
충돌 마커(
<<<<<<<,=======,>>>>>>>)를 모두 제거해야 커밋이 가능하다. VSCode의Merge Editor를 사용하면 시각적으로 편리하게 해결할 수 있다.
3. 실전 워크플로우
3.1 안전한 동기화 절차 (권장)
실무에서 가장 안전한 동기화 순서: 백업 → 확인 → 병합
# Step 1. 백업 브랜치 생성 (현재 상태 보존)
git checkout -b backup_20260407
# Step 2. 메인 브랜치로 복귀
git checkout main
# Step 3. 원격 최신 정보 다운로드 (파일 변경 없음)
git fetch origin
# Step 4. 로컬 vs 원격 차이 확인
git diff --name-status origin/main
# Step 5. 문제 없으면 병합
git merge origin/main3.2 로컬 변경 사항을 완전히 버리고 동기화
원격 기준으로 로컬을 완전히 초기화할 때 사용한다.
⚠️ 주의: 되돌릴 수 없음
git reset --hard는 커밋하지 않은 로컬 변경 사항을 영구 삭제한다. 반드시 백업 브랜치를 만든 뒤 실행할 것.
git fetch origin
git reset --hard origin/main3.3 전체 흐름 요약
| 단계 | 목적 | 명령어 | 특징 |
|---|---|---|---|
| ① | 백업 브랜치 생성 | git checkout -b backup_YYYYMMDD | 실수 시 복구 가능 |
| ② | 원격 정보 다운로드 | git fetch origin | 로컬 파일 변경 없음 |
| ③ | 차이 확인 | git diff --name-status origin/main | 충돌 사전 파악 |
| ④ | 병합 | git merge origin/main | 실제 파일 반영 |
| ⑤ | 충돌 해결 | VSCode에서 수동 편집 후 git commit | 필요 시만 |
| ⑥ | 강제 초기화 | git reset --hard origin/main | ⚠️ 백업 필수 |
마치며
Git의 로컬 ↔ 원격 동기화는 fetch → diff → merge 세 단계 흐름을 익히는 것이 핵심이다.
git pull 한 방으로 해결하고 싶은 유혹이 있지만, 충돌이 터지면 당황하기 쉽다.
먼저 확인하고, 백업하고, 그 다음 병합하는 습관이 협업 사고를 예방하는 가장 확실한 방법이다.
Reference