Close

git fetch

git fetch 명령은 커밋, 파일 및 참조를 원격 리포지토리에서 로컬 리포지토리로 다운로드합니다. 가져오기는 다른 모든 팀원이 작업한 내용을 보고 싶을 때 수행하는 작업입니다. 중앙 기록이 어떻게 진행되었는지 볼 수 있다는 점에서 svn update와 유사하지만 실제로 변경 사항을 리포지토리에 병합하지는 않습니다. Git은 가져온 콘텐츠를 기존 로컬 콘텐츠에서 분리하므로 로컬 개발 작업에는 전혀 영향을 미치지 않습니다. 가져온 콘텐츠는 git checkout 명령을 사용하여 명시적으로 체크아웃해야 합니다. 이를 통해 로컬 리포지토리와 통합하기 전에 커밋을 안전하게 검토할 수 있습니다.

원격 리포지토리에서 콘텐츠를 다운로드할 경우 git pullgit 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 로고
솔루션 보기

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 checkoutgot 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 명령을 실행하면 다른 리포지토리의 전체 브랜치 구조에 액세스할 수 있습니다.

origin에서 main 브랜치까지의 다이어그램

업스트림 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 fetchgit remote, git branch, git checkoutgit reset과 함께 사용하여 로컬 리포지토리를 원격 상태로 업데이트할 수 있습니다 git fetch 명령은 공동 작업 git 작업 흐름의 중요한 부분입니다. git fetchgit pull과 비슷한 동작을 하지만 git fetch가 더 안전하고 파괴적이지 않은 버전으로 간주될 수 있습니다.


이 문서 공유
다음 토픽

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up