포스트

[이제와서 시작하는 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

해결 방법:

  1. 🔍 충돌 파일 확인: git status
  2. 📝 파일 편집하여 충돌 해결
  3. ✅ 해결 후: git addgit commitgit 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가지 옵션:

  1. 커밋: git commit -am "WIP"git pull
  2. 임시 저장: git stashgit pullgit stash pop
  3. 버리기: git reset --hard (주의!)

실습 과제

과제 1: push와 pull 기본

  1. GitHub에 새 저장소 생성
  2. 로컬에서 클론
  3. 파일 추가 및 커밋
  4. git push로 업로드
  5. GitHub에서 파일 확인

과제 2: 충돌 해결

  1. 같은 파일을 로컬과 GitHub에서 각각 수정
  2. git pull 시도
  3. 충돌 해결
  4. 커밋 및 푸시

과제 3: fetch와 pull 비교

  1. git fetch로 원격 변경사항 확인
  2. git log origin/main..HEAD 비교
  3. git merge origin/main으로 수동 병합
  4. git pull과 결과 비교

마무리

축하합니다! 원격 저장소와의 동기화를 마스터했습니다.

핵심 요약:

  • git push: 로컬 커밋을 원격에 업로드
  • git pull: 원격 변경사항을 로컬에 병합
  • 충돌 해결: git status → 수정 → git addgit commit
  • 안전한 작업: 자주 pull, 작은 커밋, –force 피하기

다음 편에서는 실전 워크플로우를 배워보겠습니다!

📚 GitHub 마스터하기 시리즈

🌱 기초편 (입문자)

  1. GitHub 소개와 계정 만들기
  2. 프로필 꾸미기와 포트폴리오
  3. 보안 설정과 인증
  4. Repository 이해하기
  5. README 작성법
  6. .gitignore와 라이선스
  7. 첫 커밋과 관리
  8. git add와 commit
  9. git push와 pull 👉 현재 글
  10. 실전 워크플로우
  11. Branch 기본
  12. Merge와 Rebase
  13. 브랜치 전략
  14. Fork와 Clone
  15. Pull Request

💼 실전편 (중급자)

  1. Issues 활용법
  2. Projects와 칸반보드
  3. 코드 리뷰 실전
  4. Discussions 활용
  5. 팀 협업 전략
  6. GitHub Pages 블로그

🚀 고급편 (전문가)

  1. GitHub Actions 입문
  2. Actions 고급 활용
  3. Webhooks와 API
  4. GitHub Apps 개발
  5. 보안 기능 활용
  6. Packages 레지스트리
  7. Codespaces 클라우드 개발
  8. GitHub CLI 마스터
  9. Insights와 Analytics

🏆 심화편 (전문가+)

  1. Submodules와 Subtree
  2. Git Internals 이해
  3. 브랜칭과 릴리스 전략
  4. GraphQL API 활용
  5. GitHub Copilot 마스터
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.