본문 바로가기
Git

[Git] Git 보다 깊이 알기

by yoon_seon 2023. 6. 6.

Git 보다 깊이 알기

1. Git을 특별하게 만드는 것

2. Git의 3가지 공간

3. HEAD

4. fetch vs pull


📌 Git을 특별하게 만드는 것

다른 VCS들과 달리 차별되는 Git의 강점에 대해 알아보자

1. Snapshot 사용

Git은 델타방식을 사용하는 기존 VCS들과 달리 스냅샷 방식을 사용하여 효율적으로 파일을 관리한다.

 

델타 방식(SVN)

  • 각 변화가 누적된 것으로 계산된다.
  • 각 버전들의 파일 변경사항을 누적하며 계산되며 파일의 생성부터 변경사항들을 따라가야 해서 커밋이 많아질수록 속도가 느려진다.

스냅샷 방식

  • 각 시점에 존재하는 파일들을 스냅샷으로 기록하여 새로운 버전이 만들어질 때, 해당 버전의 최종 파일로 관리된다.
  • 각 시점 최종상태의 파일들이 풀(pull)로 저장되어 있기 때문에 속도가 빠르다.

 

2. 분산 버전 관리

중앙 집중식 버전 관리가 아닌 분산 버전 관리로 서버와 연결되지 않아도 로컬에서 작업할 수 있다.

 

중앙 집중식 버전관리

  • 원격 저장소에 의존적으로 원격 저장소와 통신할 수 있는 네트워크 장애가 발생하면 작업을 할 수 없다.
    로컬에서는 중앙의 현재 버전으로 다운받은 파일로만 작업을 할 수 있음.
  • 서버에 문제가 생겼을 때 협업할 수 없고, 백업 또한 할 수 없다는 문제와 서버의 하드디스크에 문제가 생기면 모든 히스토리를 잃을 수 있는 위험성이 있다.

분산 버전 관리

  • 원격에 있는것을 clone으로 받아와 전체 Git 커밋과 브랜치까지 받아올 수 있으며 모든 구성원이 Git 상태까지 공유하기 때문에 네트워크에 문제가 생겨도 로컬에서 작업이 가능하며 네트워크 장애 해결 시 push와 pull로 동기화할 수 있다.

 


📌 Git의 3가지 공간

 

Working directory

  • untracked: ADD 된 적 없는 파일, ignore 된 파일
  • tracked: ADD 된 적 있고 변경내역이 있는 파일
  • git add 명령어로 Staging area로 이동

Staging area

  • 커밋을 위한 준비 단계
    • 예시: 작업을 위해 선택된 파일들 git commit 명령어로 repository로 이동

Repository

  • .git directory라고도 불림
  • 커밋된 상태

정리하자면, 소스파일을 생성한 결과물은 Working directory의 untracked에 존재하고 ADD하여 스테이징 영역에 올리고  COMMIT 하여 Repository에 올리고 Repository에 있는 파일을 수정하면 Working directory의 Tracked에 존재하는 것이다.

 

 

Reset의 세 가지 옵션

  • git reset
    • -- soft : repositroy에서 staging area로 이동
    • -- mixed (default) : repository에서 working directory로 이동
    • -- hard : 수정사항 완전히 삭제

 


📌 HEAD

현재 속한 브랜치의 가장 최신 커밋을 HEAD라고 한다.

다음과 같이 여러개의 브랜치가 있다. HEAD는 각 브랜치별 마지막 위치인 가장 최신 커밋을 가리킨다. 즉, main 브랜치의 HEAD는 063a9b9 커밋 기록을 가르키고 있는 것이다.

 

git checkout HEAD^ 명령어를 통해 이전 커밋시점으로 돌아갈 수 있다.

 


📌 fetch vs pull

  • fetch : 원격 저장소의 최신 커밋을 로컬로 가져오기만 함
  • pull : 원격 저장소의 최신 커밋을 로컬로 가져와 merge 또는 rebase

 

fetch는 원격 리포지토리의 변경 내용을 확인하고 로컬 리포지토리를 업데이트하지만 작업 트리나 현재 브랜치에는 영향을 주지 않는다. pull은 git fetch를 수행하면서 자동으로 가져온 변경 내용을 현재 브랜치에 병합하여 로컬 작업 트리와 현재 브랜치를 업데이트한다.

, git pull은 git fetch와 git merge 또는 rebase를 합친 명령어인 것이다.

 

원격 저장소에 아무 커밋을 추가한 후 git checkout origin/main 을 해보자. 그럼 현재 새로운 해시의 브랜치로 이동하지만 변화는 없다. git fetch 를 통해 로컬로 정보를 가져오고 git checkout origin/main 을 하면 가져올 수 있다.

 

원격의 새 브랜치도 마찬가지로 fetch 후 git checkout origin/(브랜치명) 을 사용하여 가져올 수 있다. 로컬에도 해당 브랜치를 적용시키고 싶은 경우 git switch -t origin/(브랜치명) 을 사용하여 로컬에 적용시킬 수 있다.

'Git' 카테고리의 다른 글

[Git] CLI vs GUI, Reset vs Revert, Merge vs Rebase  (0) 2023.06.03

댓글