원격(remote)은 URL 이나 경로에 붙인 이름표입니다. 기본 이름은 origin 이고, clone 을 하면 git 이 자동으로 등록합니다. 원격 자체는 저장소가 아니라 "어디에 있는 저장소를 가리키는가" 하는 설정값입니다.
| 명령 | 동작 |
|---|---|
git remote -v |
등록된 원격 이름과 주소 목록 |
git remote add <이름> <경로> |
원격 추가 |
git remote rename <old> <new> |
이름 변경 |
git remote remove <이름> |
등록 해제 |
git remote set-url <이름> <경로> |
주소만 교체 |
remove 는 원격 저장소 자체를 지우지 않습니다. 내 저장소에 등록된 연결 정보만 지웁니다.
clone 이나 fetch 를 하면 원격의 브랜치가 origin/main 같은 원격 추적 브랜치(remote-tracking branch)로 내 저장소 안에 복사됩니다. 로컬 브랜치 main 과는 별개의 포인터입니다.
로컬 저장소
main (로컬 브랜치, 작업하는 대상)
└─ origin/main (원격 추적 브랜치, 마지막으로 통신한 결과의 스냅샷)
└─ origin 저장소의 main (진짜 원격, fetch 해야 갱신됨)origin/main 은 내가 직접 커밋하는 브랜치가 아닙니다. fetch 나 push 가 성공할 때만 git 이 자동으로 움직입니다.
git fetch 는 원격의 새 커밋을 받아 원격 추적 브랜치만 갱신합니다. 내 작업 트리와 로컬 브랜치는 그대로입니다. git pull 은 fetch 뒤에 병합(merge)까지 자동으로 실행하는 명령입니다.
| 명령 | fetch | 병합 | 작업 트리 변화 |
|---|---|---|---|
git fetch |
O | X | 없음 |
git pull |
O | O (merge) | 있음 |
git pull --rebase |
O | O (rebase) | 있음 |
git config pull.ff only 를 설정하면 pull 이 빨리 감기(fast-forward)만 허용합니다. 이력이 갈라졌으면 병합 대신 바로 실패해서, 뜻하지 않은 병합 커밋을 막아 줍니다.
로컬 브랜치가 어떤 원격 브랜치를 기본으로 주고받을지가 추적(tracking) 관계입니다.
| 방법 | 상황 |
|---|---|
git push -u origin main |
처음 push 하며 추적도 같이 설정 |
git branch --set-upstream-to=origin/main dev |
이미 있는 브랜치에 나중에 설정 |
git branch -vv |
브랜치별 추적 대상과 ahead·behind 확인 |
추적이 설정되면 git push, git pull 을 인자 없이 써도 됩니다.
push 는 로컬 브랜치의 커밋을 원격에 반영합니다. 원격에 내가 받지 않은 새 커밋이 있으면 non-fast-forward 로 거부됩니다. 다른 사람(또는 다른 작업 폴더)이 먼저 push 했다는 뜻입니다.
대처는 fetch 로 원격 변화를 받고 merge 나 rebase 로 내 커밋과 합친 뒤 다시 push 하는 것입니다. 절대 --force 로 밀어붙이지 않습니다.
--force 는 원격의 현재 상태를 무시하고 무조건 덮어씁니다. 그사이 동료가 올린 커밋이 있어도 통째로 사라집니다.
--force-with-lease 는 내가 마지막으로 안 원격 상태(원격 추적 브랜치)와 실제 원격이 같을 때만 덮어씁니다. 다르면 거부되어, 모르는 새 커밋을 지우는 사고를 막습니다.
git push origin --delete <브랜치> 로 원격 브랜치를, git push origin --delete <태그> 로 원격 태그를 지웁니다. 다른 사람 저장소에는 삭제된 원격 브랜치가 원격 추적 브랜치로 남아 있을 수 있습니다.
git fetch --prune 은 원격에서 없어진 브랜치의 원격 추적 브랜치를 로컬에서도 정리합니다.
| 옵션 | 효과 |
|---|---|
--branch <이름> |
특정 브랜치만 기본으로 받기 |
--depth 1 |
최근 커밋만 받는 얕은 클론 |
--bare |
작업 트리 없는 bare 저장소로 클론 |
로컬 경로를 원격으로 쓰면 git 이 하드링크로 최적화해서 --depth 를 무시합니다. 강제로 얕게 받으려면 --no-local 을 같이 씁니다.
bare 저장소는 작업 트리 없이 .git 내부 내용만 있는 저장소입니다. 사람이 파일을 편집하는 곳이 아니라 여러 사람이 push·fetch 를 주고받는 중계 지점입니다. git init --bare 로 만들고, 사내 서버에 두면 GitHub 없이도 팀 저장소 역할을 합니다.
| 주소 형식 | 예 | 인증 |
|---|---|---|
| ssh | git@서버:경로/repo.git |
ssh 키 |
| https | https://서버/경로/repo.git |
토큰, credential helper |
ssh 는 공개키를 서버에 등록해 두면 비밀번호 없이 접속합니다. https 는 매번 자격 증명이 필요한데, credential helper 가 이를 안전하게 저장해 재입력을 줄입니다. 폐쇄망에서는 사내 git 서버가 둘 중 하나를 사용합니다.
git bundle 은 저장소의 커밋·브랜치를 파일 하나에 담습니다. git archive 는 특정 시점의 소스 파일만 tar·zip 으로 뽑아, 이력 없이 배포할 때 씁니다.
포크 협업에서는 원격을 두 개 씁니다. origin 은 내가 push 하는 내 저장소, upstream 은 원본 저장소입니다. fetch upstream 으로 원본 변경을 받고, push origin 으로 내 저장소에만 올립니다.