Git 장점
버전 관리 방식 (델타 vs 스냅샷)
VCS (Version Controll System) 은 델타 방식과 스냅샷 방식으로 버전을 관리한다.
델타 방식은 SVN 등에서 사용하는 방식으로 수정사항이 발생한 버전만 따로 관리가 된다. 즉, 변경점들만 저장이 되기 때문에 누적되어서 관리가 된다.
스냅샷 방식은 Git 등에서 사용하는 방식으로 새로운 버전이 만들어질 때, 해당 버전의 최종 파일로 관리가 되고 있다.
델타 방식은 프로젝트의 규모가 커질 수록 변경 사항을 계산해야 되니까 느려지는 반면, 스냅샷 방식은 현재 버전만 사용하면 되므로 편리하다. 또한 Git은 분산 버전 관리를 하고 있어서 원격 저장소에 의존적이지 않게 작업할 수 있다. (다른 사람의 브랜치를 가져와 동기화하여 사용하는 등)
Git의 3가지 공간
working directory
- untracked : ADD 된 적이 없는 파일 또는 ignore 된 파일
- tracked : ADD 된 적이 있고, 변경 내역이 있는 파일
git add
명령어를 사용하면 Staging area로 이동한다.
Staging area
- 커밋을 위한 준비 단계로 작업을 위해 선택된 파일들이 있는 영역이다.
git commit
을 사용하여 레포지토리로 이동시킨다.
Repository
.git directory
라고 불리며 커밋된 상태를 의미한다.
파일 삭제와 이동
git rm
tigers.yaml
를 삭제해본 뒤git status
로 살펴보기- 파일의 삭제가
working directory
에 있음 git reset --hard
로 복원
- 파일의 삭제가
git rm tigers.yaml
로 삭제하고git status
로 살펴보기- 파일의 삭제가
Staging area
에 있음 git reset --hard
로 복원
- 파일의 삭제가
git mv
tigers.yaml
를zzamtigers.yaml
로 이름변경 뒤git status
로 살펴보기- 복원 후
git mv tigers.yaml zzamtigers.yaml
로 실행 뒤 비교
staging area 에서 working directory로 이동
git restore --staged (파일)
--staged
를 빼면 working directory에서도 제거 된다.- 예전에는
git reset Head (파일명)
으로 사용했다.
reset의 세 가지 옵션
- --soft:
repository
에서staging area
로 이동 - --mixed (default):
repository
에서working directory
로 이동 - --hard: 수정사항 완전히 삭제
HEAD
현재 속한 브랜치의 가장 최신 커밋을 HEAD
라고 부른다.
- 다음과 같이 브랜치가 여러 개를 갖고 있는 프로젝트를 준비하자. HEAD는 각 브랜치별 마지막 위치를 가리킨다. 즉,
main
브랜치의 HEAD는063a9b9
커밋 기록을 가리키고 있는 것이다.
git checkout HEAD^
^
또는~
의 갯수만큼 이전으로 이동 (reset 처럼 사라지는 것이 아닌 HEAD만 이동하는 것이다.)git checkout HEAD^^^
또는git checkout HEAD~5
git checkout (커밋해시)
를 사용해서 이동 가능하다.git checkout -
는 HEAD 이동을 한 단계 되돌린다.
- 다음과 같이 하나의 브랜치에서 과거 커밋으로 이동한 후 새로운 브랜치를 생성하여 커밋하는 경우에 사용한다고 볼 수 있다.
beta-branch
에서 한칸 전으로 이동한 뒤 새로운gamma-branch
분기가 생긴 것을 볼 수 있다.
HEAD를 사용하여 reset 하기
git reset HEAD(원하는 단계)(옵션)
git reset --hard HEAD~2
다음과 같이 원하는 분기에서 HEAD 기준으로 제거를 할 수 있다.
fetch vs pull
fetch
: 원격 저장소의 최신 커밋을 로컬로 가져오기만 함pull
: 원격 저장소의 최신 커밋을 로컬로 가져와merge
또는rebase
원격 저장소에 아무 커밋을 추가한 후 git checkout origin/main
을 해보자. 그럼 현재 새로운 해시의 브랜치로 이동하지만 변화는 없다. git fetch
를 통해 로컬로 정보를 가져오고 git checkout origin/main
을 하면 가져올 수 있다.
원격의 새 브랜치도 마찬가지로 fetch 후 git checkout origin/(브랜치명)
을 사용하여 가져올 수 있다. 로컬에도 해당 브랜치를 적용시키고 싶은 경우 git switch -t origin/(브랜치명)
을 사용하여 로컬에 적용시킬 수 있다.
본 포스팅은 '인프런 - 제대로 파는 Git & GitHub - by 얄코' 강의를 보고 정리한 내용입니다.