git push로 로컬 커밋을 원격에 업로드, git pull로 원격 변경 사항 내려받기, git fetch의 역할, 추적 브랜치(tracking branch) 개념, push 거부 시 해결법, 팀 협업의 일상 동기화 패턴을 완전히 익힙니다.
🎯 학습 목표
이 강을 마치면 다음을 할 수 있습니다.
git push로 로컬 커밋을 GitHub 원격 저장소에 업로드할 수 있습니다.git pull로 원격의 변경 사항을 로컬로 내려받아 병합할 수 있습니다.git fetch와git pull의 차이를 이해하고 상황에 맞게 선택할 수 있습니다.- push가 거부될 때 원인을 파악하고 해결할 수 있습니다.
- 추적 브랜치(tracking branch)의 개념을 이해합니다.
📤 git push — 로컬을 원격으로 업로드
이 섹션에서는 로컬의 커밋을 GitHub 원격 저장소에 올리는 git push의 동작 방식과 다양한 사용법을 살펴보겠습니다.
push는 로컬 저장소의 새 커밋들을 원격 저장소로 보내는 명령어입니다. 내 작업을 GitHub에 반영하고, 팀원이 볼 수 있게 공유합니다.
# 기본 push (추적 브랜치가 설정된 경우)
git push
# 특정 원격·브랜치 지정해서 push
git push origin main
# 처음 push 시 추적 브랜치 설정 + push
git push -u origin main
# -u (--set-upstream): 이후부터 'git push'만 입력해도 origin/main으로 자동 push
# 새 로컬 브랜치를 원격에 처음 올리기
git push -u origin feature/login
# 출력 예시:
# Enumerating objects: 5, done.
# Counting objects: 100% (5/5), done.
# Writing objects: 100% (3/3), 293 bytes | 293.00 KiB/s, done.
# To github.com:username/my-project.git
# a1b2c3d..d4e5f6g main -> main
push 후 GitHub 페이지를 새로고침하면 새 커밋이 반영된 것을 확인할 수 있습니다. 파일 목록 상단에 가장 최근 커밋 메시지와 시간이 표시됩니다.
📥 git pull — 원격을 로컬로 내려받기
이 섹션에서는 팀원이 push한 변경 사항이나 다른 컴퓨터에서 작업한 내용을 로컬로 가져오는 git pull을 살펴보겠습니다.
pull은 원격 저장소의 변경 사항을 로컬로 가져와 현재 브랜치에 병합합니다. pull은 사실 두 명령의 합성입니다.
# git pull = git fetch + git merge
git pull
# 특정 원격·브랜치를 pull
git pull origin main
# pull 전 현재 상태 확인 (항상 좋은 습관)
git status
git log --oneline -5
# pull 후 변경 사항 확인
git log --oneline -5
pull을 실행하면 내부적으로 다음 두 단계가 순서대로 실행됩니다.
- fetch: 원격의 최신 정보를 로컬의 원격 추적 브랜치(
origin/main)에 업데이트 - merge: 원격 추적 브랜치(
origin/main)를 현재 로컬 브랜치(main)에 병합
pull도 merge이므로, 로컬과 원격이 같은 파일의 같은 줄을 수정했다면 충돌이 발생합니다. 9강에서 배운 충돌 해결 방법으로 동일하게 해결합니다.
🔄 git fetch — 조심스러운 동기화
이 섹션에서는 병합 없이 원격 정보만 가져오는 git fetch의 역할과 pull 대신 fetch를 선호하는 상황을 살펴보겠습니다.
git fetch는 원격의 최신 정보를 로컬로 가져오되, 현재 작업 중인 브랜치에는 영향을 주지 않습니다. 원격에 무엇이 바뀌었는지 먼저 확인한 후 직접 결정하고 싶을 때 사용합니다.
# 원격 정보만 가져오기 (현재 브랜치에 영향 없음)
git fetch origin
# fetch 후 차이 확인
git log --oneline main..origin/main
# 이 출력이 원격에는 있지만 로컬에는 없는 커밋 목록
git diff main origin/main
# 실제 코드 변경 내용 비교
# 확인 후 수동으로 병합
git merge origin/main
| 명령어 | 동작 | 현재 브랜치 영향 | 사용 상황 |
|---|---|---|---|
git fetch |
원격 정보 가져오기만 | 없음 | 먼저 확인 후 결정하고 싶을 때 |
git pull |
fetch + merge | 있음 (자동 병합) | 바로 동기화하고 싶을 때 |
🚫 push 거부 — 해결 방법
이 섹션에서는 push가 거부되는 상황의 원인과 안전하게 해결하는 방법을 살펴보겠습니다.
push를 시도했을 때 다음과 같은 오류가 발생할 수 있습니다.
# push 거부 오류 메시지 예시
git push
# To github.com:username/my-project.git
# ! [rejected] main -> main (fetch first)
# error: failed to push some refs to 'github.com:username/my-project.git'
# hint: Updates were rejected because the remote contains work that you do
# hint: not have locally. Integrate the remote changes (e.g.
# hint: 'git pull ...') before pushing again.
이 오류의 원인은 "원격 저장소에 내 로컬에 없는 새 커밋이 있다"는 것입니다. 다른 팀원이 먼저 push했거나, 다른 컴퓨터에서 작업한 경우입니다. 해결 방법은 먼저 pull로 원격 변경을 받아온 후 push하는 것입니다.
# 해결 방법: 먼저 pull, 충돌 해결, 그 다음 push
git pull origin main # 원격 변경 가져오기 (충돌이면 해결)
git push # 이제 push 가능
# 더 안전한 방법: fetch 후 상황 파악, 그 다음 결정
git fetch origin
git log --oneline main..origin/main # 원격에 있는 새 커밋 확인
git merge origin/main # 병합
git push
절대 하면 안 되는 것: git push --force (강제 push)는 원격 저장소의 히스토리를 덮어쓰므로 팀원의 작업을 날려버릴 수 있습니다. 개인 브랜치가 아닌 공유 브랜치(main)에 force push는 금지입니다.
📌 추적 브랜치(Tracking Branch) 이해
이 섹션에서는 로컬 브랜치와 원격 브랜치 사이의 추적 관계가 무엇인지, 그리고 어떻게 활용하는지 살펴보겠습니다.
추적 브랜치는 원격 브랜치를 참조하는 로컬의 포인터입니다. 예를 들어 origin/main은 GitHub의 main 브랜치를 가리킵니다. git fetch나 git pull을 실행하면 이 추적 브랜치가 업데이트됩니다.
# 모든 브랜치 (로컬 + 원격 추적) 확인
git branch -a
# * main (현재 로컬 브랜치)
# feature/login (다른 로컬 브랜치)
# remotes/origin/main (원격 추적 브랜치)
# remotes/origin/feature/login
# 추적 관계 확인
git branch -vv
# * main a1b2c3d [origin/main] feat: 최근 커밋
# ↑ origin/main을 추적 중
# 원격 브랜치를 로컬로 가져와 추적 설정
git switch --track origin/feature-login
# 이후 git push, git pull이 자동으로 origin/feature-login과 동기화
🔁 일상적인 협업 사이클
이 섹션에서는 팀 협업에서 매일 반복하는 실전 동기화 패턴을 살펴보겠습니다.
팀 협업에서의 일반적인 하루 시작 패턴입니다.
# 1. 작업 시작 — 먼저 최신 상태로 업데이트
git switch main
git pull # 팀원이 올린 최신 내용 받기
# 2. 기능 브랜치 생성 및 작업
git switch -c feature/my-task
# ... 작업 ...
git add .
git commit -m "feat: 작업 내용"
# 3. 작업 중간중간 원격에 올리기 (백업 겸 공유)
git push -u origin feature/my-task
# 4. 추가 작업 후 다시 push
# ... 더 작업 ...
git commit -m "feat: 추가 작업"
git push # -u 설정 이후로 간단하게
# 5. main 최신 상태를 feature 브랜치에도 반영
git merge main # main의 최신 내용을 feature에 병합
git push # 업데이트된 상태를 원격에도 반영
📝 핵심 요약
11강에서 배운 내용을 정리해 보겠습니다.
# 오늘의 핵심 명령어
git push # 로컬 커밋을 원격으로 업로드
git push -u origin 브랜치명 # 최초 push + 추적 설정
git pull # 원격 변경 사항 가져와 병합
git fetch # 병합 없이 원격 정보만 업데이트
git branch -a # 로컬 + 원격 브랜치 전체 조회
git branch -vv # 추적 브랜치 정보 포함 조회
push 거부 시 해결 순서: git pull → 충돌 해결 → git push
다음 강인 12강 — Pull Request에서는 GitHub 협업의 핵심 기능인 Pull Request(PR)를 배웁니다. 코드 리뷰 요청, 토론, 수정, 최종 승인까지의 워크플로는 현대 소프트웨어 팀이 코드 품질을 유지하는 방식의 핵심입니다!
관련 주제
- git push
- git pull
- git fetch
- 추적 브랜치
- push 거부 해결
- git push -u
- 개발·프로그래밍
- 개발·프로그래밍 강의
- 깃허브 사용법 18강 — Git & GitHub 협업
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
깃허브 사용법 18강 — Git & GitHub 협업
이 강의가 속한 시리즈는 총 12강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
