Git Fetch로 원격 저장소 동기화

Git Fetch로 원격 저장소 동기화

Fetch란?

git fetch는 원격 저장소의 변경 사항을 로컬 저장소에 가져오는 명령어입니다.
이 과정에서 로컬 작업 브랜치에는 영향을 미치지 않고, 단순히 원격의 최신 상태를 로컬 저장소에 반영합니다.

Fetch의 주요 특징

원격 데이터 동기화

  • 원격 저장소의 최신 브랜치 정보와 커밋 기록을 로컬 저장소에 가져옵니다.
  • 실제로 로컬 작업 브랜치에는 아무런 변경이 발생하지 않습니다.

안전한 명령어

  • Fetch는 데이터의 변경 없이 단순히 정보를 가져오는 명령어이므로, 실수로 데이터를 잃거나 덮어쓰는 일이 없습니다.

git pull과의 차이점

  • git pull = git fetch + git merge
  • Fetch는 원격 데이터를 가져오기만 하고, Pull은 가져온 데이터를 로컬 브랜치에 병합합니다.

Fetch의 동작 방식

  • Fetch는 원격 저장소의 변경 사항을 원격 추적 브랜치(e.g., origin/main)에 업데이트합니다.
  • 로컬 브랜치(e.g., main)는 Fetch에 의해 변경되지 않습니다.

예시:

# 원격 저장소의 모든 브랜치를 가져옵니다.
git fetch origin
Fetching origin
From https://github.com/user/repo
   abc1234..def5678  main       -> origin/main
   1234567..789abcd  feature    -> origin/feature
  • 원격 저장소의 main 브랜치와 feature 브랜치의 변경 사항이 로컬에 반영됩니다.
  • 로컬의 main 브랜치는 영향을 받지 않으며, origin/main에만 최신 상태가 반영됩니다.
  • Fetch를 반복하는 경우, 이전 Fetch 정보는 덮어쓰여지며, Git은 각 Fetch 간의 상태를 따로 유지하지 않습니다.
  • Git은 Fetch 이전의 상태를 자동으로 추적하지 않으므로, 특정 Fetch 정보를 삭제하거나 되돌리는 기능은 없습니다.

Fetch 후 확인 방법

원격 브랜치 상태 확인

git log origin/main --oneline
  • Fetch로 가져온 origin/main 브랜치의 최신 커밋들을 확인합니다.

로컬 브랜치와 원격 브랜치 비교

git diff main origin/main
  • 로컬 브랜치와 Fetch로 가져온 원격 브랜치의 차이를 확인할 수 있습니다.

변경 사항 병합

  • Fetch 후 원격 브랜치의 변경 사항을 로컬 브랜치에 병합하려면:
git merge origin/main
  • 변경 사항을 로컬 브랜치에 반영합니다.

Fetch의 고급 사용법

특정 브랜치만 Fetch

git fetch origin feature-branch
  • 원격의 특정 브랜치만 가져옵니다.

Fetch와 Prune

git fetch --prune
  • 원격에서 삭제된 브랜치를 로컬에서도 삭제합니다.

태그 Fetch

git fetch --tags
  • 원격 저장소의 모든 태그를 가져옵니다.

Fetch와 관련된 질문 사항

Q1. Fetch 후 로컬 파일이 변경되나요?

아니요, git fetch는 원격의 변경 사항을 가져오기만 하고 로컬 파일에는 영향을 미치지 않습니다.
변경 사항을 적용하려면 Fetch 후 merge 또는 rebase를 실행해야 합니다.

Q2. Fetch 후 원격에서 A가 B로 변경되었거나 새로운 파일 C가 추가된 경우 로컬 상태는 어떻게 되나요?

상황

  • A라는 파일이 원격에서 B로 변경됨.
  • C라는 파일이 원격에서 새로 추가됨.

Fetch 후 상태

  • 로컬의 A 파일: 변경되지 않고, 여전히 A로 유지됩니다.
  • C 파일: 로컬 디렉터리에는 보이지 않습니다.
  • 원격 상태
    • origin/main에는 A → B로 변경된 상태와 C 추가가 반영됩니다.

로컬에서 확인 방법

  • Fetch 후, 원격 상태 확인:
git diff main origin/main
  • 변경 사항을 병합하려면:
git merge origin/main

Q3. Fetch와 Stash의 관계는?

fetch는 로컬 작업 브랜치에 영향을 미치지 않으므로, Stash가 필요하지는 않습니다.
다만, Fetch 후 mergepull을 실행할 경우 로컬 변경 사항과 충돌이 발생할 수 있습니다.
이때 로컬 변경 사항을 보호하려면 stash를 사용하세요:

git stash          # 변경 사항 임시 저장
git fetch          # 원격 데이터 가져오기
git merge origin/main  # 병합
git stash pop      # Stash 복원

Fetch 삭제 트리거

Fetch로 가져온 데이터는 Git 로컬 저장소의 일부로 저장됩니다.
로컬 저장소가 삭제되거나, prune 명령어를 실행하면 일부 데이터가 제거될 수 있습니다:

로컬 저장소 삭제

  • Fetch 데이터는 로컬 저장소에 종속적이므로, 저장소를 삭제하면 함께 사라집니다.

--prune 옵션 사용

  • 원격에서 삭제된 브랜치나 태그를 로컬에서 제거합니다.

Git 가비지 컬렉션 (GC)

  • 오래된 참조(30일 이상 업데이트되지 않은 데이터 등)가 삭제될 수 있습니다.