git
의Spanshot
,분산 버전관리시스템
은 다른vcs
와 차별점
vcs(version control system)
는 크게 Delta
, Spanshot
2가지 방식으로 버전을 관리한다.
Delta
방식Delta
방식은 타 vcs
에서 사용되며 각 파일이 생겨난 버전에 해당 파일 전체가 저장된다.
그리고 이후 수정사항들이 발생하면 그 변경점들이 저장된다.
즉 변화들의 누적이 계산된다.
Spanshot
방식Spanshot
방식은 git
에서 사용되며 새로운 버전이 만들어질때 해당 버전의 각 파일이 최종 상태 그대로 저장된다.
vcs(version control system)
는 버전을 관리하는 방식에 따라 중앙집중식
, 분산식
으로 나뉜다.
중앙집중식 버전관리는 타 vcs
에서 사용되며 원격서버에 모든 관리내역들이 저장된다.
그래서 로컬은 원격서버에서 다운받은 파일들로만 작업을 수행한다.
즉 중앙집중식 버전관리는 원격 저장소에 의존적이다.
분산 버전관리는 git
에서 사용되며 로컬에 파일뿐만아니라 전체 git
커밋과 브렌치들까지 다운받아서 작업을 수행한다.
그래서 중앙집중식과는 다르게 로컬에서 자유롭게 작업이 가능하다.
즉 분산 버전관리는 모든 구성원들이 git
의 상태까지 공유가 가능하다.
git
에는Working directory
,Staging area
,Repository
의 영역이 존재
git
에서 관리하는 파일들은 modifed
, staged
, commited
의 3가지의 상태를 가진다.
그리고 각 상태는 working directory
, staging area
, repository
영역으로 구분된다.
Working directory
는 git add
명령어를 수행하기 전 영역으로 untracked
, tracked
로 구분된다.
untracked
는 add
가 수행된 적 없는 파일을 의미하고, tracked
는 add
가 수행되고 변경사항이 있는 파일을 뜻한다.
Working directory
에서 git add
명령어를 수행하면 Staging area
영역으로 이동한다.
Staging area
는 커밋을 위한 준비 단계이다.
Staging area
에서 git commit
명령어를 수행하면 repository
영역으로 이동한다.
Repository
는 커밋된 단계이다.
Repository
는 .git directory
라고도 불린다.
위에서 살펴본 각 상태는 일반적으로 working directory
, staging area
, repository
영역순으로 실행된다.
하지만 아래 명령어를 사용하면 역순 즉 staging area
에서 working directory
로 이동할 수 있다.
git restore --staged (파일명)
이 때 --staged
를 입력하지 않으면 working directory
에서도 제거된다.
앞선 포스팅에서 git reset --hard
명령어를 통해 reset
의 개념과 사용 방법에 대해서 설명했다.
하지만 reset
에는 다른 옵션 또한 존재한다.
이 옵션들은 앞서 설명한 git
의 3가지 공간으로 각각 다른 방식으로 이동한다.
--soft
: repository
에서 staging area
로 이동
--mixed (default)
: repository
에서 working directory
로 이동
--hard
: 수정사항 완전히 삭제
HEAD
는 특정 브랜치에 최신 커밋을 의미한다.
즉 브랜치의 가지들 중 가장 끝자락에 위치한 커밋을 지칭한다.
앞선 포스팅에서 설명한 reset
, revert
는 이동과 동시에 git
의 히스토리 내역을 변경한다.
하지만 Checkout
은 git
의 히스토리 내역은 변경하지 않고 파일들의 상태만 뒤로 옮긴다.
Checkout
은 ^
또는 ~
갯수만큼 이전으로 이동하며 다음과 같이 사용한다.
git checkout HEAD^
git checkout HEAD^^^
git checkout HEAD~5
만약 이동을 한 단계 되돌리려면 -
을 사용한다.
git checkout -