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/브랜치명
- 원격 브랜치와 동일한 이름의 로컬 브랜치 생성 후 해당 브랜치로 이동