git fetch
git fetch
명령은 커밋, 파일 및 참조를 원격 리포지토리에서 로컬 리포지토리로 다운로드합니다. 가져오기는 다른 모든 팀원이 작업한 내용을 보고 싶을 때 수행하는 작업입니다. 중앙 기록이 어떻게 진행되었는지 볼 수 있다는 점에서 svn update
와 유사하지만 실제로 변경 사항을 리포지토리에 병합하지는 않습니다. Git은 가져온 콘텐츠를 기존 로컬 콘텐츠에서 분리하므로 로컬 개발 작업에는 전혀 영향을 미치지 않습니다. 가져온 콘텐츠는 git checkout 명령을 사용하여 명시적으로 체크아웃해야 합니다. 이를 통해 로컬 리포지토리와 통합하기 전에 커밋을 안전하게 검토할 수 있습니다.
원격 리포지토리에서 콘텐츠를 다운로드할 경우 git pull
및 git fetch
명령을 사용하여 작업을 수행할 수 있습니다. 두 명령 중에서 '안전한' 버전을 사용하고 싶다면 git fetch
를 고려해 볼 수 있습니다. 이 명령은 원격 콘텐츠를 다운로드하지만 로컬 리포지토리의 작업 상태를 업데이트하지 않고 현재 작업을 그대로 유지합니다. git pull
은 더 적극적인 대안으로, 활성 로컬 브랜치에 대한 원격 콘텐츠를 다운로드하고 즉시 git merge
를 실행하여 새로운 원격 콘텐츠에 대한 병합 커밋을 만듭니다. 보류 중인 변경 사항이 있으면 충돌이 발생해 병합 충돌 해결 흐름이 시작됩니다.
git fetch가 원격 브랜치와 작동하는 방식
git fetch
의 작동 방식을 더 잘 이해할 수 있도록 Git이 커밋을 구성하고 저장하는 방법에 대해 설명하겠습니다. 기본적인 원리는 Git이 리포지토리의 ./.git/objects
디렉터리에 모든 커밋을 로컬 및 원격으로 저장하는 것입니다. Git은 브랜치 참조를 사용하여 원격 및 로컬 브랜치 커밋을 명확하게 분리합니다. 로컬 브랜치 참조는 ./.git/refs/heads/
에 저장됩니다. git branch 명령을 실행하면 로컬 브랜치 참조 목록이 출력됩니다. 다음은 일부 데모 브랜치 이름이 있는 git branch
출력의 예시입니다.
git branch
main
feature1
debug2
/.git/refs/heads/
디렉터리 콘텐츠를 살펴보면 유사한 출력을 확인할 수 있습니다.
ls ./.git/refs/heads/
main
feature1
debug2
관련 자료
고급 Git 로그
솔루션 보기
Bitbucket Cloud에서 Git에 대해 알아보기
원격 브랜치는 다른 사용자 리포지토리의 커밋에 매핑된다는 점을 제외하면 로컬 브랜치와 동일합니다. 원격 브랜치는 로컬 브랜치와 혼동되지 않도록 속해 있는 원격 리포지토리에 의해 미리 고정되어 있습니다. Git은 로컬 브랜치처럼 원격 브랜치에 대한 참조도 있습니다. 원격 브랜치 참조는 ./.git/refs/remote/
디렉터리에 있습니다. 다음 예시 코드 조각은 간편하게 remote-repo라고 이름을 지정한 원격 리포지토리를 가져온 후에 표시되는 브랜치를 보여줍니다.
git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature
이 출력은 이전에 살펴본 로컬 브랜치를 표시하지만 이제는 origin/
이라는 접두사가 붙어 있습니다. 또한 이제는 remote-repo
라는 접두사가 붙은 원격 브랜치가 표시됩니다. 로컬 브랜치와 같은 원격 브랜치를 체크아웃할 수 있지만 분리된 HEAD
상태(이전 커밋에서 체크아웃하는 것처럼)가 됩니다. 읽기 전용 브랜치로 생각할 수 있습니다. 원격 브랜치를 보려면 git branch
명령에 -r
플래그를 포함하면 됩니다.
일반적인 git checkout
및 got log
명령을 사용하여 원격 브랜치를 검사할 수 있습니다. 원격 브랜치에 포함된 변경 사항을 승인하는 경우 일반적인 git merge
명령을 사용하여 변경 사항을 로컬 브랜치에 병합할 수 있습니다. 따라서 SVN과 달리 로컬 리포지토리를 원격 리포지토리에 동기화하는 방식은 가져오고 병합하는 2단계 절차입니다. git pull
명령을 실행하면 이 프로세스로 편리하게 빠르게 실행할 수 있습니다.
Git fetch 명령 및 옵션
git fetch <remote>
리포지토리에서 모든 브랜치를 가져옵니다. 또한 다른 리포지토리에서 필요한 커밋과 파일을 모두 다운로드합니다.
git fetch <remote> <branch>
위의 명령과 동일하지만 지정된 브랜치만 가져옵니다.
git fetch --all
등록된 모든 원격 리포지토리 및 브랜치를 가져오는 강력한 이동 명령입니다.
git fetch --dry-run
--dry-run
옵션은 명령에 대한 데모 실행을 수행합니다. 가져올 때 이 명령이 수행하는 작업의 예시를 출력하되 적용하지는 않겠습니다.
Git fetch 예제
원격 브랜치를 git 가져오기
다음 예시는 원격 브랜치를 가져오고 로컬 작업 상태를 원격 콘텐츠로 업데이트하는 방법을 보여줍니다. 이 예시에서는 git clone
명령을 사용하여 로컬 리포지토리에 복제한 중앙 리포지토리 origin이 있다고 가정하겠습니다. 또한 구성하고 가져올 feature_branch가 포함된 coworkers_repo라는 추가 원격 리포지토리가 있다고 가정하고, 이를 토대로 예시를 계속 진행하겠습니다.
먼저 git remote 명령을 사용하여 원격 리포지토리를 구성해야 합니다.
git remote add coworkers_repo git@bitbucket.org:coworker/coworkers_repo.git
여기에 리포지토리 URL을 사용하여 동료의 리포지토리에 대한 참조를 만들었습니다. 이제 그 원격 이름을 git fetch
에 전달하여 콘텐츠를 다운로드하겠습니다.
git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch
이제 coworkers/feature_branch의 콘텐츠가 로컬에 있으며 로컬 작업 복사본에 통합해야 합니다. git checkout 명령을 사용하여 새로 다운로드한 원격 브랜치를 체크아웃하는 이 프로세스를 시작합니다.
git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
이 체크아웃 작업의 출력에서 분리된 HEAD
상태에 있음을 알 수 있습니다. 이는 예상된 것이며 HEAD
참조가 로컬 기록의 시퀀스와 다른 참조를 가리키고 있음을 의미합니다. HEAD
가 coworkers/feature_branch 참조를 가리키기 때문에 참조에서 새로운 로컬 브랜치를 만들 수 있습니다. '분리된 HEAD
'의 출력은 git checkout
명령을 사용하여 이를 수행하는 방법을 보여줍니다.
git checkout -b local_feature_branch
여기에서 local_feature_branch라는 새로운 로컬 브랜치를 만들었으며, HEAD
가 최신 원격 콘텐츠를 가리키도록 업데이트하여 이 지점에서 개발을 계속할 수 있습니다.
git fetch로 origin 동기화
다음 예시는 로컬 리포지토리를 중앙 리포지토리의 main 브랜치와 동기화하는 일반적인 워크플로를 안내합니다.
git fetch origin
다음과 같이 다운로드한 브랜치를 표시합니다.
a1e8fb5..45e66a4 main -> origin/main
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature
아래 다이어그램에서는 이런 새로운 원격 브랜치의 커밋을 원이 아닌 사각형으로 표시했습니다. 확인하신 것처럼 git fetch
명령을 실행하면 다른 리포지토리의 전체 브랜치 구조에 액세스할 수 있습니다.
업스트림 main에 어떤 커밋이 추가되었는지 확인하려면 origin/main을 필터로 사용하여 git log
명령을 실행할 수 있습니다.
git log --oneline main..origin/main
다음 명령을 사용하여 변경 사항을 승인하고 로컬 main 브랜치에 병합합니다.
git checkout main
git log origin/main
다음으로 git merge origin/main
을 사용할 수 있습니다.
git merge origin/main
origin/main 및 main 브랜치는 이제 동일한 커밋을 가리키며 업스트림 개발과 동기화됩니다.
Git fetch 요약
검토에서 git fetch
는 원격 리포지토리에서 콘텐츠를 다운로드하는 데 사용하는 기본 명령입니다. git fetch
는 git remote
, git branch
, git checkout
및 git reset과 함께 사용하여 로컬 리포지토리를 원격 상태로 업데이트할 수 있습니다 git fetch
명령은 공동 작업 git 작업 흐름의 중요한 부분입니다. git fetch
는 git pull
과 비슷한 동작을 하지만 git fetch
가 더 안전하고 파괴적이지 않은 버전으로 간주될 수 있습니다.
이 문서 공유
다음 토픽
여러분께 도움을 드릴 자료를 추천합니다.
이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.