DaleSchool

원격 저장소

입문25분

학습 목표

  • 원격 저장소(remote)를 추가하고 확인할 수 있다
  • git push로 변경 사항을 업로드할 수 있다
  • git fetch와 git pull의 차이를 설명할 수 있다
  • 원격 추적 브랜치(origin/main)의 개념을 이해할 수 있다

동작하는 코드

예제 1: 원격 저장소 연결

로컬 저장소를 GitHub 원격 저장소에 연결합니다:

cd ~/my-project
git remote add origin https://github.com/username/my-project.git

연결 확인:

git remote -v

출력:

origin  https://github.com/username/my-project.git (fetch)
origin  https://github.com/username/my-project.git (push)
  • origin: 원격 저장소의 별명 (관례적으로 origin 사용)
  • (fetch): 가져오기 URL
  • (push): 보내기 URL

예제 2: 첫 push

git push -u origin main

출력:

Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 234 bytes | 234.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/username/my-project.git
 * [new branch]      main -> origin/main
Branch 'main' set up to track remote branch 'main' from 'origin'.

-u 옵션은 업스트림(upstream)을 설정합니다. 이후부터는 git push만 해도 됩니다.

예제 3: 변경 후 push

echo "업데이트된 내용" >> README.md
git add README.md
git commit -m "docs: README 업데이트"
git push

출력:

To https://github.com/username/my-project.git
   a1b2c3d..e4f5g6h  main -> origin/main

직접 수정하기

원격 추적 브랜치 이해하기

push 후 Git은 두 가지 브랜치를 관리합니다:

로컬:   main        ← 내가 작업하는 브랜치
원격:   origin/main ← 원격 저장소의 상태 복사본
git branch -a   # 모든 브랜치 (로컬 + 원격)

출력:

* main
  remotes/origin/main

원격 추적 브랜치(origin/main)는 마지막으로 원격과 동기화된 상태를 기억합니다. 직접 수정할 수 없습니다.

fetch vs pull

팀원이 원격에 새 커밋을 추가했을 때:

원격(origin/main): A → B → C → D  (팀원이 C, D 추가)
로컬(main):        A → B           (내가 모르는 상태)

git fetch: 원격 변경 사항을 가져오되 로컬 브랜치는 변경 안 함

git fetch origin
git log --oneline --all

출력:

* d5e6f7g (origin/main) feat: 팀원이 추가한 기능
* c1d2e3f feat: 또 다른 팀원 커밋
* b1c2d3e (HEAD -> main) docs: README 업데이트

origin/main은 업데이트됐지만 로컬 main은 아직 구버전입니다.

# 원격 추적 브랜치의 변경 확인
git log main..origin/main   # origin/main에만 있는 커밋

git pull: fetch + merge (또는 rebase)

git pull

출력:

Updating b1c2d3e..d5e6f7g
Fast-forward
 new-feature.js | 5 +++++
 1 file changed, 5 insertions(+)

원격 브랜치 작업

# 원격의 모든 브랜치 확인
git branch -r

# 원격 브랜치를 로컬로 가져오기
git checkout -b feature-x origin/feature-x

# 로컬 feature 브랜치를 원격에 push
git push origin feature-login

# 원격 브랜치 삭제
git push origin --delete feature-old

클론으로 시작하기

팀 프로젝트에 합류할 때:

git clone https://github.com/team/project.git
cd project
git log --oneline --all

클론은 자동으로:

  1. 저장소를 다운로드
  2. origin을 원격 저장소로 설정
  3. 로컬 main 브랜치를 origin/main을 추적하도록 설정

"왜?" — 원격 저장소가 필요한 이유

| 상황 | 원격 저장소 역할 | | -------------------- | ------------------------------- | | 다른 컴퓨터에서 작업 | 클론 후 pull로 최신 상태 유지 | | 팀 협업 | 변경 사항 공유 | | 백업 | 로컬 컴퓨터 고장 시 복구 가능 | | 배포 | CI/CD가 push를 감지해 자동 배포 |

원격 추적 브랜치 다이어그램

GitHub(원격):
  main: A → B → C → D

내 컴퓨터(로컬):
  origin/main: A → B → C  ← 마지막 fetch/pull 기준
  main:        A → B → E  ← 내 작업 (아직 push 안 함)

git push하면:

GitHub(원격):
  main: A → B → C → D → E

내 컴퓨터(로컬):
  origin/main: A → B → C → D → E  ← 동기화됨
  main:        A → B → C → D → E

흔한 실수

실수 1: push 전에 pull 하지 않기

git push
# error: failed to push some refs
# hint: Updates were rejected because the remote contains work...

팀원이 먼저 push한 경우입니다:

git pull   # 먼저 원격 변경 사항 가져오기
git push   # 그 후 push

실수 2: 강제 push (force push)

# 위험: 원격의 히스토리를 덮어씌움
git push --force

# 팀원의 작업이 사라질 수 있음!

공유 브랜치(main, develop)에는 절대 --force를 쓰지 마세요.

실수 3: 원격과 로컬 브랜치 이름 혼동

# 로컬 feature-login을 원격 feature-login으로 push
git push origin feature-login

# 로컬 feature-login을 원격 feature-v2로 push (다른 이름)
git push origin feature-login:feature-v2

심화 학습

SSH vs HTTPS 인증

GitHub 접속 방법은 두 가지입니다:

HTTPS (URL: https://github.com/...)

  • Personal Access Token으로 인증
  • 처음 설정이 쉬움
  • 매번 토큰을 물어볼 수 있음 (keychain에 저장 가능)

SSH (URL: git@github.com:...)

  • SSH 키로 인증
  • 한번 설정하면 비밀번호 없이 사용

SSH 키 생성:

ssh-keygen -t ed25519 -C "your@email.com"
cat ~/.ssh/id_ed25519.pub   # 공개 키를 GitHub에 등록

GitHub Settings → SSH and GPG keys → New SSH key에 공개 키를 붙여넣습니다.

원격 저장소 URL 변경

HTTPS에서 SSH로 바꾸거나 저장소를 이전했을 때:

# 현재 URL 확인
git remote -v

# URL 변경
git remote set-url origin git@github.com:username/repo.git

# 확인
git remote -v
여러 원격 저장소

오픈소스 기여 시 자주 쓰는 패턴:

# Fork한 내 저장소 (push 대상)
git remote add origin git@github.com:myname/project.git

# 원본 저장소 (최신 변경 사항 받기)
git remote add upstream git@github.com:original/project.git

git remote -v
# origin    git@github.com:myname/project.git (fetch)
# origin    git@github.com:myname/project.git (push)
# upstream  git@github.com:original/project.git (fetch)
# upstream  git@github.com:original/project.git (push)

# 원본 최신화
git fetch upstream
git merge upstream/main
  1. GitHub에 새 저장소를 만드세요 (README 없이 빈 저장소).
  2. 로컬 저장소에서 git remote add origin URL로 연결하세요.
  3. git push -u origin main으로 첫 push를 하세요.
  4. GitHub에서 직접 파일을 수정한 후, git fetch origin으로 가져오고 git log --oneline --all로 확인하세요.
  5. git pull로 로컬 main을 최신화하세요.

Q1. git pull을 두 명령어로 분리하면?

  • A) git fetch + git push
  • B) git clone + git merge
  • C) git fetch + git merge
  • D) git remote + git update