Git 컨셉과 명령어 동작
Last updated
Last updated
버전 관리 시스템은 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템
로컬 버전 관리
: RCS, 변경되는 부분만을 관리
중앙집중식 버전 관리
: 개인별 Snapshot, 별도의 중앙 서버(ex. CVS, Subversion)
분산식 버전 관리
: 전체 정보 저장, Cloud 사용(Github) (ex. Git)
델타 기반 관리
: 파일의 변경 데이터를 관리 (이미지 참조)
스냅샷의 스트림처럼 관리
: 시간순으로 프로젝트의 스냅샷을 저장 (이미지 참조)
3가지 상태로 구성되어있다.
Committed
: 로컬에 저장된 상태
Modified
: 수정하였지만 로컬 데이터에 저장하지 않은 상태
Staged
: 수정한 파일을 커밋할 것이라 표시한 상태
3가지 단계가 있고 위의 상태와 1:1 매핑된다.
Git Directory(Repository)
= Committed
Git을 clone하거나 init할 때 만들어진다
Working Tree
= Modified
특정 버전을 checkout(Git Directory안의 파일)
Staging Area
= Staged
index라고도 하며 커밋할 내용을 표시한 파일
git init
: .git이라는 디렉토리를 만든다.
git reset
가리키는 커밋(HEAD)를 되돌린다. (reset --soft는 여기까지)
Index를 현재 커밋이 가리키는 스냅샷으로 업데이트 (reset --mixed는 여기까지, reset의 기본 옵션)
Working Directory를 index 상태로 업데이트(reset --hard는 여기까지)
checkout는 reset --hard + Working Directory의 안전을 보장
git rebase
Merge
는 두 브랜치의 마지막 커밋 2개와 공통 조상의 커밋으로 3-way merge를 하는 것이 일반적이다.
Rebase
는 공통 커밋(조상)으로 이동하고 지금까지의 커밋을 임시로 저장해둔 다음 Rebase할 브랜치에 차례대로 저장하여 선형을 만든다.
커밋 자체가 수정되면서 추가로 수정사항을 밀어넣게 되며 해시값이 바뀐다.
로컬은 커밋을 옮기는 방법을 사용한다
원격은 커밋을 되돌린다.
Staging -> UnStaging
마지막 커밋을 취소(로컬)
기록을 남기기 위해서는 revert
(권장)
강제로 덮어쓰기는 reset