개발이 취미인 사람

[Git] - push, pull, fetch 명령어 이해 본문

컴퓨터공학/Git

[Git] - push, pull, fetch 명령어 이해

RyanSin 2025. 12. 23. 20:00
반응형

개요

안녕하세요. 이번 시간에는 Git의 push, pull, fetch 명령어에 대해 알아보겠습니다. 원격 저장소와 로컬 저장소 간에 코드를 주고받는 핵심 명령어들입니다. 각 명령어의 차이점과 사용법을 실습과 함께 살펴보겠습니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.

 

[Git] - 충돌(Conflict) 해결 방법

- 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 차이점에 대해 알아보겠습니다.


참고 자료