동작하는 코드
예제 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
클론은 자동으로:
- 저장소를 다운로드
origin을 원격 저장소로 설정- 로컬
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
- GitHub에 새 저장소를 만드세요 (README 없이 빈 저장소).
- 로컬 저장소에서
git remote add origin URL로 연결하세요. git push -u origin main으로 첫 push를 하세요.- GitHub에서 직접 파일을 수정한 후,
git fetch origin으로 가져오고git log --oneline --all로 확인하세요. 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