git 기초
Git base knowledge
Git의 핵심은?
Git이 무엇이고 어떻게 동작하는지?
Git이 정보를 취급하는 방식
1. Snapshot
기존의 VCS 시스템 대부분은 관리하는 정보가 파일들의 목록이다. 각 파일의 변화를 시간순으로 관리하면서, 파일들의 집합을 관리한다.
Git은 이런식으로 데이터를 저장하지도 취급하지도 않는다. Git은 데이터를 File System SnapShot의 연속으로 취급하고 **크기가 작다**. Git은 commit하거나 프로젝트의 상태를 저장할 때마다 *파일이 존재하는 그 순간* 을 중요하게 여긴다. 파일이 달라지지 않으면 성능을 위해 파일을 새로 저장하지 않는다. 즉, Git은 데이터를 Snapshot의 stream처럼 취급한다.
2. 거의 모든 명령을 local에서 실행
대부분의 명령을 **local file**과 데이터만 사용하기 때문에 네트워크에 있는 다른 컴퓨터는 필요없다. 프로젝트의 모든 히스토리가 로컬 디스크에 있기 때문에 모든 명령이 빠르게 실행된다. 또한, 프로젝트의 히스토리를 조회할 때, 서버없이 조회한다. 로컬 데이터베이스에서 history를 읽어서 보여주기 때문에, 굳이 리모트에 있는 서버에 접근하고서 예전 버전을 가져올 필요가 없다. (VPN에 연결하지 못하거나 오프라인 상태여도 막힘없이 일 할 수 있다.)
3. Git의 무결성
Git은 데이터를 저장하기 전에 항상 CheckSum을 구하고, 그 CheckSum으로 데이터를 관리한다. **CheckSum**은 Git에서 사용하는 가장 Atomic한 데이터 단위이자, Git의 기본 철학이다.
Git은 SHA-1 hash를 사용하여 CheckSum을 만드는데, 40자 길이의 16진수 문자열로 되어있다. 파일의 내용이나 디렉토리 구조를 이용하여 CheckSum을 만든다. 다음은 SHA-1의 예시이다.
```24b9da6552252987aa493b52f8696cd6d3b00373```
또한, Git은 **데이터를 추가할 뿐**이라서 무얼하든 Git database에 데이터가 <u>추가</u>된다. 데이터를 되돌리거나 삭제할 방법이 없다. Git을 사용하면 프로젝트가 심각하게 망가질 걱정없이 매우 즐겁게 여러 실험을 해 볼 수 있는것이다.
4. 세 가지 상태
Git은 파일을 **Committed, Modified, Staged** 이렇게 세가지 상태로 관리한다.
-
Committed란 데이터가 로컬 데이터베이스에 안전하게 저장되었다는 것을 의미.
-
Modified는 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 의미.
-
Staged란 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미.
그림으로 표현하면 다음과 같다.
Git directory는 Git이 프로젝트의 meta-data와 객체 데이터베이스를 저장하는 곳을 말한다. 이 Git 디렉토리가 Git의 핵심. 다른 컴퓨터에 있는 저장소를 **Clone**할 때, Git directory가 만들어진다.
Working tree(working directory인지는 불분명)는 프로젝트의 특정 버전을 Checkout한 것이다. Git 디렉토리는 **지금 작업하는 디스크**에 있고, 그 디렉토리 안에 압축된 데이터베이스에서 파일을 가져와서 워킹트리를 만든다.
Staging Area는 Git 디렉토리에 있다. 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장. Git내부적으로는 Index라고 하지만, Staging Area와 같은 말이다.
기본적인 working flow는 다음과 같다.
-
working tree에서 파일수정.
-
staging area에 파일을 stage해서 커밋할 snapshot을 만든다. 모든 파일을 추가할 수도 있고, 선택도 가능.
-
staging area에 있는 파일들을 커밋해서 git directory에 영구적인 스냅샷으로 저장한다.
현재까지의 작업은 모두 **local에서 일어난 것**이다. 파일을 수정하고 Staging Area에 추가했다면 Staged이다(add 명령어 사용). Checkout하고 나서 파일을 수정했지만 아직 staging area에 추가하지 않았으면 modified이다. 다시 한번 강조하지만, **지금까지의 과정 모두 local에서 일어났다.**