협업/Git
Git의 상태 전이와 3 개체
Cha_Ji
2021. 9. 22. 15:52
제가 Git을 처음 접했을 때 간단하게만 생각했습니다.
clone해서 가져오거나 init으로 시작하고, add commit push 했습니다.
git에도 흐름이 존재하고, 구성요소가 존재합니다. 알고 쓰면 더 재밌지 않을까요?
상태의 흐름
- 현재 commit되거나 stage된 파일을 확인할 때
git status
명령어를 사용하곤 합니다.
Untracked
- add 명령어를 사용하기 전 파일의 기본 상태입니다. track되지 않은 상태입니다.
- add 명령어를 사용할 수 있고 Staging Area로 향합니다.
Staged
- commit 명령어를 준비중인 상태입니다.
- Staging Area에 옹기종기 모여서 commit 만을 기다립니다.
- 여기서 파일을 수정하면 Modified 상태로 넘어가고 Staging Area에서 내려옵니다.
- rm 명령으로 Untracked 상태로 돌아가기도 합니다.
Modified
- Staging Area에서 다시 내려온 상태입니다.
- 말 그대로 수정된 사항이 있는 상태이고, 다시 add를 해서 Staging Area로 갑니다.
- 다시 Staging Area로 올라갈 때에는 변경사항만 업로드하는 것이 아닌 새로운 파일이 업로드 됩니다.
Commit
- git repository (.git)에 스냅샷으로 저장된 상태입니다.
- Staging Area에 있는 파일들이 commit 명령어를 통해 저장소에 저장된 상태입니다.
파일의 위치?
- 상태가 전이되면서 파일이 운반됩니다.
- 위에서 설명한 상태의 흐름은 local -> staging area -> git repository 순으로 운반되는 예시입니다.
- 해당 상태에서 remote 저장소에 push 하게 된다면, gitHub나 gitLab 같은 원격 저장소로 이동하게 됩니다.
Git의 개체
상태가 전이되고 파일이 운반되는게 파일 전송이랑 뭐가 다를까요?
그냥 구글 드라이브나 카톡으로 계속 전송하면 되는거 아닐까요?
git에서는 조금 더 구조화된 파일이 운반됩니다.
일반적인 파일 저장소와는 다르게 버전관리를 돕고, 동시작업을 돕습니다.
git은 변경된 파일을 blob 개체로 저장하고
현 index에 따라 tree 개체를 만듭니다.
그리고 이전 commit와 최상위 tree 개체를 참고해 commit 개체를 만듭니다.
Tree
- Git은 리눅스와 마찬가지로 리누스 토르발즈가 개발했습니다.
- 리눅스, 유닉스와 유사하게 tree 구조로 파일을 저장합니다.
- tree는 유닉스의 디렉토리에 대응되며 그 항목에는 포인터, 파일 모드, 개체 타입, 파일 이름이 들어있습니다.
Commit
- git을 대표하는 명령어 중 하나인 commit 또한 개체입니다.
- commit 개체에는 각기 다른 스냅샷이 저장됩니다.
Blob
- Binary Large OBject
- 컨텐츠의 용량을 bytes로 표시합니다.
- 다양한 형식의 파일이 저장되며 이름이나 형식은 저장되지 않습니다.