GitHub 저장소는 내 컴퓨터의 로컬 저장소와 별개의 복사본입니다. 둘은 원격(remote)이라는 별명으로 연결되고 push·fetch·pull 로 데이터를 주고받습니다.
[내 컴퓨터] [GitHub]
작업 트리
로컬 저장소(.git) --- push ---> 원격 저장소(origin)
<-- fetch --- github.com/kim/study.git로컬에서 커밋을 아무리 쌓아도 push 전까지는 GitHub 에 아무것도 올라가지 않습니다. 이 점이 SVN 같은 중앙집중식 도구와 가장 다른 부분입니다.
GitHub 계정은 개인 계정과 Organization 두 종류입니다. 회사·오픈소스 프로젝트는 보통 Organization 아래 저장소를 모아 둡니다.
| 구분 | 설명 |
|---|---|
| 개인 계정 | 가입 시 만드는 기본 계정, 저장소 소유자 |
| Organization | 여러 사람이 저장소를 함께 쓰는 조직 계정 |
| Collaborator | 저장소 단위로 초대하는 참여자 |
| Team | Organization 안에서 권한을 묶는 단위 |
개인 프로젝트는 개인 계정 아래 저장소를 만들면 충분합니다. 팀 프로젝트는 Organization 을 만들고 그 아래 저장소를 두는 편이 권한 관리가 쉽습니다.
HTTPS 로 push·clone 할 때는 비밀번호 대신 개인용 액세스 토큰(PAT, Personal Access Token)을 씁니다. GitHub 는 2021 년부터 계정 비밀번호로 인증하는 방식을 막았습니다.
PAT 는 GitHub 웹 화면의 Settings → Developer settings → Personal access tokens 에서 발급합니다. 발급 시 권한 범위(scope)와 만료 기간을 지정하고, 토큰 문자열은 그 화면을 벗어나면 다시 볼 수 없습니다. 이후 인증 요청에 사용자명과 토큰을 비밀번호 자리에 입력합니다.
SSH 키는 매번 토큰을 입력하지 않고도 인증하는 방식입니다. 공개키(public key)는 GitHub 계정에 등록하고 개인키(private key)는 내 컴퓨터에만 둡니다.
ssh-keygen -t ed25519 -C "[email protected]"-t ed25519 는 최신 권장 알고리즘이고, -C 뒤 문자열은 키를 구분하는 주석입니다. 별도 경로를 지정하지 않으면 ~/.ssh/id_ed25519 와 ~/.ssh/id_ed25519.pub 두 파일이 생깁니다.
생성한 공개키(id_ed25519.pub) 내용을 복사해 GitHub Settings → SSH and GPG keys → New SSH key 화면에 붙여 넣으면 등록이 끝납니다. 개인키는 절대 붙여 넣지 않습니다.
여러 계정이나 여러 서버를 쓸 때는 ~/.ssh/config 로 호스트별 설정을 나눕니다. 구체적인 파일 내용은 예제 1 에서 그대로 확인할 수 있습니다.
IdentitiesOnly yes 는 여러 키가 있을 때 지정한 키만 쓰도록 강제하는 옵션입니다. 이 설정이 없으면 ssh 가 다른 키부터 시도하다 인증에 실패하기도 합니다.
키 등록 뒤에는 ssh -T [email protected] 으로 연결을 확인합니다. 정상이면 아래와 같은 인사말이 뜨고 셸 자체는 열리지 않습니다.
Hi kim! You've successfully authenticated, but GitHub does not provide shell access.이 명령은 인터넷 접근이 필요해 이 레슨의 실행 데모에는 포함하지 않았습니다. 첫 연결 시에는 호스트 지문(fingerprint)을 신뢰할지 묻는 확인 창도 함께 뜹니다.
GitHub 웹의 New repository 화면에서 이름과 공개 범위를 정하고, README·.gitignore·LICENSE 초기화 여부를 선택합니다.
| 옵션 | 켜면 생기는 일 |
|---|---|
| Add a README file | 첫 커밋으로 README.md 생성 |
| Add .gitignore | 언어별 무시 목록 커밋 |
| Choose a license | LICENSE 파일 커밋 |
하나라도 켜면 저장소가 커밋이 있는 상태로 만들어집니다. 반대로 모두 끄면 완전히 빈 저장소가 만들어지고, 이 경우에는 로컬에서 파일을 만들어 첫 push 로 채워야 합니다.
이미 로컬에 있는 프로젝트를 GitHub 에 올릴 때는 빈 저장소를 만든 뒤 원격으로 등록합니다.
git init -b main
git add .
git commit -m "커밋1: 첫 커밋"
git remote add origin <저장소 주소>
git push -u origin main-u(--set-upstream)는 로컬 main 과 원격 origin/main 을 추적 관계로 묶습니다. 이후에는 git push·git pull 만으로 같은 브랜치를 주고받습니다.
이미 존재하는 저장소를 내려받을 때는 git clone 한 번으로 원격 등록까지 끝납니다.
git clone <저장소 주소> [폴더명]clone 은 전체 커밋 이력과 브랜치 정보를 함께 받고, origin 이라는 이름으로 원격을 자동 등록합니다. 폴더명을 생략하면 저장소 이름과 같은 폴더가 생깁니다.
주소 형식을 HTTPS 에서 SSH 로, 또는 그 반대로 바꿀 때는 다시 clone 할 필요 없이 remote set-url 만 쓰면 됩니다.
git remote set-url origin [email protected]:kim/study.git로컬 커밋 이력은 그대로 두고 다음 push·fetch 부터 새 주소를 씁니다. 인증 방식을 HTTPS 토큰에서 SSH 키로 바꿀 때 자주 씁니다.
회사에서는 github.com 대신 사내망에 설치한 GitHub Enterprise Server 를 쓰기도 합니다. 사용법은 github.com 과 거의 같고 git clone [email protected]:team/project.git 처럼 주소만 사내 도메인으로 바뀝니다.
SSH 키 등록·PAT 발급 화면도 동일한 구조로 사내 서버 계정 설정에 있습니다. 차이는 인증서·방화벽 설정이 사내 IT 정책을 따른다는 점입니다.
인터넷도 사내 GitHub 도 없는 완전 폐쇄망에서는 04 레슨에서 다룬 git bundle 이나 파일 서버 위의 bare 저장소로 같은 역할을 합니다. 이 레슨의 예제 전체가 그 방식, 즉 로컬 bare 저장소를 GitHub 대신으로 써서 진행됩니다.