
1. 원격 저장소 vs 로컬 저장소
원격 저장소 (Remote Repository) = 공유 공간
- 서버에 호스팅된 Git 저장소 (ex. GitHub, GitLab, Bitbucket 등의 서비스가 이에 해당함)
- 이 저장소에는 여러 개발자가 협업할 수 있도록 공유된 브랜치와 커밋들이 포함되어 있음
- 'origin'은 보통 기본 원격 저장소의 이름으로 사용되며, 다른 사람의 컴퓨터나 서버에 접근할 수 있는 저장소임
로컬 저장소 (Local Repository) = 내 작업 공간
- 개인의 컴퓨터에 위치한 Git 저장소
- 이 저장소에는 작업하는 소스 코드, 브랜치, 커밋 기록 등을 포함
2. 원격 브랜치 vs 로컬 브랜치
원격 브랜치 (Remote Branch)
- 원격 저장소에 있는 브랜치
- 서버에 있는 브랜치
- ex. origin/main, origin/staging
로컬 브랜치 (Local Branch)
- 로컬 저장소에 있는 브랜치
- PC에서 작업하고 있는 브랜치
- ex. main, staging, feature
3. origin/main 브랜치 vs main 브랜치
origin/main
- 위치 : 로컬 저장소 내부의 원격 추적 브랜치
- 설명 : git fetch로 업데이트됨. 원격 서버에 있는 main 브랜치의 복사본
서버의 main 브랜치가 어떤 상태인지 알려주는 참고용 브랜치이다!
main
- 위치 : 로컬 브랜치
- 설명 : 내가 직접 커밋하거나 작업하는 브랜치
4. 기본 프로세스 흐름
[원격 저장소]
^ ^
push fetch/pull
v v
[로컬 저장소] <- rebase 등 로컬 브랜치 작업
5. 원격 변경사항을 로컬 브랜치에 반영하는 방법
origin/main -> main 에 반영하려면, merge or rebase 필요
merge 방식
git fetch origin
git checkout main
git merge origin/main
- 로컬 main 브랜치에 원격 변경사항을 병합
- 머지 커밋이 생길 수 있음 (히스토리 분기됨)
rebase 방식 (더 깔끔한 히스토리 구현)
git fetch origin
git checkout main
git rebase origin/main
- 로컬 main의 커밋들을 origin/main 위에 다시 쌓음
- 머지 커밋 없이 히스토리를 일자로 유지
6. git fetch
- 원격 저장소의 변경 사항을 로컬 저장소로 가져오는 명령어
- 원격 저장소의 최신 변경사항을 가져오기만 하고, 내 로컬 브랜치에는 적용하지 않음!
ex. git fetch origin
- 원격 저장소의 모든 브랜치 정보를 가져옴
- 원격 브랜치(ex. origin/main) 정보가 최신 정보로 업데이트됨
- 하지만, 내 로컬 브랜치(main)에는 아직 반영되지 않음!
장점
- git fetch를 통해,
원격과 내 브랜치가 얼마나 다른지 확인 가능
충돌없이 안전하게 원격 상태를 미리 볼 수 있음
7. git rebase
- 내 로컬 브랜치의 변경사항을, 다른 브랜치 위에 다시 적용해서 히스토리를 깔끔하게 유지하는 명령어
ex. git rebase origin/main
- 로컬의 현재 브랜치(ex. feature)를 원격의 origin/main 브랜치의 커밋을 기준으로 리베이스
- origin/main : 로컬의 origin 라는 이름을 가진 원격 브랜치를 가리키며, 원격의 상태를 참고
- 실행 직전 fetch를 하지 않았다면 origin/main 최신 상태가 아닐 수 있음!
이 경우, 리베이스 작업이 이전 상태 기준으로 실행될 수 있음
동작방식
- 1) 로컬 브랜치에서 내가 만든 커밋들을 떼어낸다.
- 2) origin/main 최신 커밋 위에 순서대로 다시 붙인다. (재적용)
8. 작업 순서
# 1. 원격 변경사항 가져오기 (최신 main 가져오기)
git fetch origin
# 2. rebase로 최신 main 위에 내 작업 재적용 (내 브랜치 최신화)
git rebase origin/main
# 3. 충돌 해결 후 계속
git rebase --continue
# 4. 다 끝났으면 원격에 push (강제해야 할 수도)
git push --force-with-lease
이점
- 커밋 로그가 깔끔하게 한 줄로 이어짐
- 머지 커밋 없이, 내 작업만 딱 올라감
- 협업 시 충돌 방지와 가독성 향상
9. fetch vs pull 차이점
- fetch : 원격 내용 가져오기만 함 / 자동병합 or 재배치 X
- pull : fetch + merge (or rebase) / 자동병합 or 재배치 O
# 아래 두 줄은 결국 같은 효과
git fetch origin
git merge origin/main
# 또는
git pull --rebase
10. 결론
- 원격 = 서버의 Git 저장소
- 로컬 = 내 PC의 Git 저장소
- 원격 브랜치 = 서버의 브랜치 (예: origin/main)
- 로컬 브랜치 = 내 PC의 브랜치 (예: main)
'origin'이라는 용어는 원격 저장소를 의미하는 것이 맞고, origin/main은 원격 저장소에 위치한 main 브랜치를 나타낸다.
git fetch origin 후에 origin/main 상태가 업데이트되었음을 확인한 후에야 git rebase origin/main 명령을 사용하여 안전하게 리베이스를 수행할 수 있다.