| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 상속
- kafka
- vue
- react
- SWIFT
- Kotlin
- javascript
- state
- AWS
- back-end
- 개발이 취미인 사람
- 코틀린
- 개발이취미인사람
- spring boot
- 반복문
- props
- jpa
- node.js
- Sequelize
- 조건문
- restful api
- front-end
- component
- java
- swagger
- 개발자
- It
- file upload
- Nest.js
- Producer
- Today
- Total
개발이 취미인 사람
[Git] - push, pull, fetch 명령어 이해 본문
개요
안녕하세요. 이번 시간에는 Git의 push, pull, fetch 명령어에 대해 알아보겠습니다. 원격 저장소와 로컬 저장소 간에 코드를 주고받는 핵심 명령어들입니다. 각 명령어의 차이점과 사용법을 실습과 함께 살펴보겠습니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.
- push, pull, fetch 개념

세 명령어는 로컬과 원격 저장소 간의 동기화를 담당합니다.
명령어 방향 설명
| push | 로컬 → 원격 | 내 커밋을 원격에 업로드 |
| fetch | 원격 → 로컬 | 원격 변경사항 가져오기 (병합 X) |
| pull | 원격 → 로컬 | fetch + merge (가져오고 병합) |
- git push
git push는 로컬 저장소의 커밋을 원격 저장소에 업로드합니다.
기본 사용법
# 기본 형식
git push <원격저장소> <브랜치>
# 예시: origin의 main 브랜치에 푸시
git push origin main
첫 번째 푸시 (-u 옵션)
# upstream 설정과 함께 푸시
git push -u origin main
# 이후부터는 간단하게
git push
-u (또는 --set-upstream) 옵션은 로컬 브랜치와 원격 브랜치를 연결합니다. 한 번 설정하면 이후 git push만 입력해도 됩니다.
다양한 push 옵션
# 기본 푸시
git push origin main
# 모든 브랜치 푸시
git push origin --all
# 태그 푸시
git push origin --tags
# 특정 태그 푸시
git push origin v1.0.0
# 강제 푸시 (주의!)
git push -f origin main
git push --force origin main
# 더 안전한 강제 푸시
git push --force-with-lease origin main
새 브랜치 푸시
# 로컬에서 브랜치 생성
git switch -c feature/login
# 작업 후 커밋
git add .
git commit -m "feat: 로그인 기능"
# 원격에 새 브랜치 푸시
git push -u origin feature/login
push 거부 상황

- git fetch
git fetch는 원격 저장소의 변경사항을 로컬로 가져오지만, 현재 작업 중인 브랜치에 병합하지 않습니다.
기본 사용법
# 기본 형식
git fetch <원격저장소>
# origin의 모든 브랜치 가져오기
git fetch origin
# 특정 브랜치만 가져오기
git fetch origin main
fetch 후 상태 확인
# fetch 실행
git fetch origin
# 출력 예시
remote: Counting objects: 3, done.
From https://github.com/username/repo
a1b2c3d..d4e5f6g main -> origin/main
# 로컬과 원격 차이 확인
git log main..origin/main --oneline
# 변경 내용 확인
git diff main origin/main
fetch vs pull 차이

fetch 활용 예시
# 1. 원격 변경사항 확인하고 싶을 때
git fetch origin
git log HEAD..origin/main --oneline
# 3개의 새 커밋 확인
# 2. 확인 후 병합 결정
git merge origin/main
# 또는 rebase
git rebase origin/main
- git pull
git pull은 fetch + merge를 한 번에 실행합니다. 원격의 변경사항을 가져와서 현재 브랜치에 병합합니다.
기본 사용법
# 기본 형식
git pull <원격저장소> <브랜치>
# origin의 main 브랜치 풀
git pull origin main
# upstream 설정된 경우
git pull
pull 옵션
# 기본 pull (merge 방식)
git pull origin main
# rebase 방식으로 pull
git pull --rebase origin main
# 충돌 시 자동 병합 전략
git pull --strategy-option theirs origin main # 원격 우선
git pull --strategy-option ours origin main # 로컬 우선
pull --rebase
일반 pull은 병합 커밋을 생성하지만, --rebase는 선형 히스토리를 유지합니다.
# 일반 pull
git pull origin main
# 결과: 병합 커밋 생성
# rebase pull
git pull --rebase origin main
# 결과: 내 커밋이 원격 커밋 위로 이동
# 기본값으로 설정
git config --global pull.rebase true
일반 pull 결과:
* Merge branch 'main' of origin
|\
| * 원격 커밋 B
| * 원격 커밋 A
* | 내 커밋 2
* | 내 커밋 1
|/
* 공통 조상
pull --rebase 결과:
* 내 커밋 2 (재생성)
* 내 커밋 1 (재생성)
* 원격 커밋 B
* 원격 커밋 A
* 공통 조상
pull 충돌 해결
# pull 시 충돌 발생
git pull origin main
# CONFLICT (content): Merge conflict in file.js
# 충돌 해결
# 1. 파일 수정
# 2. 스테이징
git add file.js
# 3. 커밋 (일반 pull)
git commit -m "merge: 충돌 해결"
# 3. 또는 rebase 계속 (--rebase 사용 시)
git rebase --continue
- 실전 워크플로우
일반적인 작업 흐름
# 1. 작업 시작 전 최신 코드 가져오기
git pull origin main
# 2. 브랜치 생성
git switch -c feature/new-feature
# 3. 작업 및 커밋
git add .
git commit -m "feat: 새 기능 추가"
# 4. 원격에 브랜치 푸시
git push -u origin feature/new-feature
# 5. (GitHub에서 PR 생성)
# 6. PR 병합 후 로컬 정리
git switch main
git pull origin main
git branch -d feature/new-feature
협업 시 동기화
# 팀원의 변경사항 확인
git fetch origin
# 변경사항 있는지 확인
git status
# Your branch is behind 'origin/main' by 3 commits
# 병합
git pull origin main
# 또는 rebase로 병합
git pull --rebase origin main
# 내 작업 푸시
git push origin main
장기 브랜치 동기화
# feature 브랜치에서 작업 중
git switch feature/long-task
# main의 최신 변경사항 가져오기
git fetch origin main
# 내 브랜치에 반영 (rebase 권장)
git rebase origin/main
# 또는 merge
git merge origin/main
# 충돌 해결 후 계속 작업
- 자주 발생하는 문제
문제 1: push 거부됨
# 오류
! [rejected] main -> main (non-fast-forward)
# 해결
git pull origin main # 먼저 pull
git push origin main # 다시 push
문제 2: pull 시 uncommitted changes 오류
# 오류
error: Your local changes would be overwritten by merge
# 해결 방법 1: 커밋하기
git add .
git commit -m "WIP: 작업 중"
git pull origin main
# 해결 방법 2: stash 사용
git stash
git pull origin main
git stash pop
문제 3: fetch 했는데 브랜치가 안보임
# 원격 브랜치 목록 확인
git branch -r
# 원격 브랜치 로컬에 체크아웃
git switch -c feature/login origin/feature/login
# 또는
git checkout --track origin/feature/login
문제 4: 강제 푸시 후 팀원 문제
# 내가 강제 푸시한 경우, 팀원은:
git fetch origin
git reset --hard origin/main
# 주의: 팀원의 로컬 변경사항이 사라짐!
- 명령어 비교 정리
# PUSH: 로컬 → 원격
git push origin main # 기본
git push -u origin main # upstream 설정
git push --force origin main # 강제 (주의!)
git push origin --all # 모든 브랜치
git push origin --tags # 모든 태그
# FETCH: 원격 → 로컬 (병합 X)
git fetch origin # 모든 브랜치
git fetch origin main # 특정 브랜치
git fetch --all # 모든 원격 저장소
# PULL: 원격 → 로컬 (fetch + merge)
git pull origin main # 기본 (merge)
git pull --rebase origin main # rebase 방식
git pull # upstream 설정된 경우
- 언제 무엇을 사용할까?
상황 명령어
| 내 작업을 공유하고 싶을 때 | git push |
| 원격 변경사항을 확인만 하고 싶을 때 | git fetch |
| 원격 변경사항을 바로 적용하고 싶을 때 | git pull |
| 히스토리를 깔끔하게 유지하고 싶을 때 | git pull --rebase |
| PR 전 최신 상태 동기화 | git fetch + git rebase |
마무리
이번 시간에는 push, pull, fetch 명령어에 대해 알아봤습니다. 세 명령어는 원격 저장소와 협업할 때 필수적으로 사용됩니다. fetch는 안전하게 확인만, pull은 바로 병합, push는 내 작업을 업로드한다고 기억하시면 됩니다. 특히 pull --rebase는 깔끔한 히스토리 관리에 유용하니 활용해보세요.
다음 시간에는 Clone vs Fork 차이점에 대해 알아보겠습니다.
참고 자료
'컴퓨터공학 > Git' 카테고리의 다른 글
| [Git] - Pull Request(PR) / Merge Request(MR) 작성법 (0) | 2025.12.25 |
|---|---|
| [Git] - Clone vs Fork 차이점 (0) | 2025.12.24 |
| [Git] - 충돌(Conflict) 해결 방법 (0) | 2025.12.22 |
| [Git] - Rebase vs Merge 차이점 (0) | 2025.12.21 |
| [Git] - 브랜치 병합(Merge) 방법 (0) | 2025.12.20 |