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 후 merge
나 pull
을 실행할 경우 로컬 변경 사항과 충돌이 발생할 수 있습니다.
이때 로컬 변경 사항을 보호하려면 stash
를 사용하세요:
git stash # 변경 사항 임시 저장
git fetch # 원격 데이터 가져오기
git merge origin/main # 병합
git stash pop # Stash 복원
Fetch 삭제 트리거
Fetch로 가져온 데이터는 Git 로컬 저장소의 일부로 저장됩니다.
로컬 저장소가 삭제되거나, prune
명령어를 실행하면 일부 데이터가 제거될 수 있습니다:
로컬 저장소 삭제
- Fetch 데이터는 로컬 저장소에 종속적이므로, 저장소를 삭제하면 함께 사라집니다.
--prune
옵션 사용
- 원격에서 삭제된 브랜치나 태그를 로컬에서 제거합니다.
Git 가비지 컬렉션 (GC)
- 오래된 참조(30일 이상 업데이트되지 않은 데이터 등)가 삭제될 수 있습니다.