[이제와서 시작하는 GitHub 마스터하기 - 기초편 #9] git push와 pull: 원격 저장소와 동기화하기
[이제와서 시작하는 GitHub 마스터하기 - 기초편 #9] git push와 pull: 원격 저장소와 동기화하기
학습 목표
이 장을 마치면 다음을 할 수 있습니다:
- ✅ git push로 로컬 커밋을 GitHub에 업로드할 수 있습니다
- ✅ git pull로 원격 변경사항을 가져올 수 있습니다
- ✅ 푸시/풀 실패 시 문제를 해결할 수 있습니다
- ✅ 충돌(Conflict)을 해결할 수 있습니다
지난 편 복습
기초편 #8에서는 git add와 commit을 배웠습니다:
- Git의 4단계 작업 흐름 완벽 이해
- git add의 다양한 옵션 활용
- 좋은 커밋 메시지 작성 방법
- 커밋 되돌리기 및 수정하기
1. git push - 원격 저장소에 업로드
git push는 로컬 커밋을 원격 저장소로 전송합니다.
기본 사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 기본 푸시
git push
# 특정 원격 저장소와 브랜치 지정
git push origin main
# 새 브랜치 푸시
git push -u origin feature-branch
# 모든 브랜치 푸시
git push --all
# 태그 푸시
git push --tags
# 강제 푸시 (위험!)
git push --force
푸시 전 확인사항
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 현재 브랜치 확인
git branch
# * main
# 2. 원격 저장소 확인
git remote -v
# origin git@github.com:username/repo.git (fetch)
# origin git@github.com:username/repo.git (push)
# 3. 푸시할 커밋 확인
git log origin/main..HEAD --oneline
# abc123 feat: 새 기능 추가
# def456 fix: 버그 수정
# 4. 푸시
git push origin main
🚀 푸시 실패 시 해결법
주요 실패 원인과 해결책:
| 실패 원인 | 오류 메시지 | 해결 방법 |
|---|---|---|
| 원격에 새 커밋 | ! [rejected] | git pull 후 다시 push |
| 권한 없음 | Permission denied | 저장소 권한 확인 |
| 브랜치 보호 | protected branch | Pull Request 생성 |
| 브랜치 없음 | no upstream branch | git push -u origin branch |
🔄 해결 플로우 (클릭하여 펼치기)
flowchart LR
A[push 실패] --> B{원인}
B -->|원격 변경| C[git pull]
B -->|권한| D[권한 확인]
B -->|보호| E[PR 생성]
C --> F{충돌?}
F -->|있음| G[해결]
F -->|없음| H[push]
G --> H
style A fill:#ffcdd2,stroke:#c62828,stroke-width:2px
style H fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
푸시 옵션 비교
| 옵션 | 설명 | 위험도 | 사용 시나리오 |
|---|---|---|---|
git push | 기본 푸시 | 안전 | 일반적인 경우 |
git push -u origin main | 업스트림 설정 | 안전 | 새 브랜치 첫 푸시 |
git push --force | 강제 푸시 | 위험 | 절대 피해야 함 |
git push --force-with-lease | 안전한 강제 푸시 | 중간 | 리베이스 후 사용 |
2. git pull - 원격 저장소에서 가져오기
git pull은 원격 저장소의 변경사항을 가져와 현재 브랜치에 병합합니다.
기본 사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 기본 풀
git pull
# 특정 원격 저장소와 브랜치에서 풀
git pull origin main
# 리베이스로 풀
git pull --rebase
# 병합 없이 가져오기만 (fetch)
git fetch
# 모든 브랜치 업데이트
git pull --all
🔄 pull = fetch + merge
git pull은 사실 두 명령어의 조합입니다:
📥 git fetch: 원격 변경사항만 가져옴 (로컬 변경 없음) 🤝 git merge: 가져온 변경사항을 현재 브랜치에 병합
📊 pull 동작 원리 (클릭하여 펼치기)
graph LR
A[git pull] --> B[fetch + merge]
C[git pull --rebase] --> D[fetch + rebase]
B --> E[병합 커밋 생성]
D --> F[히스토리 재정렬]
style A fill:#e1f5fe,stroke:#01579b,stroke-width:2px
style C fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
pull vs fetch 비교
| 명령어 | 동작 | 로컬 변경 | 사용 시나리오 |
|---|---|---|---|
git fetch | 원격 변경사항만 가져옴 | 변경 없음 | 확인 후 병합하고 싶을 때 |
git pull | fetch + merge | 자동 병합 | 바로 병합해도 안전할 때 |
git pull --rebase | fetch + rebase | 히스토리 재정렬 | 깔끔한 히스토리 유지 |
충돌 해결하기
🤝 충돌 해결 가이드
충돌 표시 형식:
1
2
3
4
5
<<<<<<< HEAD
내 변경사항
=======
원격 저장소의 변경사항
>>>>>>> origin/main
해결 방법:
- 🔍 충돌 파일 확인:
git status - 📝 파일 편집하여 충돌 해결
- ✅ 해결 후:
git add→git commit→git push
VSCode에서 충돌 해결:
Accept Current Change- 내 변경사항 선택Accept Incoming Change- 원격 변경사항 선택Accept Both Changes- 모두 보존
충돌 해결 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 풀 시도
git pull origin main
# CONFLICT (content): Merge conflict in file.txt
# 2. 충돌 확인
git status
# both modified: file.txt
# 3. 파일 편집하여 충돌 해결
# (충돌 마커를 제거하고 원하는 내용만 남김)
# 4. 해결 후 커밋
git add file.txt
git commit -m "merge: 충돌 해결"
git push origin main
자주 묻는 질문 (FAQ)
Q1. git push –force는 언제 사용하나요?
A: 거의 사용하지 마세요! 다른 사람의 작업을 덮어쓸 수 있습니다.
사용해야 한다면:
- 개인 브랜치에서만
--force-with-lease사용 (더 안전)- 팀원들에게 미리 알림
Q2. git pull vs git fetch의 차이는?
A:
git fetch: 원격 변경사항만 다운로드 (안전, 확인 가능)git pull: fetch + 자동 병합 (빠름, 충돌 가능)
초보자는 git pull 사용 권장, 고급 사용자는 git fetch 후 수동 병합
Q3. 충돌이 무서워요. 어떻게 피하나요?
A: 완전히 피할 순 없지만 최소화 가능:
- 자주 풀(pull)하기
- 작은 단위로 자주 커밋
- 같은 파일을 여러 명이 동시에 수정하지 않기
- Pull Request 사용
Q4. pull 전에 로컬 변경사항이 있으면?
A: 3가지 옵션:
- 커밋:
git commit -am "WIP"→git pull - 임시 저장:
git stash→git pull→git stash pop - 버리기:
git reset --hard(주의!)
실습 과제
과제 1: push와 pull 기본
- GitHub에 새 저장소 생성
- 로컬에서 클론
- 파일 추가 및 커밋
git push로 업로드- GitHub에서 파일 확인
과제 2: 충돌 해결
- 같은 파일을 로컬과 GitHub에서 각각 수정
git pull시도- 충돌 해결
- 커밋 및 푸시
과제 3: fetch와 pull 비교
git fetch로 원격 변경사항 확인git log origin/main..HEAD비교git merge origin/main으로 수동 병합git pull과 결과 비교
마무리
축하합니다! 원격 저장소와의 동기화를 마스터했습니다.
핵심 요약:
- ✅ git push: 로컬 커밋을 원격에 업로드
- ✅ git pull: 원격 변경사항을 로컬에 병합
- ✅ 충돌 해결:
git status→ 수정 →git add→git commit - ✅ 안전한 작업: 자주 pull, 작은 커밋, –force 피하기
다음 편에서는 실전 워크플로우를 배워보겠습니다!
📚 GitHub 마스터하기 시리즈
🌱 기초편 (입문자)
- GitHub 소개와 계정 만들기
- 프로필 꾸미기와 포트폴리오
- 보안 설정과 인증
- Repository 이해하기
- README 작성법
- .gitignore와 라이선스
- 첫 커밋과 관리
- git add와 commit
- git push와 pull 👉 현재 글
- 실전 워크플로우
- Branch 기본
- Merge와 Rebase
- 브랜치 전략
- Fork와 Clone
- Pull Request
💼 실전편 (중급자)
🚀 고급편 (전문가)
- GitHub Actions 입문
- Actions 고급 활용
- Webhooks와 API
- GitHub Apps 개발
- 보안 기능 활용
- Packages 레지스트리
- Codespaces 클라우드 개발
- GitHub CLI 마스터
- Insights와 Analytics
🏆 심화편 (전문가+)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
