0. git이란?
Git이란 버전 관리 시스템(VCS, Version Control System)의 한 종류입니다.
1) 클라이언트-서버 모델
- 하나의 중앙 서버가 존재하며, 여러 클라이언트들은 중앙 서버에서 각자 맡은 파트만 가져와서 작업하고, 다시 중앙으로 통합하는 것을 말합니다.
- 대표적 시스템으로 CVS, Subversion 등이 있습니다.
2) 분산 모델
- 하나의 중앙 서버가 존재하지만, 여러 클라이언트들은 각자의 컴퓨터 저장소에 중앙 서버의 전체 사본을 가지고 작업을 하는 것을 의미합니다.
- 대표적 시스템으로 Git이 있습니다.
1. git의 필요성

(1) 버전관리
예를 들어 고객에게 의뢰를 받아서 앱을 하나 담당한다고 하면 만드는 과정과 유지하는 과정에서 계속해서 추가하고 수정하는 작업이 필요합니다.
누군가 잘못된 코드를 섞으면 복원해야 할 때도 있고 코드가 어디가 어떻게 바뀌었는지 과거 내역을 확인해야 할 때도 있기때문에 바뀌기 전 내역들도 중간중간 저장을 해놓아야합니다.
클라이언트의 요청으로 대거 코드를 수정 후 '처음이 낫네요' 하면 모두 처음으로 되돌려 놓아야 할 경우도 있기 때문입니다.
(2) 협업
규모가 있는 프로젝트는 여러명이서 작업하게 됩니다.
소프트웨어의 특성상 파일이 통째로 있어야 원할하게 테스트가 가능한데 매번 이메일로 공유하기도 번거롭고 누가 언제 어떤 코드를 수정했는지 파악하기도 힘듭니다.
git을 이용하면 모든 과정들이 순서대로 체계적으로 기록되고 관리되기 때문에 나중에 문제가 생기더라도 원인을 파악할 수 있고 얼마든지 코드들을 과거로 되돌려서 문제를 해결할 수 있습니다.
2. git의 workflow
working directory : 작업공간
staging area : version history에 저장할 준비가 됐을때 올려놓는 공간
.git directory : version의 history를 가지고 있는 git repository

- 작업공간에서 파일들을 수정하고 있다가 b와 c 파일을 add 명령어로 staging area로 옮겨두게 됩니다.

2. commit이라는 명령어로 staging area의 파일들을 깃 레퍼지토리로 저장하게 됩니다.

3. a파일도 준비가 되면

4. 다시 add 명령어로 staging area로 옮겨서

5. commit명령어로 history에 저장할 수 있습니다.
3. commit
- Git의 모든 파일은 오브젝트로 관리합니다. 내 파일의 텍스트 내용도, commit내용도 다 오브젝트로 만들어서 관리가 됩니다.
- Git은 commit마다 새로운 오브젝트를 만들어 냅니다.
- 내가 아주 작은 부분만 저장해도 바뀐 부분만 저장하는 게 아니라 전체의 텍스트 내용을 저장하는 오브젝트를 만듭니다.
- 이것을 특정 시점의 사진을 찍는 것과 비슷하다고 해서
Snapshot저장 방식이라고 부릅니다.
- Git에 "test.txt" 라는 파일 하나를 추가하면 "test.txt"라는 이름의 오브젝트를 생성하는 것이 아니라 "test.txt"의 내용 전부를 해시테이블에 넣어 40자리의 해시값을 뽑아 오브젝트 파일이름으로 사용합니다
- 그렇다면, "hello.txt"라는 이름은 어디에 저장되는 것일까요?"hello.txt"를 위한 오브젝트인 blob에는 파일이름인 "hello.txt"라는 문자열이 저장되지 않습니다.
- 대신 디렉토리 구조를 나타내는 tree 오브젝트에서 "hello.txt"라는 문자열을 찾을 수 있습니다.
- commit을 한번 할때마다 commit, blob, tree라는 3개의 오브젝트가 파일로 생기게 되는데
🔍전체 내용을 저장하면?
Object의 압축 - Packfiles
- 오브젝트 파일들이 너무 많아지면 압축해서
.git/pack폴더 아래에 오브젝트들을 압축한바이너리 파일(*.pack)과 그 파일에 무엇이 압축되었는지 기록한index 파일이 만들어진다. 이것을 압축해서 저장한packfile이라고 합니다. - 원래는 특정 시점(Ex. Push할 때)에 Git이 판단해서
packfile로 오브젝트 파일들을 압축하지만 우리가 명령어(git gc)를 쳐서 수동으로 압축할 수도 있습니다.
commit, blob, tree
- commit
tree b74344afb2eaf0423695b45349e0841ca871c8ba
author corazon4815 [mango4815@knou.ac.kr](mailto:mango4815@knou.ac.kr) 1627890878 +0900
committer corazon4815 [mango4815@knou.ac.kr](mailto:mango4815@knou.ac.kr) 1627890878 +0900
- 작성자
- 커밋 실행자
- 커밋 날짜
- 로그 메시지
- tree 객체
- blob
커밋된 내용
- 타입 : "blob" 타입
- 사이즈 : 컨텐츠의 용량을 bytes로 표시
- 컨텐츠 : blob의 컨텐츠에는 텍스트, 이미지, 음악 혹은 단순 이진 파일처럼 다양한 형식의 파일이 저장될 수 있다.
파일이름이나 파일형식은 blob에 저장되지 않는다.
파일의 메타정보를 제외한 파일의 내용 전체를 품는다.
- tree
100644 blob 4906665c42a49f927995c3db6fc3531df8577c21 test.txt
- 타입 : "tree" 타입
- 사이즈 : 트리 오브젝트의 용량을 bytes로 표시
- tree 객체 : 하위 디렉토리의 트리 객체를 재귀적으로 참조할 수 있다.
- blob 객체 : 한 디렉토리에 있는 모든 blob을 담고 있다.
객체에 대한 접근권한, 파일이름은 여기서 관리한다.
'Etc' 카테고리의 다른 글
| 카카오맵 kakao is not defined 403 에러 해결 - 카카오맵 활성화 설정 (0) | 2025.01.22 |
|---|---|
| [Python] ModuleNotFoundError: No Module Named openai 해결 (0) | 2024.01.10 |
| postman으로 요청할 때 헤더에 항상 특정 값을 보내야한다면(JWT) (0) | 2021.01.21 |