원격 추적 브랜치란?
GitHub에서 협업을 진행하다 보면, 로컬과 원격 저장소의 상태를 동기화하는 것이 중요한데요. 이때 핵심 개념 중 하나가 바로 원격 추적 브랜치(remote tracking branch) 입니다. 아래에서는 원격 추적 브랜치가 무엇이며, 어떻게 생성되고 활용되는지 시각적인 예시와 함께 알아보겠습니다.
1. 저장소 클로닝 시 자동 생성
클론(복제) 과정
저장소를 처음 클론하면, Git은 로컬에 저장소의 파일과 커밋을 복제합니다. 이때 두 가지 주요 구성요소가 생성됩니다:
- 로컬 브랜치: 예를 들어
master
나main
과 같이 기본 브랜치가 생성됩니다. - 원격 추적 브랜치: 원격 저장소의 최신 상태를 가리키는 책갈피 역할을 하는 브랜치가 생성됩니다. 예를 들어
origin/master
또는origin/main
이 이에 해당합니다.
시각적 다이어그램
[원격 저장소: GitHub]
│
▼
[저장소 클론]
│
├── 로컬 브랜치 (예: master/main)
└── 원격 추적 브랜치 (예: origin/master or origin/main)
이 다이어그램처럼, 클론 후에는 로컬 브랜치와 원격 저장소의 마지막 상태를 기록하는 원격 추적 브랜치가 동시에 존재하게 됩니다.
2. 원격 추적 브랜치의 역할과 특징
원격 추적 브랜치는 다음과 같은 역할을 합니다:
- 상태 스냅샷 역할
원격 저장소와 마지막으로 통신한 시점의 상태를 기억하는 포인터(책갈피)입니다.- 예시: 로컬의
master
브랜치에서 여러 커밋을 추가해도,origin/master
는 마지막으로 확인한 원격 저장소의 상태를 그대로 유지합니다.
- 예시: 로컬의
- 비교 기준점 제공
로컬 브랜치와 원격 저장소 간의 차이를 쉽게 확인할 수 있도록 도와줍니다.- 활용:
git fetch
나git pull
명령을 사용할 때, 로컬 브랜치가 원격의 최신 상태와 어느 정도 차이가 나는지 비교할 수 있습니다.
- 활용:
- 자동 업데이트
직접 변경하지 않는 한 원격 추적 브랜치는 자동으로 업데이트되지 않습니다.- 업데이트 방법:
git fetch
명령을 실행하면 원격 저장소의 최신 상태로 갱신됩니다.
- 업데이트 방법:
시각적 예시 (책갈피 비유):
원격 저장소 (origin/main) ---> [책갈피] ---> 최신 커밋 상태
│
│ (로컬 작업 후)
▼
로컬 브랜치 (main) ---> (새로운 커밋 추가) ---> 최신 커밋보다 뒤처짐
이처럼, 원격 추적 브랜치는 로컬 브랜치와는 별도로 원격 저장소의 상태를 ‘기억’해두어, 두 상태의 차이를 확인할 수 있게 합니다.
3. 실제 예시: animals 저장소
실습 과정 예시:
- 저장소 생성 및 초기 커밋
- GitHub에서
animals
라는 이름의 저장소를 생성하고,pets.txt
파일을 추가하여 첫 커밋("pets.txt 파일 만들기")을 진행합니다. - 이때 GitHub의 기본 브랜치 이름은
main
입니다.
- GitHub에서
- 저장소 클론하기
로컬에서 다음 명령어를 실행합니다:- 클론 후 로컬에는
main
브랜치와 함께origin/main
이라는 원격 추적 브랜치가 자동 생성됩니다.
- 클론 후 로컬에는
git clone [animals 저장소 URL]
- 원격 추적 브랜치 확인하기
- 위 명령어를 실행하면
origin/main
이 표시됩니다. 이는 원격 저장소의main
브랜치가 가리키는 마지막 커밋 상태를 기억하는 포인터입니다.
- 위 명령어를 실행하면
git branch -r
시각적 요약:
GitHub 원격 저장소 (animals)
│
▼
[클론] ──────> 로컬 저장소 생성
│ ├─ 로컬 브랜치: main
│ └─ 원격 추적 브랜치: origin/main
이 예시를 통해, 클론 시 자동으로 생성되는 원격 추적 브랜치의 개념과 역할을 보다 명확하게 이해할 수 있습니다.
원격 추적 브랜치 확인하기
Git을 사용하여 원격 저장소와 협업할 때, 원격 추적 브랜치를 통해 로컬 저장소와 원격 저장소의 상태 차이를 쉽게 파악할 수 있습니다. 이번 섹션에서는 원격 추적 브랜치가 로컬 브랜치와 어떻게 다르게 작동하는지, 그리고 이를 확인하는 방법을 실습과 함께 알아보겠습니다.
1. 원격 추적 브랜치는 자동으로 갱신되지 않는다
Git 저장소를 클론하면, 로컬에는 기본 브랜치(예: main
)와 함께 원격 추적 브랜치(예: origin/main
)가 생성됩니다. 이때 origin/main
은 클론한 시점에서의 원격 저장소 상태를 가리킵니다. 하지만 중요한 점은, 로컬에서 새로운 커밋을 추가해도 원격 추적 브랜치는 자동으로 업데이트되지 않는다는 것입니다.
변경 전 상태 예시
origin/main -> C1 - C2 - C3 (원격 저장소의 상태)
main -> C1 - C2 - C3 (로컬 브랜치, 동일한 상태)
main
과origin/main
이 같은 커밋을 가리키고 있음.
이제 로컬에서 새로운 커밋을 추가하면, 로컬 브랜치는 업데이트되지만 origin/main
은 그대로 유지됩니다.
변경 후 상태
origin/main -> C1 - C2 - C3 (원격 저장소의 마지막 상태)
main -> C1 - C2 - C3 - C4 - C5 (로컬에서 새 커밋 추가)
main
이origin/main
보다 2개 앞선 상태가 됨.
이 상태에서 git status
를 입력하면 다음과 같이 표시됩니다.
$ git status
당신의 브랜치는 'origin/main'보다 2개 커밋만큼 앞서 있습니다.
이는 로컬에서 C4
, C5
라는 커밋이 추가되었지만, 아직 원격 저장소(origin/main
)에는 반영되지 않았음을 의미합니다.
2. 원격 추적 브랜치 목록 확인하기
현재 원격 추적 브랜치 목록을 확인하려면 다음 명령어를 사용합니다.
git branch -r
출력 예시:
origin/main
이 명령어를 실행하면 origin/main
과 같은 원격 추적 브랜치를 확인할 수 있습니다. 이 원격 추적 브랜치는 로컬 브랜치가 아니라, 마지막으로 원격 저장소와 동기화했을 때의 상태를 기억하는 참조입니다.
3. 원격 추적 브랜치와 로컬 브랜치 비교
로컬 브랜치와 원격 저장소의 상태를 비교하려면 git log
또는 git diff
명령어를 사용할 수 있습니다.
- 원격 추적 브랜치와 로컬 브랜치 간의 차이를 확인하는 명령어:이를 통해 로컬 브랜치(
main
)가 원격 브랜치(origin/main
)보다 얼마나 앞서거나 뒤쳐져 있는지 확인할 수 있습니다. git log --oneline --graph --decorate --all
- 원격과의 차이를 파일 단위로 확인하려면:이 명령어는 로컬
main
브랜치에서 변경된 내용을 원격 추적 브랜치인origin/main
과 비교하여 보여줍니다. git diff origin/main
4. 원격 추적 브랜치를 체크아웃하여 확인하기
가끔 "내가 마지막으로 원격과 동기화했을 때, 저장소 상태가 어땠을까?" 궁금할 수 있습니다. 이럴 때 원격 추적 브랜치를 직접 체크아웃하여 살펴볼 수 있습니다.
git checkout origin/main
그러면 분리된 HEAD(detached HEAD) 상태로 들어갑니다. 이는 현재 작업 중인 브랜치가 아닌 특정 커밋을 탐색하는 상태를 의미합니다.
체크아웃 전
main -> C1 - C2 - C3 - C4 - C5 (현재 브랜치)
origin/main -> C1 - C2 - C3 (원격 브랜치)
체크아웃 후
HEAD -> C1 - C2 - C3 (origin/main을 체크아웃한 상태)
이제 로컬에서 새로 추가한 C4
, C5
커밋이 보이지 않으며, 마지막으로 원격과 동기화했을 때의 상태를 확인할 수 있습니다.
만약 다시 원래의 main
브랜치로 돌아가려면 다음 명령어를 입력합니다.
git switch main
혹은 바로 이전 브랜치로 돌아가고 싶다면:
git switch -
5. 원격 추적 브랜치 업데이트하기
현재 원격 저장소에 새로운 변경 사항이 있는지 확인하고 싶다면 git fetch
를 사용합니다.
git fetch
이 명령어를 실행하면 원격 저장소의 최신 상태를 가져와 원격 추적 브랜치를 업데이트합니다. 하지만 로컬 브랜치는 그대로 유지되므로, 필요하면 git pull
을 사용해 동기화해야 합니다.
git pull origin main
이제 원격과 로컬 브랜치가 동일한 상태가 되었습니다.
$ git status
당신의 브랜치는 'origin/main'과 최신 상태입니다.
원격 추적 브랜치로 작업하기
원격 저장소에는 여러 개의 브랜치가 존재할 수 있습니다. 하지만 git clone
을 실행하면 기본 브랜치(예: main
또는 master
)만 로컬 브랜치로 설정되고, 나머지 브랜치는 원격 추적 브랜치로만 저장됩니다. 그렇다면 원격 저장소에 있는 특정 브랜치에서 작업하려면 어떻게 해야 할까요? 이번 섹션에서는 원격 브랜치로 전환하고 작업하는 방법을 살펴보겠습니다.
1. 클론 후 보이는 브랜치 확인하기
GitHub 저장소를 클론하면, 기본 브랜치 하나만 로컬 브랜치로 생성됩니다. 현재 로컬 브랜치를 확인하는 명령어는 다음과 같습니다.
git branch
출력 예시:
* main
이 경우, main
브랜치만 존재하며, 원격 저장소에 있는 다른 브랜치들은 표시되지 않습니다.
2. 원격 브랜치 확인하기
저장소에 존재하는 모든 원격 브랜치를 확인하려면 다음 명령어를 사용합니다.
git branch -r
출력 예시:
origin/main
origin/food
origin/movies
origin/fantasy
이 명령어를 실행하면 origin/main
, origin/food
, origin/movies
등 원격 저장소에서 관리하는 브랜치 목록이 출력됩니다. 하지만 이 브랜치들은 로컬 브랜치가 아니라, 원격 저장소 상태를 기록한 참조일 뿐입니다.
3. 원격 브랜치를 로컬 브랜치로 전환하기
원격 브랜치를 실제 로컬 브랜치로 가져오려면 git switch
명령어를 사용하면 됩니다.
✅ 방법 1: git switch
사용하기 (추천)
git switch movies
- 이 명령어를 실행하면, Git은
origin/movies
브랜치를 추적하는 새로운 로컬 브랜치를 생성합니다. - 즉,
movies
라는 로컬 브랜치가 만들어지고, 자동으로origin/movies
를 추적하도록 설정됩니다.
출력 예시
브랜치 'movies'를 'origin/movies'에서 생성 후 전환했습니다.
이제 git branch
를 실행하면 main
과 함께 movies
브랜치도 표시됩니다.
git branch
main
* movies
그리고 git status
를 실행하면 다음과 같이 원격 브랜치와 연결되었음을 확인할 수 있습니다.
$ git status
당신의 브랜치는 'origin/movies'와 최신 상태입니다.
✅ 방법 2: git checkout
을 사용하여 브랜치 생성하기 (구버전 방식)
Git 2.23 이전 버전에서는 git switch
명령이 없었기 때문에 git checkout
을 사용해야 했습니다.
git checkout -b movies origin/movies
- 이 명령어는
movies
라는 새로운 로컬 브랜치를 만든 후, 원격 추적 브랜치origin/movies
를 기준으로 생성합니다.
하지만 최신 Git에서는 git switch
를 사용하는 것이 더 간편하므로 이 방법보다는 git switch
를 추천합니다.
4. 원격 브랜치 내용을 확인하기 (분리된 HEAD 모드)
만약 특정 원격 브랜치가 어떻게 생겼는지 확인하고 싶다면, 해당 브랜치를 직접 체크아웃할 수도 있습니다.
git checkout origin/movies
하지만 이렇게 하면 분리된 HEAD(detached HEAD) 상태가 됩니다.
HEAD가 원격 브랜치 'origin/movies'로 이동했습니다.
이 상태에서는 새 커밋을 만들 경우 브랜치가 존재하지 않으므로, 변경 사항이 사라질 수 있습니다.
따라서 작업을 지속하려면 반드시 로컬 브랜치를 생성해야 합니다.
git switch -c movies
이제 movies
라는 로컬 브랜치가 생성되고, origin/movies
를 추적하게 됩니다.
5. 원격 브랜치에서 작업한 후 푸시하기
원격 브랜치에서 파일을 수정하고 커밋한 후, 변경 사항을 원격 저장소에 반영하려면 git push
를 실행해야 합니다.
✅ 파일 수정 및 커밋 예시
- 새로운 파일
phoenix.txt
를 추가하고 내용을 입력합니다.echo "불사조 아스키 아트" > phoenix.txt
- Git에 파일을 추가하고 커밋합니다.
git add phoenix.txt git commit -m "피닉스 추가"
- 현재
movies
브랜치는origin/movies
보다 한 개의 커밋만큼 앞서게 됩니다.
출력 예시:git status
당신의 브랜치는 'origin/movies'보다 1개 커밋 앞서 있습니다.
- 원격 저장소에 변경 사항을 푸시합니다.
이제 원격 저장소의git push origin movies
movies
브랜치에도phoenix.txt
가 추가되었습니다.
6. 정리: 원격 브랜치로 작업하는 과정
Git에서 원격 브랜치로 작업하는 기본적인 흐름은 다음과 같습니다.
🛠 로컬에 없는 원격 브랜치에서 작업하는 순서
- 원격 브랜치 목록 확인
git branch -r
- 원격 브랜치를 로컬 브랜치로 전환
git switch movies
- 파일 수정 및 커밋
echo "새로운 내용" > new_file.txt git add new_file.txt git commit -m "새 파일 추가"
- 변경 사항을 원격 저장소에 반영
git push origin movies
이제 원격 저장소와 동기화된 상태에서 브랜치 작업을 원활하게 수행할 수 있습니다.
Git Fetch 기초
Git을 사용하여 협업할 때, 다른 사람이 원격 저장소에 새로운 변경 사항을 추가하면 이를 로컬로 가져와야 합니다. 하지만 단순히 최신 변경 사항을 확인하고 싶을 때도 있고, 실제로 내 코드와 병합하고 싶을 때도 있습니다. 이때 Git Fetch와 Git Pull이 중요한 역할을 하게 됩니다. 이번 섹션에서는 git fetch
가 무엇인지, 어떻게 동작하는지 알아보겠습니다.
1. Git Fetch란?
Git Fetch는 원격 저장소의 최신 변경 사항을 가져오지만, 현재 작업 중인 파일(로컬 브랜치)에는 적용하지 않는 명령어입니다. 이를 통해 내가 작업하던 내용을 그대로 유지하면서도, 원격의 변경 사항을 확인할 수 있습니다.
✅ Git Fetch의 핵심 개념
- 원격 저장소의 변경 사항을 가져오지만, 로컬 브랜치를 변경하지 않음.
- 변경 사항은 원격 추적 브랜치(origin/브랜치명) 에 저장됨.
- 직접 병합하지 않기 때문에 작업 중인 파일을 망칠 위험이 없음.
2. Git Fetch의 동작 방식
다음은 git fetch
가 동작하는 방식입니다.
(1) 원격 저장소와 로컬 저장소의 초기 상태
우리는 master
브랜치에서 작업 중이며, origin/master
는 원격 저장소의 최신 상태를 가리키고 있습니다.
[ 원격 저장소 (GitHub) ]
origin/master -> C1 - C2 - C3
[ 로컬 저장소 ]
master -> C1 - C2 - C3
origin/master -> C1 - C2 - C3
이때 공동 작업자가 GitHub의 master
브랜치에 새로운 커밋을 추가했다고 가정해 봅시다.
[ 원격 저장소 (GitHub) ]
origin/master -> C1 - C2 - C3 - C4 - C5 - C6 (공동 작업자의 새로운 커밋)
[ 로컬 저장소 ]
master -> C1 - C2 - C3
origin/master -> C1 - C2 - C3
즉, 원격 저장소에는 새로운 커밋이 있지만, 내 로컬 저장소는 여전히 예전 상태를 유지하고 있습니다.
이제 git fetch
명령을 실행하면 어떻게 될까요?
3. Git Fetch 사용법
✅ 기본적인 Git Fetch 실행
git fetch
또는 원격 저장소를 명시적으로 지정할 수도 있습니다.
git fetch origin
위 명령을 실행하면 원격 저장소에서 최신 변경 사항을 다운로드합니다. 하지만 중요한 점은 로컬 master
브랜치는 그대로 남아 있으며, origin/master
만 업데이트된다는 것입니다.
[ 원격 저장소 (GitHub) ]
origin/master -> C1 - C2 - C3 - C4 - C5 - C6
[ 로컬 저장소 ]
master -> C1 - C2 - C3 (로컬 브랜치는 그대로)
origin/master -> C1 - C2 - C3 - C4 - C5 - C6 (업데이트됨)
✅ 특정 브랜치만 Fetch 하기
특정 브랜치의 변경 사항만 가져오고 싶다면 다음과 같이 실행할 수 있습니다.
git fetch origin master
이 명령어는 원격 저장소(origin
)의 master
브랜치만 업데이트합니다.
4. Git Fetch 결과 확인하기
git fetch
를 실행한 후, 원격 저장소와 비교하려면 다음과 같은 방법을 사용할 수 있습니다.
✅ 원격 추적 브랜치 목록 확인
git branch -r
이 명령어를 실행하면 원격 저장소의 브랜치 목록이 출력됩니다.
origin/master
origin/feature-branch
origin/hotfix
✅ 로컬 브랜치와 원격 브랜치 비교
로컬 브랜치와 원격 브랜치 간의 차이를 확인하려면 git log
명령어를 사용합니다.
git log --oneline master..origin/master
이 명령어를 실행하면 로컬 master
브랜치와 origin/master
브랜치의 차이점을 확인할 수 있습니다.
출력 예시:
a1b2c3d 새로운 기능 추가
d4e5f6 버그 수정
이는 원격 저장소에 반영된 새로운 변경 사항들입니다.
5. 원격 추적 브랜치에서 변경 사항 확인하기
git fetch
를 실행한 후, 원격 저장소의 최신 변경 사항을 직접 확인하려면 원격 추적 브랜치를 체크아웃할 수 있습니다.
git checkout origin/master
하지만 이렇게 하면 분리된 HEAD 상태(detached HEAD) 가 되므로, 변경 사항을 로컬 브랜치에서 작업하려면 새로운 브랜치를 생성해야 합니다.
git switch -c new-branch origin/master
이렇게 하면 origin/master
의 최신 상태를 반영한 새로운 로컬 브랜치(new-branch
)가 생성됩니다.
6. Git Fetch와 Git Pull의 차이
Git Fetch는 단순히 원격 저장소의 변경 사항을 가져오는 역할만 하지만, git pull
은 가져온 변경 사항을 자동으로 병합까지 합니다.
명령어 | 변경 사항 가져오기 | 로컬 브랜치 병합 |
---|---|---|
git fetch |
✅ (가져오기만 함) | ❌ (병합 안 함) |
git pull |
✅ (가져오기) | ✅ (병합) |
따라서 기본적으로 git fetch
를 먼저 실행하여 변경 사항을 확인한 후, 필요하면 git merge
를 실행하는 것이 더 안전한 작업 방식입니다.
git fetch
git merge origin/master
이렇게 하면 예상치 못한 충돌을 미리 방지할 수 있습니다.
7. Git Fetch의 활용
✅ 원격 저장소의 최신 변경 사항을 확인하고 싶을 때
✅ 로컬 작업을 유지하면서도 원격 상태를 확인할 때
✅ 충돌을 방지하기 위해 병합 전에 변경 사항을 미리 보고 싶을 때
Git Fetch 데모
앞서 Git Fetch의 개념과 작동 방식을 알아보았습니다. 이제 실제로 git fetch
를 사용하여 원격 저장소의 변경 사항을 가져오는 과정을 실습해 보겠습니다.
1. 원격 저장소에서 변경 사항이 생긴 상황 가정
Git을 사용할 때, 협업 환경에서는 다른 사람이 원격 저장소에 새로운 파일을 추가하거나 수정할 수 있습니다. 하지만 내 로컬 저장소는 자동으로 최신 상태를 유지하지 않기 때문에 Git Fetch를 통해 최신 정보를 가져와야 합니다.
✅ 상황 예시
- 현재
movies
브랜치에서 작업 중이며, 내 로컬 저장소는 최신 상태입니다. - 하지만 원격 저장소에서는 다른 개발자(밥 헤드)가 새로운 파일을 추가했습니다.
- 변경 사항을 가져오기 위해
git fetch
를 실행합니다.
[ 원격 저장소 (GitHub) ]
origin/movies -> C1 - C2 - C3 - C4 (팅커벨 추가됨)
[ 로컬 저장소 ]
movies -> C1 - C2 - C3
origin/movies -> C1 - C2 - C3 (로컬은 아직 모름)
2. Git Fetch 실행
로컬에서 movies
브랜치로 이동한 후, 변경 사항을 확인합니다.
git switch movies
git status
출력 예시:
당신의 브랜치는 'origin/movies'와 최신 상태입니다.
하지만 이는 로컬 저장소가 알고 있는 가장 최신 상태일 뿐, 실제 원격 저장소에 변화가 있었는지는 알 수 없습니다.
이를 확인하기 위해 Git Fetch를 실행합니다.
git fetch origin
출력 예시:
From github.com:user/repository
e3b0c4d..a1b2c3d movies -> origin/movies
이제 원격 저장소의 변경 사항이 로컬에 반영되었지만, 로컬 브랜치 자체는 여전히 이전 상태입니다.
3. Git Fetch 후 상태 확인
git status
출력 예시:
당신의 브랜치는 'origin/movies'보다 1 커밋만큼 뒤에 있습니다.
이제 git fetch
를 통해 원격 브랜치가 최신 커밋을 가리키도록 업데이트되었음을 확인할 수 있습니다.
하지만 여전히 내 movies
브랜치는 새로운 변경 사항을 포함하고 있지 않습니다.
이를 확인하기 위해 원격 추적 브랜치(origin/movies)의 상태를 직접 확인할 수도 있습니다.
git log --oneline origin/movies
출력 예시:
a1b2c3d 팅커벨 추가
e3b0c4d 이전 커밋
d4e5f6a 고스트버스터즈 추가
이제 원격 저장소에 팅커벨 아스키 아트가 추가된 새로운 커밋이 존재한다는 것을 알게 되었습니다.
4. 원격 추적 브랜치 확인 및 체크아웃
새로운 변경 사항을 직접 확인하고 싶다면, 원격 추적 브랜치를 체크아웃할 수도 있습니다.
git checkout origin/movies
이제 분리된 HEAD(detached HEAD) 상태가 됩니다.
$ git status
HEAD가 분리되었습니다. 현재 'origin/movies'를 따라가고 있습니다.
이 상태에서 파일을 확인해 보면, 새로 추가된 tinkerbell.txt
파일이 존재함을 알 수 있습니다.
ls
출력 예시:
bambi.txt
ghostbusters.txt
tinkerbell.txt
이처럼 git fetch
를 실행하면 원격 저장소의 최신 상태를 가져와 원격 추적 브랜치(origin/movies)를 업데이트하지만, 실제 로컬 브랜치(movies)에는 아무런 영향을 주지 않습니다.
즉, movies
브랜치는 여전히 이전 상태이며, 새로운 커밋을 적용하려면 git merge
또는 git pull
을 실행해야 합니다.
5. 특정 브랜치만 Fetch 하기
기본적으로 git fetch
는 원격 저장소의 모든 브랜치를 가져오지만, 특정 브랜치만 가져오도록 지정할 수도 있습니다.
git fetch origin movies
이 명령어를 실행하면 movies
브랜치에 대한 변경 사항만 가져오고, 다른 브랜치는 그대로 유지됩니다.
git status
출력 예시:
당신의 브랜치는 'origin/movies'보다 1 커밋만큼 뒤에 있습니다.
이는 git fetch
를 통해 로컬 저장소가 원격 저장소에서 어떤 변경이 발생했는지를 확인할 수 있도록 도와준다는 것을 의미합니다.
6. 새롭게 추가된 원격 브랜치 확인
GitHub에서 새로운 브랜치가 추가되었다면, git fetch
를 통해 이를 확인할 수도 있습니다.
git branch -r
출력 예시:
origin/main
origin/movies
origin/food
하지만 만약 새로운 브랜치 more-food
가 GitHub에서 생성되었다면, 내 로컬에서는 이를 아직 모릅니다.
git branch -r
출력 예시:
origin/main
origin/movies
origin/food
새로운 브랜치 정보를 가져오려면 다시 git fetch
를 실행해야 합니다.
git fetch
이제 git branch -r
을 실행하면 새로운 브랜치가 추가된 것을 확인할 수 있습니다.
출력 예시:
origin/main
origin/movies
origin/food
origin/more-food
이처럼 Git Fetch를 통해 원격 저장소의 최신 정보를 동기화할 수 있습니다.
하지만 이를 로컬에서 직접 사용하려면, git switch
로 해당 브랜치를 체크아웃해야 합니다.
git switch more-food
7. 정리
✅ Git Fetch는 원격 저장소에서 최신 변경 사항을 가져오지만, 로컬 브랜치에는 영향을 주지 않는다.
✅ 원격 추적 브랜치(origin/브랜치명)만 업데이트되므로, 변경 사항을 병합하려면 git merge
또는 git pull
이 필요하다.
✅ 새롭게 추가된 원격 브랜치를 확인하려면 git fetch
를 실행해야 한다.
✅ 특정 브랜치만 Fetch하려면 git fetch origin 브랜치명
을 사용한다.
Git Pull 기초
Git을 사용해 협업을 할 때, 원격 저장소에 있는 최신 변경 사항을 가져와야 합니다. 이때 사용할 수 있는 명령어가 git pull
입니다. 이전에 배운 git fetch
와 비슷하지만, git pull
은 변경 사항을 가져오는 것뿐만 아니라 자동으로 병합까지 수행한다는 점에서 차이가 있습니다.
1. Git Pull의 개념
✅ Git Pull은 두 가지 과정으로 이루어집니다.
- Fetch 단계
- 원격 저장소에서 최신 변경 사항을 가져옵니다.
- 예:
origin/master
,origin/feature
등의 원격 추적 브랜치가 업데이트됨.
- Merge 단계
- 가져온 변경 사항을 현재 로컬 브랜치와 병합합니다.
- 만약 변경 사항이 충돌하지 않는다면 자동으로 병합됩니다.
- 충돌이 발생하면 직접 해결해야 합니다.
✅ Git Pull vs Git Fetch
| 명령어 | 원격 변경 사항 가져오기 | 로컬 브랜치 병합 |
|--------------|----------------|----------------|
| git fetch
| ✅ (가져오기만 함) | ❌ (병합 안 함) |
| git pull
| ✅ (가져오기) | ✅ (자동 병합) |
즉, git pull
은 git fetch
+ git merge
가 결합된 명령어입니다.
2. Git Pull 사용법
Git Pull의 기본 구문은 다음과 같습니다.
git pull 원격저장소 브랜치
보통 원격 저장소 이름은 origin
이므로, 가장 많이 사용하는 형태는 다음과 같습니다.
git pull origin main
이 명령어를 실행하면:
origin/main
브랜치에서 최신 변경 사항을 가져옴.- 현재 내가 있는 브랜치(
main
)와 병합이 자동으로 수행됨.
3. Git Pull 실습 예시
✅ 1) 원격 저장소에서 변경 사항이 생긴 상황 가정
현재 로컬 movies
브랜치는 최신 상태입니다.
[ 원격 저장소 (GitHub) ]
origin/movies -> C1 - C2 - C3
[ 로컬 저장소 ]
movies -> C1 - C2 - C3
origin/movies -> C1 - C2 - C3
그런데, 공동 작업자(예: 밥 헤드)가 GitHub의 movies
브랜치에 새로운 커밋(C4, C5)을 추가했다고 가정해 봅시다.
[ 원격 저장소 (GitHub) ]
origin/movies -> C1 - C2 - C3 - C4 - C5 (새 커밋 추가됨)
[ 로컬 저장소 ]
movies -> C1 - C2 - C3 (아직 모름)
origin/movies -> C1 - C2 - C3 (페치 안 함)
✅ 2) Git Fetch vs Git Pull 실행 결과 비교
git fetch origin
- 원격 저장소의 최신 상태를 가져오지만, 로컬 브랜치에는 적용되지 않음.
origin/movies
는C5
까지 업데이트되지만,movies
브랜치는 여전히C3
에 머무름.
git pull origin movies
- 원격 저장소의 최신 상태를 가져오고, 로컬 브랜치에도 자동 병합됨.
movies
브랜치가C5
까지 업데이트됨.
결과:
[ 로컬 저장소 ]
movies -> C1 - C2 - C3 - C4 - C5 (자동 병합 완료)
origin/movies -> C1 - C2 - C3 - C4 - C5
✅ 3) Git Pull 실행하기
로컬 movies
브랜치에서 최신 변경 사항을 가져오려면 다음과 같이 실행합니다.
git pull origin movies
출력 예시:
Updating e3b0c4d..a1b2c3d
Fast-forward
tinkerbell.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 tinkerbell.txt
이제 로컬에도 tinkerbell.txt
파일이 생기며, GitHub와 동일한 상태가 되었습니다.
ls
출력:
bambi.txt
ghostbusters.txt
tinkerbell.txt (새로 추가됨)
즉, 원격의 최신 변경 사항을 내 로컬 저장소에 반영한 것입니다.
4. 새로운 브랜치에서 Git Pull 실행
✅ fantasy
브랜치에도 새로운 파일(cyclops.txt
)이 추가되었다고 가정해 봅시다.
git switch fantasy
git pull origin fantasy
출력 예시:
Updating e3b0c4d..a1b2c3d
Fast-forward
cyclops.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 cyclops.txt
이제 cyclops.txt
파일이 로컬 저장소에도 추가되었습니다.
5. Git Pull이 실패하는 경우: 병합 충돌
만약 로컬에서 수정한 파일이 원격 저장소에서도 변경되었다면, Git Pull을 실행할 때 충돌(merge conflict)이 발생할 수 있습니다.
git pull origin main
출력:
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
이런 경우, 수동으로 충돌을 해결한 후 다시 커밋해야 합니다.
6. Git Pull 정리
✅ Git Pull은 git fetch
+ git merge
를 합친 명령어이다.
✅ 원격 저장소에서 최신 변경 사항을 가져와 자동으로 병합한다.
✅ 페치한 변경 사항을 직접 병합하므로, 충돌이 발생할 수도 있다.
✅ 브랜치를 잘못 선택하면 원하지 않는 병합이 발생할 수 있으므로 주의해야 한다.
Git Pull 및 Merge 충돌
git pull
을 사용할 때, 원격 저장소의 변경 사항을 자동으로 병합하는 과정에서 병합 충돌(merge conflict) 이 발생할 수 있습니다. 이는 로컬에서 작업한 내용과 원격 저장소의 변경 사항이 동일한 파일을 수정했을 때 일어납니다. 이번 섹션에서는 git pull
을 실행할 때 충돌이 발생하는 원인과 이를 해결하는 방법을 알아보겠습니다.
1. Git Pull과 병합 충돌의 개념
✅ 병합 충돌이 발생하는 이유
- 로컬에서 수정한 파일이 원격 저장소에서도 변경되었을 때 발생.
- Git은 자동으로 병합할 수 없는 경우, 사용자가 직접 해결하도록 요청함.
- 충돌 해결 후에는
git add
와git commit
을 통해 해결 완료를 명시해야 함.
✅ 병합 충돌이 발생하는 시나리오
[ 로컬 저장소 ]
master -> C1 - C2 - C3 - C4 (내가 추가한 커밋)
[ 원격 저장소 (GitHub) ]
origin/master -> C1 - C2 - C3 - C5 - C6 (공동 작업자의 커밋)
- 내가
C4
커밋을 추가한 상태에서, 공동 작업자(밥 헤드)가C5
,C6
커밋을 추가하고 푸시함. - 내가
git pull origin master
를 실행하면, 원격의C5
,C6
을 병합해야 하는 상황 발생. - Git이 자동 병합할 수 없는 경우, 충돌 발생.
2. Git Pull 시 병합 충돌 발생 예시
✅ 1) 원격 저장소에서 변경 사항이 발생한 경우
현재 food
브랜치에서 작업 중이고, coffee.txt
파일을 수정했다고 가정해 봅시다.
- 공동 작업자(밥 헤드)가 원격 저장소에서
coffee.txt
를 수정하고 푸시함. - 내가 같은 파일을 로컬에서 수정한 후 커밋을 만듦.
- Git Pull을 실행하여 원격 저장소의 변경 사항을 가져옴.
- 충돌 발생! Git이 자동 병합을 할 수 없다고 경고함.
git pull origin food
출력:
Auto-merging coffee.txt
CONFLICT (content): Merge conflict in coffee.txt
Automatic merge failed; fix conflicts and then commit the result.
즉, coffee.txt 파일이 원격과 로컬에서 동시에 수정되었기 때문에, Git이 어떤 내용을 유지해야 할지 결정하지 못함.
이제 우리는 직접 충돌을 해결해야 합니다.
3. 병합 충돌 해결하기
충돌이 발생한 파일을 열어보면, Git이 아래와 같은 형식으로 충돌 부분을 표시합니다.
🔴 coffee.txt
파일 (충돌 발생)
<<<<<<< HEAD
(내가 로컬에서 추가한 커피 아트)
=======
(밥 헤드가 원격에서 추가한 커피 아트)
>>>>>>> origin/food
<<<<<<< HEAD
→ 로컬에서 추가한 내용=======
→ 구분선>>>>>>> origin/food
→ 원격 저장소에서 추가된 내용
✅ 1) 충돌 해결 방법
- 한쪽 변경 사항을 유지할 경우
원격(origin/food
) 또는 로컬(HEAD
) 중 하나를 삭제하고 남길 내용을 저장. - 두 변경 사항을 모두 유지할 경우
수동으로 수정하여 파일을 정리.
✅ 충돌 해결 후 수정된 coffee.txt
(내가 로컬에서 추가한 커피 아트)
(밥 헤드가 원격에서 추가한 커피 아트)
이제 충돌을 해결했으므로, Git에게 해결이 완료되었음을 알리기 위해 파일을 스테이징하고 커밋해야 합니다.
git add coffee.txt
git commit -m "병합 충돌 해결"
4. 병합 충돌 해결 후 원격 저장소에 푸시하기
이제 내 로컬 브랜치는 원격 브랜치와 비교했을 때 하나의 추가적인 커밋(충돌 해결 커밋)을 가지고 있습니다.
git status
출력 예시:
당신의 브랜치는 'origin/food'보다 1개 커밋만큼 앞서 있습니다.
이제 원격 저장소에 변경 사항을 푸시할 수 있습니다.
git push origin food
GitHub에서 coffee.txt
파일을 확인하면, 로컬과 원격의 변경 사항이 모두 유지된 것을 볼 수 있습니다.
5. 병합 충돌을 방지하는 방법
충돌이 발생하는 것을 예방하기 위해, 다음과 같은 Best Practice를 따르는 것이 좋습니다.
✅ 1) git pull
을 실행하기 전에 항상 현재 상태를 확인하기
git status
✅ 2) 원격 저장소의 변경 사항을 먼저 가져온 후 로컬에서 작업하기
git fetch origin
git merge origin/food
✅ 3) 병합 전에 변경 사항을 미리 확인하기
git diff origin/food
✅ 4) 충돌이 발생할 가능성이 있는 파일을 공동 작업자와 미리 조율하기
(예: 같은 파일을 동시에 수정하지 않도록 조정)
6. Git Pull과 Merge 충돌 정리
✅ Git Pull을 실행할 때, 로컬 변경 사항과 원격 변경 사항이 충돌하면 병합 충돌이 발생할 수 있다.
✅ Git은 충돌이 발생한 파일을 자동으로 표시해 주며, 사용자가 직접 해결해야 한다.
✅ 충돌 해결 후 git add
→ git commit
→ git push
를 실행해야 한다.
✅ 충돌을 방지하려면 git fetch
로 변경 사항을 미리 가져와 병합하는 것이 좋다.
Git Pull을 위한 더 짧은 구문
Git을 사용하다 보면, git pull
을 실행할 때마다 원격 저장소(origin
)와 브랜치 이름을 입력하는 것이 번거로울 수 있습니다. 다행히도 Git은 현재 브랜치의 추적 브랜치(Tracking Branch) 를 자동으로 인식하여, 더 짧은 구문으로 git pull
을 실행할 수 있도록 해줍니다.
1. Git Pull의 기본 구문과 추적 브랜치
기본적으로 git pull
의 전체 구문은 다음과 같습니다.
git pull 원격이름 브랜치이름
예를 들어, food
브랜치에서 최신 변경 사항을 가져오려면 다음과 같이 입력해야 합니다.
git pull origin food
이 명령어는 원격(origin
)에서 food
브랜치의 변경 사항을 가져와 현재 food
브랜치에 병합합니다.
그러나 Git에서는 특정 브랜치가 자동으로 원격 저장소의 같은 이름의 브랜치를 추적(Tracking) 하도록 설정됩니다. 따라서 food
브랜치에서 git pull
을 실행하면, Git은 origin/food
의 변경 사항을 가져올 것이라고 자동으로 예상합니다.
즉, 더 짧은 구문으로 실행할 수 있습니다.
git pull
이 명령어는 현재 브랜치가 자동으로 추적하는 원격 브랜치에서 변경 사항을 가져옵니다.
2. Git Pull의 동작 방식 (자동 추적 브랜치)
Git은 새로운 브랜치를 체크아웃(switch)할 때 자동으로 원격 브랜치를 추적하도록 설정합니다.
예를 들어, 원격 저장소에 fantasy
브랜치가 존재할 때, 다음과 같이 실행하면:
git switch fantasy
Git은 fantasy
브랜치가 자동으로 origin/fantasy
를 추적하도록 설정합니다.
이제 git pull
을 실행하면:
git pull
Git은 origin/fantasy
에서 변경 사항을 가져와 자동으로 병합합니다.
3. Git Pull의 짧은 구문 사용 예제
✅ 1) food
브랜치에서 변경 사항 가져오기
현재 food
브랜치에 있고, 원격의 최신 변경 사항을 가져오고 싶다면:
git pull origin food
대신에:
git pull
이렇게 짧은 구문으로 실행할 수 있습니다.
Git은 자동으로 다음과 같이 동작합니다:
- 현재 브랜치가
food
이므로,origin/food
의 최신 변경 사항을 가져옴. - 가져온 변경 사항을 현재
food
브랜치에 병합.
✅ 2) fantasy
브랜치에서 변경 사항 가져오기
GitHub의 fantasy
브랜치에서 새로운 파일(griffin.txt
)이 추가되었다고 가정해 보겠습니다.
1. Git Pull을 실행하기 전 상태
[ 로컬 저장소 ]
fantasy -> C1 - C2 - C3
origin/fantasy -> C1 - C2 - C3 - C4 (새 파일 griffin.txt 추가됨)
이제 fantasy
브랜치로 이동하고 git pull
을 실행합니다.
git switch fantasy
git pull
Git은 자동으로 origin/fantasy
의 변경 사항을 가져와 로컬 fantasy
브랜치에 병합합니다.
2. Git Pull 실행 후 상태
[ 로컬 저장소 ]
fantasy -> C1 - C2 - C3 - C4 (griffin.txt 추가됨)
origin/fantasy -> C1 - C2 - C3 - C4
파일 목록을 확인하면 griffin.txt
가 추가되었음을 확인할 수 있습니다.
ls
출력:
dragon.txt
centaur.txt
griffin.txt (새로 추가됨)
4. Git Pull이 동작하는 방식: 추적 브랜치(Tracking Branch)
Git이 자동으로 원격 브랜치를 추적하는 원리:
- 원격 저장소를 클론하면 기본 브랜치(
main
또는master
)가 자동으로 원격 브랜치를 추적. - 새 브랜치를
git switch
로 생성하면 원격 브랜치를 자동으로 추적. - 따라서
git pull
을 실행할 때origin
과 브랜치 이름을 생략해도 됨.
자동 추적 관계 예시:
[ 로컬 저장소 ]
main -> 추적하는 브랜치: origin/main
fantasy -> 추적하는 브랜치: origin/fantasy
food -> 추적하는 브랜치: origin/food
이제 각 브랜치에서 git pull
만 입력해도 자동으로 원격 브랜치의 변경 사항을 가져옴.
5. Git Pull이 짧은 구문으로 동작하지 않는 경우
git pull
이 짧은 구문으로 실행되지 않는 경우가 있을 수 있습니다.
❌ 1) 원격 브랜치를 추적하지 않는 경우
git pull
출력:
fatal: No upstream configured for branch 'feature'
이 경우, 브랜치가 원격을 추적하지 않기 때문입니다. 이를 해결하려면 추적 브랜치를 설정해야 합니다.
git branch --set-upstream-to=origin/feature feature
이제 git pull
을 짧은 구문으로 사용할 수 있습니다.
❌ 2) 원격 저장소가 여러 개인 경우
원격 저장소가 origin
외에 upstream
도 있는 경우, Git은 기본 원격을 origin
으로 설정하지만, 특정 원격에서 가져오려면 명시적으로 입력해야 합니다.
git pull upstream main
이처럼 기본 원격(origin
)이 아닌 곳에서 가져오려면 git pull origin main
처럼 전체 구문을 사용해야 합니다.
6. Git Fetch와 Pull 비교 정리
✅ Git Fetch
- 원격 저장소의 최신 변경 사항을 가져오지만, 병합하지 않음.
- 안전하게 실행할 수 있음.
- 이후
git merge
로 직접 병합할 수 있음.
✅ Git Pull
- 원격 저장소에서 변경 사항을 가져오고, 현재 브랜치에 자동으로 병합.
- 충돌이 발생할 수 있음.
- 기본적으로
git fetch
+git merge
의 조합.
시각적 비교
[ Git Fetch ]
원격 저장소 ─────────> 원격 추적 브랜치 (`origin/main`)
(로컬에는 적용되지 않음)
[ Git Pull ]
원격 저장소 ─────────> 원격 추적 브랜치 (`origin/main`) ─────────> 로컬 브랜치 (`main`)
(자동으로 병합됨)
7. Git Pull의 더 짧은 구문 정리
✅ 현재 브랜치가 원격 브랜치를 추적하고 있다면, git pull
만 입력하면 된다.
✅ Git은 자동으로 origin/현재브랜치
에서 변경 사항을 가져와 병합한다.
✅ 원격이 여러 개일 경우, git pull origin main
처럼 명시적으로 입력해야 한다.
✅ 만약 자동으로 추적되지 않는다면, git branch --set-upstream-to=origin/브랜치 브랜치
를 실행하여 설정 가능하다.
이제 우리는 Git Fetch와 Pull의 차이점을 이해하고, Git Pull을 더 간결한 구문으로 실행하는 방법을 익혔습니다.
이제 Git을 보다 효율적으로 사용할 수 있을 것입니다! 🚀
'강의 > Git & Github 실무 활용 완벽 가이드' 카테고리의 다른 글
Git 협업 워크플로우: 중앙 집중형 워크플로우와 Feature Branch Workflow (0) | 2025.03.12 |
---|---|
GitHub 기초: 협업에 필요한 정보들 (1) | 2025.03.12 |
GitHub 기본 개념과 실전 사용법 정리 (0) | 2025.02.12 |
Git 변경 사항 복구 완벽 정리: Checkout, Reset, Revert, Restore (0) | 2025.02.11 |
Git Stash: 변경 사항 임시 저장과 복원 (0) | 2025.02.05 |