저장소
고친 사람 github-actions[bot]
저장소는 프로젝트의 파일을 그 파일이 어떻게 바뀌어 왔는지와 함께 보관하는 곳입니다. 지금 모습만 꺼내는 것이 아니라 어제의 모습과 지난달의 모습도 꺼낼 수 있습니다. 빌드 결과물이나 남이 만든 라이브러리를 이름과 버전으로 모아 두고 내주는 곳도 같은 이름으로 부릅니다.
쉽고 빠른 이해
한 프로젝트의 파일과 그 파일이 바뀐 기록을 한 덩이로 들고 있는 곳입니다. 코드를 받아 와 여는 프로젝트 폴더 뒤에 이 덩이가 붙어 있습니다.
이것이 없으면 파일의 지금 모습만 남습니다. 어제 되던 것이 오늘 안 될 때 그사이 무엇이 바뀌었는지 되짚을 길이 사라집니다.
- 고친 파일을 기록 한 칸으로 묶어 저장소에 넣습니다
- 저장소는 그 칸을 앞 칸 뒤에 이어 붙여 순서대로 쌓습니다
- 지난 칸을 지목하면 그때의 파일을 다시 꺼냅니다
대가는 넣은 것을 계속 들고 다닌다는 것입니다. 한번 들어간 것은 빼기 까다롭고, 큰 파일을 넣으면 저장소를 받아 가는 사람마다 그 크기를 같이 받습니다.
상세
가계부를 떠올려 봅니다. 잔액만 적어 두면 지금 얼마가 남았는지는 알지만 왜 그 값이 됐는지는 알 수 없습니다. 들어오고 나간 것을 한 줄씩 적어 두면 지난달 어느 날로 거슬러 가 그날의 잔액을 다시 셀 수 있습니다.
저장소는 프로젝트의 파일 한 벌과 그 파일이 바뀌어 온 기록을 한 덩이로 묶어 둔 곳입니다. 그 기록에는 무엇이 어떻게 바뀌었는지와 함께 누가 언제 왜 바꿨는지가 같이 붙습니다. 버전관리 도구가 저장소를 만들고 돌봅니다.
한 저장소는 대개 한 프로젝트를 담습니다. 프로젝트가 여럿이면 저장소도 여럿 만듭니다. 여러 프로젝트를 한 저장소에 몰아 담는 방식도 있습니다.
덮어쓰지 않고 쌓는 보관
공유 폴더에 프로젝트를 올려 두고 같이 쓰는 방식을 옆에 놓아 봅니다. 공유 폴더는 누가 파일을 덮어쓰면 앞의 내용이 사라집니다. 남는 것은 마지막으로 저장된 한 벌뿐입니다.
저장소는 덮어쓰는 대신 쌓습니다. 새로 고친 내용을 넣어도 앞의 내용은 그대로 남습니다. 어느 시점이든 지목해 그때의 파일을 꺼낼 수 있습니다.
flowchart TD
subgraph S["공유 폴더 · 덮어쓴다"]
S1["1차 수정"] --> SB["파일 한 벌"]
S2["2차 수정"] --> SB
S3["3차 수정"] --> SB
SB --> SO["꺼낼 수 있는 것 · 3차뿐"]
end
subgraph R["저장소 · 쌓는다"]
R1["1차 수정"] --> R2["2차 수정"] --> R3["3차 수정"]
R3 --> RO["꺼낼 수 있는 것 · 셋 다"]
end
세 번 고친 뒤가 갈립니다. 공유 폴더에는 마지막 한 벌만 남고, 저장소에는 세 벌이 다 남습니다.
쌓인 기록 전체를 이력이라고 부릅니다. 이력이 남으면 문제를 거슬러 찾을 수 있습니다. 어제 되던 기능이 오늘 안 되면 그사이 들어간 기록을 하나씩 짚어 어느 기록에서 어긋나기 시작했는지 좁혀 갑니다.
여럿이 한 저장소를 나눠 쓰는 방식은 아래에서 봅니다.
저장소와 작업 사본
편집기로 열어 고치는 파일은 저장소 자체가 아닙니다. 저장소에서 한 시점을 꺼내 펼쳐 놓은 사본입니다. 이것을 작업 사본이라고 부릅니다. 저장소는 대개 내 컴퓨터 안에 이 사본과 같이 있습니다.
flowchart TD
subgraph M["내 컴퓨터"]
W["작업 사본 · 지금 편집하는 파일"]
R["저장소 · 지금까지의 모든 모습"]
end
W -->|"고친 것을 기록으로 넣는다"| R
R -->|"지난 시점을 꺼내 펼친다"| W
화살표가 두 방향입니다. 작업 사본에서 고친 것은 기록으로 묶여 저장소로 들어가고, 저장소에 있는 지난 시점은 작업 사본 쪽으로 펼쳐집니다.
작업 사본에서 파일을 지워도 저장소의 이력은 줄지 않습니다. 반대로 저장소에 안 넣은 수정은 작업 사본에만 있습니다. 폴더를 지우면 같이 사라집니다.
저장소에 쌓이는 기록
저장소에 들어가는 기록 한 칸이 커밋입니다. 한 칸에는 그 시점 파일들의 모습과, 누가 언제 왜 그렇게 고쳤는지를 적은 커밋 메시지가 같이 들어갑니다.
커밋은 앞 칸 뒤에 이어 붙습니다. 이렇게 한 줄로 이어진 원래 줄기를 본줄기라고 부릅니다. 어느 칸에서 옆으로 갈라져 나온 작업 줄기가 브랜치입니다. 본줄기를 건드리지 않고 따로 고쳤다가 나중에 되돌려 합치려고 갈라 둡니다.
특정 칸에 붙여 두는 이름표가 태그입니다. 칸이 쌓이면 어느 칸이 어느 칸인지 구별할 이름이 필요해집니다. 태그는 그중 한 칸을 사람이 부르기 쉬운 말로 가리킵니다.
flowchart TD
subgraph REPO["저장소"]
C1["커밋 하나"] --> C2["커밋 둘"]
C2 --> C3["커밋 셋 · 합쳐진 칸"]
C2 --> B1["브랜치로 갈라진 커밋"]
B1 --> C3
C3 --- T1["태그"]
end
커밋은 앞뒤가 이어져 있습니다. 어느 칸에서든 앞으로 거슬러 갈 수 있습니다. 갈라져 나온 칸은 따로 쌓이다가 본줄기로 다시 들어옵니다. 갈라진 둘을 도로 한 줄로 만드는 일을 머지라고 합니다.
저장소를 두는 두 방식
저장소를 서버 한 곳에만 두는 방식이 먼저 있었습니다. 각자는 작업 사본만 받아서 고치고, 고친 것은 그 서버에 넣습니다. 이력은 서버에만 있어서 서버에 못 닿으면 지난 기록도 못 봅니다.
지금 널리 쓰는 방식은 이력까지 갖춘 저장소를 저마다 하나씩 들고 있는 것입니다. 손안의 저장소가 이력을 다 갖고 있으니 네트워크 없이도 지난 시점을 꺼내고 새 기록을 쌓을 수 있습니다.
저장소가 여럿이면 서로 맞출 곳이 하나 필요합니다. 그래서 하나를 가운데 둡니다. 각자 자기 기록을 그쪽에 올리고 남의 기록을 그쪽에서 받아 옵니다. 내 저장소가 상대하는 저쪽 저장소를 원격 저장소라고 부릅니다.
flowchart TD
subgraph A["서버 한 곳에 두는 방식"]
A1["작업 사본"] --> AS["서버 · 저장소 · 이력"]
A2["작업 사본"] --> AS
end
subgraph B["저마다 하나씩 드는 방식"]
B1["작업 사본 · 저장소 · 이력"] <--> BC["가운데 둔 저장소"]
B2["작업 사본 · 저장소 · 이력"] <--> BC
end
위쪽은 이력이 한 곳에만 있습니다. 아래쪽은 손마다 이력이 있습니다.
여럿이 한 저장소를 나눠 쓰면 같은 파일을 두 사람이 고치는 일이 생깁니다. 저장소는 두 사람이 무엇을 각각 고쳤는지 압니다. 겹치지 않는 부분은 저장소가 합칩니다. 겹치는 부분만 사람에게 물어봅니다.
저장소에 넣지 않는 파일
이력이 안 지워지는 것은 값이면서 대가입니다. 한번 넣은 것은 지금 모습에서 지워도 지난 기록에는 남고, 그 저장소를 이미 받아 간 사람 손에도 남습니다.
그래서 비밀번호나 열쇠 파일은 저장소에 넣지 않습니다. 넣었다가 지우는 것으로는 없앤 셈이 되지 않습니다. 값 자체를 바꾸는 쪽으로 처리합니다.
큰 이진 파일도 조심합니다. 텍스트는 바뀐 줄만 골라 담지만 이진 파일은 그렇게 못 갈라서 고칠 때마다 통짜로 쌓입니다. 이력이 무거워지면 받아 오는 사람이 그 무게를 같이 받습니다.
빌드가 만들어 낸 결과물도 대개 안 넣습니다. 소스에서 다시 만들 수 있는 파일입니다. 그런 파일을 따로 받아 두는 곳은 아래에서 봅니다.
같은 이름으로 부르는 다른 저장소
결과물을 이름과 버전으로 받아 두고 내주는 서버도 저장소라고 부릅니다. 빌드가 만든 파일을 담는 아티팩트 저장소, 남이 공개한 라이브러리를 담는 패키지 저장소가 그런 곳입니다.
이 저장소들은 파일이 바뀌어 온 이력을 담지 않습니다. 이름과 버전을 대면 그 패키지 하나를 내줍니다. 내용을 고치려면 버전을 올려 새로 올립니다.
담는 것과 찾는 방법에서 둘이 갈립니다.
| 버전관리 저장소 | 결과물을 담는 저장소 | |
|---|---|---|
| 담는 것 | 소스와 그 변경 이력 | 빌드된 파일 한 벌 |
| 찾는 방법 | 기록이나 브랜치를 지목한다 | 이름과 버전을 댄다 |
| 고칠 때 | 새 기록을 이어 붙인다 | 버전을 올려 새로 올린다 |
이력을 담느냐가 갈림길입니다. 담지 않으니 지목하는 방법도 이름과 버전뿐이고, 고치는 방법도 버전을 올리는 것뿐입니다.
두 쓰임 말고 데이터를 담아 두는 시스템을 뭉뚱그려 저장소라고 부르기도 합니다. 이때는 데이터 저장소처럼 앞말을 붙여 무엇을 담는지 밝히면 헷갈리지 않습니다.
관련 항목
저장소를 이루는 구성 요소
커밋 · 브랜치 · 태그 · 커밋 메시지 · 참조 · 스테이징 영역 · 서브모듈
저장소의 하위 종류
로컬 저장소 · 원격 저장소 · 중앙 저장소 · 베어 저장소 · 모노레포 · 포크
저장소를 상대로 하는 동작
체크아웃 · 푸시 · 풀 · 페치 · 머지 · 리베이스
저장소를 다루는 버전관리 도구
Git · 분산 버전관리 · Subversion · Mercurial
저장소를 올려 두는 호스팅 서비스
GitHub · GitLab · 호스팅 서비스 · 풀 리퀘스트
저장소를 바탕으로 굴리는 협업 방식
브랜치 전략 · 트렁크 기반 개발 · 코드 리뷰 · 지속적 통합
결과물을 이름과 버전으로 보관하는 저장소
아티팩트 저장소 · 패키지 저장소 · 컨테이너 레지스트리 · 의존성 · 시맨틱 버저닝
저장소와 헷갈리는 이웃
작업 사본 · 백업과 복구 · 파일 서버 · 데이터 저장소 · 아카이브
다른 이름: repository · 리포지터리 · 리포지토리 · 레포