1. Git을 특별하게 만드는 것
1) 버전 관리
로컬 버전 관리

- 많은 사람들은 버전을 관리하기 위해 디렉토리로 파일을 복사하는 방법을 쓴다.
- 직접 복사하는 방식은 실수를 하기 쉬우므로 이를 보조해주는 로컬 VCS 도구가 존재한다.
중앙 집중식 버전 관리(CVCS)

- 다른 개발자와 함께 작업을 하기 위해 만들어졌다.
- 파일을 관리하는 서버가 따로 있고, 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)한다.
- 중앙 서버에서 문제가 발생하는 경우 그동안 아무도 다른 사람들과 협업할 수 없고 사람들이 하는 일을 백업할 방법도 없다.
- 중앙 데이터 베이스가 있는 하드디스크에 문제가 생기면 프로젝트의 모든 히스토리를 잃는다. 물론 사람마나 하나씩 가진 스냅샷은 괜찮다.
분산 버전 관리 시스템

- 클라이언트는 단순희 파일의 마지막 스냅샷을 Checkout하지 않는다. 저장소를 히스토리와 더불어 전부 복제한다.
- 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있다.
- 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다.
2) 데이터를 다루는 방식
출처 : pro git책
델타 방식

- 각 파일이 생겨난 시점에 전체 파일이 저장이 되고, 수정이 가해질 때는 그 변경점들이 저장된다.
- 커밋이 많아질수록 느려질수가 있다.
스냅샷 방식

- git에서 사용하는 방식이다.
- 각 버전마다 전체 파일이 저장되어 있다. 새로운 버전이 만들어 질 경우 변화가 없는 파일은 그대로 연결해서 가져오고, 변화가 있는 파일은 최종 파일 내용이 저장되어 있다.
- 용량을 크게 차지하지 않는 효율적인 방식으로 관리를 한다.
2. Git의 3가지 공간
1) Git의 3가지 공간

(1) Working directory
- untracked : Add된 적 없는 파일, ignore 된 파일
- tracked : Add된 적 있고 변경내역이 있는 파일
git add 명령어로 Staging area로 이동
(2) Staging area
- 커밋을 위한 준비 단계
git commit 명령어로 repository로 이동
(3) Repository
.git directory라고도 불림
- 커밋된 상태
2) 파일의 삭제와 이동
(1) git rm
- 단순히 파일을 삭제할 경우 파일 삭제 내역이 working directory에 있다.
git rm 파일명로 파일 삭제하면 파일 삭제 내역이 Staging area에 있다.
(2) git mv
git mv 기존파일명 변경할파일명을 사용하면 파일 이름 변경 내역이 Staging area에 올라간다.
3) 파일을 staging area에서 working directory로 이동시키기
git restore --staged 파일명
git restore 파일명 : working directory에서도 제거
4) reset의 세 가지 옵션
- --soft : repository에서 staging area로 이동
- --mixted(default) : repository에서 working directory로 이동
- --hard : 수정사항 완전히 삭제
3. Git의 HEAD
- HEAD : 현재 작업하고 있는 로컬 브랜치를 가리킨다.
git checkout HEAD^ : 한 커밋 이전으로 이동한다.
git checkout HEAD~5 : 5커밋 이전으로 이동한다.
git checkout 커밋해시 : 해당 커밋으로 이동한다.
git checkout - : 이동을 한 단계 되돌리기
- checkout으로 이동하면 해당 위치에 익명의 브랜치가 생성되고 그곳에 위치한 상태이다.
- 임의의 위치에서 브랜치를 만들 수 있다.
git reset --hard HEAD~ : 한 커밋 전으로 이동하고 그 부분을 날린다. 이런 방식으로도 사용할 수 있다.
4. fetch vs pull
1) fetch와 pull의 차이
- fetch : 원격 저장소의 최신 커밋을 로컬로 가져오기만 한다.
- pull : 원격 저장소의 최신 커밋을 로컬로 가져와 merge 또는 rebase 한다.
2) fetch한 내역을 적용하기 전 확인해보기
- 원격의 main브랜치에 커밋을 추가한 경우
git fetch 입력
git checkout origin/main로 원격의 브랜치로 이동하여 확인 가능
- main으로 이동 후
pull
- 새로원 원격 브랜치를 생성한 경우
git fetch 입력
git checkout origin/브랜치명로 원격의 브랜치로 이동하여 확인 가능
- main으로 이동 후
git switch -t origin/브랜치명
- 원격 브랜치와 동일한 이름의 로컬 브랜치 생성 후 해당 브랜치로 이동