버전 관리 (Version Control System)
- 로컬 버전 관리 (Local VCS)
- 중앙집중식 버전 관리 (Centralized VCS) - 파일이 서버에 있고, 서버에서 동작이 이루어짐
- 분산 버전 관리 시스템 (Decentralized VCS) - 파일이 로컬에 있고, 로컬에서 동작이 이루어짐
Git 의 특징
- 파일이 달라지지 않으면 관심이 없음
- 이전 상태에 대한 링크만 저장함
- 데이터를 스냅샷의 스트림 처럼 취급함
Git 의 무결성
- 데이터를 저장하기 이전에 Checksum 을 구함
- 이를 통해 데이터를 관리
- 필수 매우 중요한 것임
- 이게 없으면 파일, 디렉터리 변경이 불가
- 체크섬은 SHA-1 해시로 만들어짐
- 40자, 16진수 문자열 <= 파일 이름, 파일 내용, 디렉터리 구조에 대한 정보가 담겨 있음
- Git 으로 어떤 동작을 해도 데이터가 추가됨
- 파일을 삭제해도, 변경해도, 라인을 삭제해도 모든 동작은 Git 에 데이터를 추가하는 행위
Git 의 세가지 상태 - Committed, Modified, Staged
- Committed (Repository)
- 데이터가 로컬 데이터베이스에 저장된 상태
- Modified (Working Directory)
- 현재 상태, 수정/생성/미변경된 파일들이 공존하는 상태 (미변경된 파일은 관심이 없음)
- Staged (Staging Area)
- 커밋하기 직전의 상태
cf. Untracked - Git 프로젝트의 하위 디렉터리에 존재하지만 Git 관심 영역에 벗어나 있는 상태, 즉 위의 세가지 상태는 모두 Tracked 상태에 있는 것
Git 으로 하는 일
위의 세가지 상태에 있는 파일들(Tracked) 을 관리함
- Working Directory 에서 파일을 수정
- 파일들의 위치 - Working Directory
- 파일의 상태 변화 - 무관심 -> Modified
- Staging Area 에 파일을 Stage 하여 Commit 할 스냅샷을 만듦
- 파일들의 위치 - Working Directory -> Staging Area
- 파일의 상태 변화 - Modified -> Staged
- 스냅샷을 Commit 하여 로컬 Repository 에 저장
- 파일들의 위치 - Staging Area -> Repository
- 파일의 상태 변화 - Staged -> Commit
Git 의 파일 상태 및 Life Cycle
위 그림에서 파일 추가 및 파일 삭제는 Git 의 관점에서의 삭제이다. 디렉터리 내에서는 파일이 항상 존재한다.
Tracked 에서 Untracked 상태로 변경되는 것이 파일 삭제,
Untracked 에서 Tracked 상태로 변경되는 것이 파일 추가이다.
IntelliJ 에서는 위의 Life Cycle 이 어떻게 표시될까?
상태와 클래스 명을 동일하게 해두었다.
위 캡쳐를 찍을 때 생각을 못했는데, 삭제되면 Intellij 내장 VCS 기능에서 회색으로 보여준다. (프로젝트 디렉터리 구조상에서는 보이지 않는다. 이 경우는 디스크에서 파일이 삭제된 경우, 라이프 사이클 그림에서 말하는 Untracked 상태에서 Tracked 상태로 변경되는 경우가 모두 포함된다. 하지만 후자의 경우 프로젝트 디렉터리 구조에서는 빨간색으로 파일명이 변경될 것으로 추측할 수 있을 것 같다. 혹시 해보신 분 계시면 댓글로 부탁드립니다.. ㅎㅎ)
그렇다면 git CLI 에서는 어떻게 확인할 수 있을까?
Untracked 파일은 git 이 모르고 있기 때문에 앞에 태그(deleted, new file, modifed 를 태그라고 칭했다.)가 없다.
위의 두 영역은 Tracked 된 파일들을 구분해서 보여주고 있다.
맨 위가 Changes to be committed, 즉 '변경사항들이 커밋이 되어야 한다.' 라는 말로 보아 Staged 상태의 파일들(Staging Area)을 보여준다. 이 파일들을 git commit
명령어를 통해 메시지를 작성하면 git 의 데이터베이스에 저장되면서 repository 로 이동된다.
그 아래는 Staged 가 되지 않은 상태의 파일들(Working Directory)을 보여준다. 맨 위의 영역 (Changes to be committed) 에 있는 파일들은 git add [파일명]
으로 staging area 로 옮길 수 있는 파일들이다.
댓글