05. 원격 저장소(Remote Repository)

🎯 이 장의 목표
  • 원격 저장소가 무엇이고 왜 필요한지 이해한다
  • GitHub에 저장소를 만들고 로컬과 연결한다 (git remote)
  • push로 올리고 clone/pull/fetch로 내려받는다
  • 협업 시 충돌을 막는 pull → push 순서를 익힌다

5.1 원격 저장소란?

지금까지는 내 컴퓨터 안(로컬)에서만 작업했습니다. 하지만 다음과 같은 상황이라면?

  • 노트북이 고장 나면 모든 코드가 사라진다 😱
  • 동료와 같은 프로젝트를 함께 작업하고 싶다
  • 집과 회사에서 같은 코드를 이어서 작업하고 싶다

원격 저장소(Remote)는 인터넷 서버에 올려둔 저장소입니다. 로컬 저장소의 "온라인 백업본"이자 "팀의 공유 공간" 역할을 합니다.

flowchart TB
    R["☁️ 원격 저장소<br/>GitHub 서버 — 모두의 공유본"]
    L["💻 내 로컬 저장소<br/>내 컴퓨터"]
    L -- "git push (올리기)" --> R
    R -- "git pull (받기)" --> L
    classDef remote fill:#f3e8ff,stroke:#9333ea,color:#6b21a8
    classDef local fill:#dcfce7,stroke:#16a34a,color:#166534
    class R remote
    class L local

분산 버전 관리(1장)답게, 로컬과 원격 모두 완전한 이력을 가집니다. 원격은 "특별히 약속한 중심 저장소"일 뿐, 기술적으로는 로컬과 대등합니다.

5.2 원격 저장소 호스팅 서비스의 종류

원격 저장소를 무료/유료로 제공해주는 서비스(호스팅)는 여러 가지가 있습니다.

서비스특징
GitHub가장 대중적, 오픈소스 생태계 중심, 입문자 추천
GitLab자체 서버 설치 가능, CI/CD 강력
BitbucketAtlassian(소스트리 제작사) 제품, Jira 연동

이 책에서는 가장 널리 쓰이는 GitHub를 기준으로 설명합니다. 개념은 모든 서비스가 동일합니다.

5.3 GitHub 시작하기

  1. https://github.com 에서 무료 회원가입
  2. 우측 상단 + → New repository 클릭
  3. 저장소 이름 입력 (예: git-practice)
  4. 공개 범위 선택 (Public 공개 / Private 비공개)
  5. Create repository 클릭
💡 팁
입문 단계에서는 README, .gitignore, license 추가 옵션을 체크하지 않고 빈 저장소로 만드는 것이 로컬 연결 실습에 편합니다.

만들어진 저장소 페이지에 연결용 주소(URL)가 표시됩니다. 두 가지 방식이 있습니다.

💡 팁
URL(Uniform Resource Locator)은 인터넷에서 자원의 위치를 가리키는 주소입니다. 웹사이트 주소(https://...)가 대표적이며, Git에서는 원격 저장소가 어디 있는지를 가리킵니다.

5.4 통신 프로토콜: HTTPS vs SSH

원격 저장소와 통신하는 방법은 크게 두 가지입니다.

📌 핵심
먼저: 프로토콜이 뭔가요? 컴퓨터끼리 데이터를 주고받을 때 따르는 약속된 통신 규칙입니다. 사람으로 치면 "전화로 할까, 편지로 할까"처럼 대화 방식을 정하는 것입니다. 아래 둘은 Git이 서버와 대화할 때 쓰는 두 가지 방식입니다.
방식주소 형태특징
HTTPShttps://github.com/user/repo.git설정이 간단, 입문자 추천. 푸시 시 토큰(PAT) 인증
SSHgit@github.com:user/repo.git키를 한 번 등록하면 매번 인증 불필요
  • HTTPS(HyperText Transfer Protocol Secure): 웹 브라우저가 사이트에 접속할 때 쓰는 바로 그 방식. 주소창의 https://가 이것이며, 통신 내용이 암호화됩니다.
  • SSH(Secure Shell): 원격 컴퓨터에 안전하게 접속하기 위한 방식. 한 번 "열쇠(키)"를 만들어 등록해두면 매번 비밀번호를 입력하지 않아도 됩니다.
⚠️ 흔한 실수
중요: GitHub는 더 이상 비밀번호로 push를 허용하지 않습니다. HTTPS를 쓴다면 비밀번호 대신 개인 액세스 토큰(PAT, Personal Access Token)을 발급받아 사용해야 합니다. (GitHub Settings → Developer settings → Personal access tokens) 다행히 Git Credential Manager가 이를 자동 저장해줍니다.
💡 팁
토큰(token)? 비밀번호 대신 쓰는 길고 무작위한 인증용 문자열입니다. 비밀번호와 달리 "어떤 권한을 얼마 동안 허용할지" 세밀하게 정하고 필요할 때 폐기할 수 있어 더 안전합니다.

5.5 원격 저장소 연결하기 — git remote

이미 로컬에 만든 저장소(3~4장의 git-practice)를 GitHub에 연결해봅시다.

BASH
# 'origin'이라는 별칭으로 원격 저장소 등록
git remote add origin https://github.com/내아이디/git-practice.git

여기서 origin은 원격 저장소의 별칭(별명)입니다. 매번 긴 URL을 치지 않으려고 붙이는 이름이며, 관례적으로 첫 원격에 origin을 씁니다.

등록된 원격 확인

BASH
git remote            # 별칭만 보기
git remote -v         # URL까지 보기 (verbose)
CODE
origin  https://github.com/내아이디/git-practice.git (fetch)
origin  https://github.com/내아이디/git-practice.git (push)

원격 별칭 변경 / 삭제

BASH
# 별칭 이름 변경 (origin → upstream)
git remote rename origin upstream

# 원격 연결 삭제
git remote remove origin

# 원격의 상세 정보 보기
git remote show origin

소스트리에서는 좌측 Remotes 항목에서 원격 저장소와 그 브랜치들을 시각적으로 확인하고 추가/삭제할 수 있습니다.

5.6 올리기 — git push

로컬 커밋을 원격 저장소로 올리는 명령입니다.

BASH
# 첫 push: 로컬 main 브랜치를 origin에 올리고 추적 연결(-u)
git push -u origin main
  • -u (또는 --set-upstream)는 "로컬 main과 원격 origin/main을 연결"합니다.
  • 한 번 -u로 연결하면, 이후로는 그냥 git push만 쳐도 됩니다.
BASH
# 두 번째부터는 간단히
git push

push 후 GitHub 페이지를 새로고침하면 내 파일들이 올라가 있는 것을 볼 수 있습니다. 🎉

📌 핵심
업스트림(upstream) 추적이란?
로컬 브랜치가 "내가 따라갈 원격 브랜치"를 기억하는 것입니다. 한번 -u로 연결해두면 push/pull이 어디로 갈지 Git이 알아서 압니다.

5.7 복제하기 — git clone

원격 저장소를 통째로 내 컴퓨터로 가져옵니다. (새 컴퓨터에서, 또는 동료의 프로젝트를 받을 때)

BASH
git clone https://github.com/내아이디/git-practice.git
  • 전체 이력을 포함한 완전한 복사본이 생깁니다.
  • origin 원격이 자동으로 연결됩니다 (별도 remote add 불필요).
  • 폴더 이름을 바꾸고 싶으면 뒤에 이름을 붙입니다: git clone <url> my-folder

git init(새로 만들기)과 git clone(기존 것 복사)의 차이를 다시 정리하면:

용도원격 연결
git init새 저장소를 처음부터 생성수동(remote add)
git clone기존 원격 저장소를 복사자동

5.8 내려받기 — git pull vs git fetch

동료가 원격에 새 커밋을 올렸다면, 나도 내 로컬에 받아와야 합니다. 받는 방법은 두 가지입니다.

git fetch — 가져오기만 (안전)

BASH
git fetch origin
  • 원격의 변경 사항을 가져오기만 하고, 내 작업 파일에는 합치지 않습니다.
  • "원격에 뭐가 바뀌었는지 먼저 구경하고, 합칠지 말지 내가 결정"하고 싶을 때 사용합니다.
  • 받아온 내용은 origin/main 같은 원격 추적 브랜치에 들어갑니다. 확인 후 직접 병합(git merge origin/main)합니다.

git pull — 가져오고 합치기 (편리)

BASH
git pull origin main
# 또는 업스트림 연결돼 있으면 그냥
git pull
  • git pull = git fetch + git merge (가져오기 + 합치기를 한 번에)
  • 빠르고 편하지만, 충돌이 있으면 바로 해결해야 합니다.
💡 팁
언제 무엇을?
  • 혼자 작업하거나 변경이 단순하면 → git pull (편함)
  • 큰 변경을 받기 전 미리 확인하고 싶으면 → git fetch 후 검토 (안전)

입문 단계에서는 pull을 주로 쓰되, fetch의 존재와 의미를 알아두세요.

5.9 협업의 황금 규칙: pull 먼저, push 나중에

여러 명이 한 저장소에 작업하면 충돌(conflict)이 생길 수 있습니다. 이를 줄이는 핵심 습관이 있습니다.

CODE
작업 시작 전:  git pull   ← 남이 올린 최신 변경부터 받기
작업 / 커밋
push 하기 전:  git pull   ← 그 사이 또 올라온 게 있나 확인
              git push   ← 내 변경 올리기
⚠️ 흔한 실수
흔한 실수와 해결
push 했더니 이런 거부 메시지가 뜬다면:
```
! [rejected] main -> main (fetch first)
error: failed to push some refs...
```
이것은 "내가 모르는 새 커밋이 원격에 있다"는 뜻입니다. 당황하지 말고 먼저 git pull로 받아 합친 뒤(필요시 충돌 해결), 다시 git push 하면 됩니다. 절대 --force로 밀어붙이지 마세요 — 동료의 작업이 사라질 수 있습니다.

소스트리에서는 상단 툴바의 Pull / Push 버튼으로 이 작업을 하며, 각 버튼에 "원격보다 몇 개 앞서거나 뒤처졌는지"가 숫자로 표시되어 직관적입니다.

5.10 인증 정보 캐시(저장)하기

매번 토큰을 입력하기 번거롭다면, Git이 인증 정보를 기억하게 할 수 있습니다.

💡 팁
캐시(cache)는 자주 쓰는 데이터를 가까운 곳에 잠깐 보관해두어, 다음에 더 빨리 꺼내 쓰는 임시 저장 공간입니다. 여기서는 인증 정보를 잠시 기억해 매번 입력하는 수고를 더는 것입니다.
BASH
# 일정 시간(기본 15분) 메모리에 저장
git config --global credential.helper cache

# 캐시 유지 시간 늘리기 (예: 1시간 = 3600초)
git config --global credential.helper 'cache --timeout=3600'

# 영구 저장 (macOS는 keychain, Windows는 manager 권장)
git config --global credential.helper store      # 평문 저장(주의)
Windows의 Git Credential Manager, macOS의 Keychain은 토큰을 안전하게 저장해주므로 별도 설정 없이도 한 번 입력하면 이후 자동 처리되는 경우가 많습니다.

5.11 전체 협업 흐름 정리

BASH
# === 처음 한 번 ===
git clone https://github.com/team/project.git   # 프로젝트 받기
cd project

# === 매일 작업 ===
git pull                       # 1. 최신 변경 받기
# ... 코드 작업 ...
git add .                      # 2. 장바구니에 담기
git commit -m "Add feature X"  # 3. 기록하기
git pull                       # 4. (push 전) 다시 최신 받기
git push                       # 5. 내 작업 공유하기

이 사이클이 실무 협업의 기본입니다.

5.12 이 장에서 배운 것 (요약)

  • 원격 저장소는 온라인 백업이자 팀 공유 공간
  • git remote add origin <url>로 연결, origin은 관례적 별칭
  • HTTPS는 토큰(PAT) 인증, SSH는 키 등록 후 편리
  • git push(올리기), git clone(복사), git pull(받고 합치기), git fetch(받기만)
  • git pull = git fetch + git merge
  • 협업 황금 규칙: pull 먼저 → 작업 → pull → push, force push 금지

✍️ 확인 문제

  1. git pullgit fetch의 차이를 한 문장으로 설명해보세요.
  2. push가 [rejected] ... (fetch first)로 거부됐습니다. 무엇을 해야 하나요?
  3. git clone을 쓰면 원격 연결을 따로 해야 하나요?
여기까지가 1부(기초)입니다. 다음 단계에서는 Git의 진짜 강력함인 브랜치(branch)와 협업 심화 내용을 다룹니다.