01-04 원격 저장소와 협업

원격 저장소와 동기화하는 법 — clone, fetch, pull, push와 추적 브랜치(upstream).


원격 저장소와 동기화하는 법 — clone, fetch, pull, push와 추적 브랜치(upstream).

목표: 팀과 안전하게 코드를 주고받기


🌐 원격 저장소 개념

graph LR
    LOCAL["💻 Local Repo"] -->|"push"| REMOTE["🌐 Remote (origin)"]
    REMOTE -->|"fetch"| LOCAL
    REMOTE -->|"clone"| NEW["💻 새 Local"]
  • origin: 기본 원격 저장소의 관례적 이름
  • 추적 브랜치(tracking branch): 로컬 브랜치가 짝지은 원격 브랜치(origin/main)

🔧 git remote — 원격 관리

git remote -v                       # 등록된 원격 목록(URL)
git remote add origin <url>         # 원격 추가
git remote add upstream <원본url>    # 포크 워크플로우: 원본 추가
git remote set-url origin <new>     # URL 변경
git remote remove origin            # 제거
git remote show origin              # 상세 정보(브랜치 추적 관계 등)

📥 git clone — 복제

git clone <url>                  # 복제(자동으로 origin 설정)
git clone <url> my-folder        # 폴더명 지정
git clone --depth 1 <url>        # 최근 1커밋만(얕은 복제, CI에 유용)
git clone --branch develop <url> # 특정 브랜치만

🔃 git fetch vs git pull

graph LR
    REMOTE["🌐 origin/main"] -->|"git fetch"| TRACK["로컬의 origin/main 갱신"]
    TRACK -->|"git merge"| LOCAL["내 main"]
    REMOTE -->|"git pull = fetch + merge"| LOCAL
git fetch origin          # 원격 변경을 받기만(내 작업물 안전) ⭐
git fetch --prune         # 원격에서 삭제된 브랜치 정리
git pull                  # fetch + merge
git pull --rebase         # fetch + rebase (선형 히스토리)

[!tip] fetch 먼저가 안전 pull은 받자마자 병합한다. fetchgit log origin/main으로 확인하고 병합하면 예상치 못한 변경을 미리 점검할 수 있다.


📤 git push — 푸시

git push origin main             # 푸시
git push -u origin feature       # upstream 설정(이후 git push만으로) ⭐
git push                         # upstream 설정됐다면
git push --tags                  # 태그 전체 푸시
git push origin --delete feature # 원격 브랜치 삭제
git push --force-with-lease      # 안전한 강제 푸시 ⭐
git push --force                 # 강제 푸시(위험 🔴)

[!warning] --force 대신 --force-with-lease 그냥 --force는 내가 본 이후 남이 올린 커밋도 덮어쓴다. --force-with-lease는 원격이 내 예상과 다르면 거부해 사고를 막는다.


🔗 추적 브랜치(upstream) 설정

git push -u origin feature       # push하며 추적 설정
git branch -u origin/feature     # 기존 브랜치에 추적 설정
git branch -vv                   # 추적 관계 확인

추적이 설정되면 git status가 “ahead 2, behind 1” 식으로 원격과의 차이를 알려준다.


🤝 협업 시나리오

표준 PR 흐름

git switch main && git pull           # 1. 최신화
git switch -c feature/login           # 2. 브랜치
git add -p && git commit -m "feat: 로그인"  # 3. 작업
git push -u origin feature/login      # 4. 푸시
# 5. 웹에서 PR 생성 → 리뷰 → 머지
git switch main && git pull           # 6. 정리
git branch -d feature/login

push 거부됐을 때 (non-fast-forward)

원격에 내가 모르는 커밋이 있을 때 발생:

git pull --rebase                     # 원격 위로 내 커밋 재배치
git push                              # 다시 푸시

포크(Fork) 워크플로우

git clone <내포크url>
git remote add upstream <원본url>
git fetch upstream
git rebase upstream/main              # 원본 최신과 동기화

📋 체크리스트

  • git remote로 원격 추가·확인
  • clone 옵션(depth, branch)
  • fetch vs pull 차이
  • --force-with-lease로 안전한 강제 push
  • upstream 설정과 ahead/behind 해석
  • push 거부(non-ff) 대응
  • 포크 워크플로우(upstream)

🔗 관련 노트

  • 01-03-브랜치와-병합 — 이전: 브랜치
  • 01-05-되돌리기와-복구 — 다음: 되돌리기
  • 02-02-PR과-코드-리뷰 — PR 심화
  • 01-02-버전관리-Git — DevOps 협업 관점

마지막 업데이트: 2026-06-02