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 pullfetch + merge를 합친 단축 명령어다. 충돌이 없을 때 가장 간단하게 동기화하는 방법이다.

# 방법 1: pull (간단하지만 충돌 시 당황할 수 있음)
git pull origin main
 
# 방법 2: fetch → merge (단계적으로 안전하게)
git fetch origin
git merge origin/main

2.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/main

3.2 로컬 변경 사항을 완전히 버리고 동기화

원격 기준으로 로컬을 완전히 초기화할 때 사용한다.

⚠️ 주의: 되돌릴 수 없음

git reset --hard는 커밋하지 않은 로컬 변경 사항을 영구 삭제한다. 반드시 백업 브랜치를 만든 뒤 실행할 것.

git fetch origin
git reset --hard origin/main

3.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