Git의 저장소(Repository) 란?
- 사전적 의미로 '저장소(Repository)'란? : 파일이나 폴더를 저장해 두는 곳
"Git의 저장소(Repository)"
: Git이 관리하는 저장소
- 단순히 프로젝트나 소스 코드만이 아닌 다양한 버전과 "브랜치(Branch)"들이 존재
- 하위에 '.git' 디렉터리가 생성됨
- 파일을 수정, 커밋하고 프로젝트의 이력관리 및 공유 등 Git의 기능 사용 가능한 장소
- 파일이 변경 이력 별로 구분되어 저장된다.
- [종류] : 원격 저장소와 로컬 저장소 두 종류이다.
1. 원격 저장소 (Remote Repository) : 원격 서버에서 있는 저장소 (여러 명이 공통으로 사용가능=협업)
2. 로컬 저장소 (Local Repository) : 만들었거나 원격 저장소를 가져와서(=clone) 내 로컬디스크에 생성한 저장소
-> 관련 이전 포스팅 : Git 저장소 / Git 저장소 (= Git Repository)란? 참조
"Git의 저장소(Repository)" vs 'Git 디렉토리'
vs 'Staging Area(Index)' vs '작업 트리(Work tree)'
일단 "Git의 저장소(Repository)"는 '위치와 관계없이 'Git이 관리하는 저장 공간'이다.
VS
저장소 중 로컬에 위치한 로컬 저장소 (Local Repository)에서 이루어지는 파일 작업들에 따라
아래 3가지 작업 공간이 등장한다 (헷갈린다)
[그림그려줘] https://git-scm.com/book/en/v2/images/areas.png + 원격 Repository push/pull,fetch,
1. 'Git 디렉토리(Git directory)'
: Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳
- 원격 저장소를 Clone 할 때 생성
- 'Staging Area(Index, 인덱스)'는 여기에 존재한다.
- 여기 있는 파일들은 모두 'Committed 상태'다
2. 'Staging Area(Index, 인덱스)'
: 커밋을 실행하기 전의 저장소와 작업 트리 사이에 존재하는 공간
- 디스크 내 'Staging Area(Index, 인덱스)'로 구분되는 별도의 공간은 없다. = '가상 공간'이다.
(관련 작업들이 실제 관리되는 위치는 'Git 디렉토리'이다.)
3. '작업 트리(Work tree, 워크 트리, 워킹 트리)'
: Git 저장소와 연결된 내 로컬의 디렉터리
- 프로젝트의 특정 버전을 Checkout 한 것
- 'Git 디렉토리'는 지금 작업하는 디스크에 있고, 그 디렉토리 안에 압축된 데이터베이스에서
파일을 가져와서 '작업 트리(Work tree)'를 생성
- Git에서는 우리가 흔히 말하는 "폴더(디렉토리)"를 '작업 트리(Work tree)'라고 일컫는다
- 로컬의 이 곳에서 저장소의 파일을 수정한다.
3-1. '워킹 디렉토리(Working directory)' : '작업 트리(Work tree)'로 말그대로 내가 작업하는 디렉토리
브랜치(Branch) 란?
일단 프로젝트는 때에 따라 다양한 버전들이 '나뭇가지'들처럼 생깁니다.
아래 ex1,2)처럼 ▼
ex1) 여닫는 기본 출입문 기능만 하는 프로젝트 'A'에서 다양한 버전들이 '나뭇가지'들처럼 생기는 예 출입문 A ----> 음성인식 기능을 더한 출입문 A1---> TTS기능 및 음성인식 기능을 더한 출입문 A1-1 | └---> AI 기능 및 음성인식 기능을 더한 출입문 A1-2 └---> 지문인식 기능을 더한 출입문 A2 └---> 홍채인식 기능을 더한 출입문 A3 ---> AI 기능 및 홍채인식 기능을 더한 출입문 A3-1 └---> 얼굴 인식 및 홍채인식 기능을 더한 출입문 A3-2 └---> 동작 인식 및 홍채인식 기능을 더한 출입문 A3-3 ex2) 다양한 버전들이 '나뭇가지'들처럼 생겨 왔던 리눅스 |
이렇게 다양한 버전들은 최초에 어떻게 생길까?
보통, 새 버전의 토대가 될 특정 프로젝트 버전(원본)을 복사한 복사본에 새로운 버전 부여하고 수정사항을 적용해 간다.
이렇게 생성된 '다양한 버전의 소스 코드(복사본)들의 버전관리를 위한 개념'이 "브랜치(Branch)"로
Git에서 "브랜치(Branch)"는
"'새로운 버전의 소스 코드'의 마지막 커밋을 가리키는 포인터 같은 것"이다.
- "브랜치(branch)"는 '포인터'적인 개념보다 "'새 버전의 소스 코드'를 전체를 일컫는 말"로 사용되는 것 같다~
- "브랜치(branch)"는 커밋이 추가되면 같이 이동한다. (= 특정 버전 프로젝트(소스 코드)의 마지막 커밋을 가리킴)
'origin' 이란? (원격 저장소)
: Git이 만든 '원격 저장소(Remote repository)'를 일컫는 이름
- '$ git clone' 명령 시 자동으로 생성됨
- 'origin'이 아닌 커스텀 명칭을 사용하려면?
ㄴ> '$ git clone -o <커스텀명칭>' : 별도의 리모트 이름을 생성되어 '커스텀 명칭/master' 등과 같이 사용됨
'master' 란? (브랜치)
: Git이 만든 로컬 저장소 (Local Repository) 작업을 지칭하도록 만든 브랜치
- '$ git init' 명령으로 초기화할 때 자동으로 생성됨
- 처음 커밋하면 이 master 브랜치가 생성된 커밋을 가리키고,
이후 커밋을 만들면 master 브랜치는 자동으로 가장 마지막 커밋을 가리킨다.
- 여러 '원격 저장소(Remote repository)' 존재 시, '원격 저장소명/master' 로 구분하여 사용된다.
ex) 'orgin/master', 'addedBrach/master'
- 다른 브랜치와 별 다른 것이 없다.
'HEAD' 란? (작업중인 브랜치를 가리키는 포인터)
: 로컬에서 지금 작업 중인 "브랜치(branch)"를 가리키는 포인터
- 다른 버전 관리 시스템과는 달리 Git이 가진 특수한 포인터
- (포인터를 가리키는 포인터처럼) 일종의 포인터 같은 것인 "브랜치(branch)"를 가리키는 포인터
'master' vs 'HEAD'
>> '그림 13. 현재 작업 중인 브랜치를 가리키는 HEAD'를 보면
'master 브랜치'는 "브랜치(branch)"이므로 "커밋을 가리키는 포인터 같은 것"이고,
'HEAD'는 "로컬에서 현재 작업하는 브랜치를 가리키는 포인터 같은 것'으로, 마치 포인터를 가리키는 포인터'처럼
일종의 포인터 같은 것인 "브랜치(branch)"를 가리키는 포인터이다.
'트래킹 브랜치(Tracking branch)' 란?
: 원격에서 존재하는 연결할 브랜치(=리모트 트래킹 브랜치)를 로컬 브랜치로 Checkout 하면 자동으로 생성되는 브랜치
- 원격에서 존재하는 브랜치(=리모트 브랜치)와 직접적인 연결고리가 있는 로컬 브랜치
- 'Upstream 브랜치' : 트래킹하는 대상인 리모트 브랜치
'Upstream(업스트림)' 이란?
: 클라이언트나 로컬 기기에서 서버나 원격 호스트로 '전송되는 데이터' 또는 '전송하는 것'을 의미한다.
- Upstream 저장소(Upstream repository) = 원격 저장소(Remote repository)
- Upstream 브랜치(Upstream branch) : '트래킹(Tracking) 브랜치'에서 트래킹 대상인 '원격 저장소 브랜치(=리모트 브랜치)'
'Downstream(다운스트림)' 이란?
: 'Upstream(업스트림)'과 반대로 서버에서 로컬 기기로 전송되는 데이터의 흐름
데이터가 어디로 흘러가느냐에 따라 구분된다,
절대적인 'Upstream(업스트림)', 'Downstream(다운스트림)'은 없다.
END!
스터디 도움 참조 블로그 (References)