오늘은 GIT 교과서 3장 관련 내용입니다!
깃 저장소(Repository)는 일반적으로 폴더와 구별 없이 모두 동일하게 사용할 수 있다.
하지만 깃 저장소는 폴더와 내부적으로 구조가 다르다. 깃 저장소에는 별도의 숨겨진 폴더가 있는데, 여기에 버전 관리시스템에 필요한 파일 변경 이력을 기록한다. 저장소는 프로젝트의 모든 리비전(revision : 개정)과 히스토리를 가진 데이터베이스와 같다.
즉, 일반적인 폴더와 깃 저장소 차이점은 숨겨진 영역이 있는지 여부이다.
이제 깃 저장소에 대해 더 알아보자. 우선 깃 저장소를 만들려면 초기화 작업을 진행해야 한다.
깃에서 초기화란 이미 존재하는 폴더에 초기화 명령어로 VCS 관리를 위한 숨겨진 영역을 생성하는 작업이다.
명령어를 직접 쳐보겠다.
mkdir "폴더이름" //폴더를 만들고
cd "폴더이름" // 폴더로 이동
git init "경로" /초기화 작업
경로를 입력하지 않을 경우에는 현재 위치에서 초기화 작업이 이루어진다.
git init 명령어는 기존 폴더에 숨겨진 영역(폴더)을 추가한다. 이 영역을 추가함으로써 깃 저장소로 변경되는 것이다.
숨겨진 폴더는. git 폴더이다.
git bash에서 해당 폴더로 이동한 후 ls -a 명령어를 이용하면 확인할 수 있다. 보통 폴더 앞에 점(.)이 있으면 숨겨진 폴더를 의미한다. git 폴더에는 깃 저장소에 필요한 뼈대 파일이 담겨 있다. 이러한 파일들은 깃 초기화 작업을 통해 생성된다. 이. git 폴더는 git에 관련된 모든 사항을 기록한다. 따라서 저장소를 복사하고자 할 때. git 폴더는 필수적으로 같이 복사해야 한다.
깃은 VCS 특성 때문에 저장 공간을 논리적으로 분리한다.
'작업을 하는 공간 (워킹 디렉터리)' , '임시로 저장하는 공간(스테이지)', 실제로 저장하여 기록하는 공간(repository)'으로 나눌 수 있다.
다음은 워킹 디렉터리 개념이다. 말 그대로 로컬 저장소에 접근할 수 있으며, 실제로 파일을 생성하고 수정하는 공간이다. 단순하게 파일을 저장하는 공간이라고 생각하면 된다. 스테이지 영역과 연결되어 있다.
깃의 추적(tracked) 개념을 알아보자. 깃이 다른 VCS보다 뛰어난 것은 지정된 파일들의 모든 것을 추적하는 관리 시스템이기 때문이다. 깃은 워킹 디렉터리에 있는 파일들을 '추적됨(tracked)'과 '추적되지 않음 (untracked)' 상태로 구분한다.
- untracked 상태 - 실제 작업 중인 파일은 워킹 디렉터리 안에 있다. 워킹 디렉터리는 현재 작업 중인 소스 코드를 담고 있으며, 운영 체제도 워킹 디렉터리 안에 있는 파일들만 접근하고 수정할 수 있다. 워킹 디렉터리는 사용자 작업 공간이라고 생각하면 된다. 이 공간에 파일을 추가하거나 수정했다고 해서 깃이 자동으로 관리해 주지는 않는다. 워킹 디렉터리에 새로 생성된 파일은 모두 추적되지 않음(untracked) 상태다. 이 파일을 관리하려면 깃에 추적하라고 통지해 주어야 한다. 통지하지 않은 파일은 깃에서 따로 추적하지 않는다.
- tracked 상태 - 워킹 디렉터리에 있는 새 파일을 추가하면 '추적되지 않음' 상태다. 워킹 디렉터리 안에 추적되지 않는 상태의 파일들은 별도로 명령어를 실행하여 추적 상태로 변경해 주어야 한다. 이때 git add 명령어를 사용한다.
깃은 요청받은 파일만 추적 관리한다. 깃 입장에서는 어떤 파일이 정말로 추적 관리가 필요한지 알 수 없다. 그래서 추적하는 파일들을 tracked 상태로 표시한다. 깃의 시스템 부하를 줄이고, 효율적인 관리를 위해 tracked, untracked 개념을 사용하는 것이다.
다음은 스테이지의 영역이다. 필자는 개인적으로 공부하기 전에 스테이지 영역이 제일 궁금했었다.
스테이지는 '임시로 저장하는 공간'을 의미한다. 스테이지 영역은 워킹 디렉터리에서 제출된 tracked 파일들을 관리한다.
즉 스테이지는 워킹 디렉토리와 실제로 저장하는 공간(Repository) 사이에 있는 영역이다. 깃은 워킹 디렉토리에서 작업이 끝난 파일을 스테이지로 잠시 복사한다. 스테이지가 임시 영역이라고 해서 파일의 콘텐츠 내용을 직접 가지고 있지는 않는다. 단지 커밋하려는 파일의 추적 상태 정보들만 기록한다.
이처럼 임시 영역인 스테이지를 별도로 운영하는 것은 커밋을 빠르게 처리하기 위해서다. Repository는 스테이지 영역에서 가리키는 파일 내용을 기반으로 변경된 차이점만 기록한다.
스테이지 상태는 status 명령어로 확인이 가능하다.
스테이징 영역에서 등록된 모든 파일들은 untracked 상태에서 tracked 상태로 변경된다. 스테이지는 워킹 디렉터리 안에 있는 파일들의 추적 상태를 관리하는 역할을 수행한다. 스테이지 영역에 등록된 파일들은 다시 stage 상태와 unstage 상태로 구분된다. 깃이 변화 이력을 기록하려면 파일들의 최종 상태가 stage 상태여야 한다. unstage 상태라면 파일에 변화가 있다는 것을 의미한다. 즉, 스테이지 영역에 있는 파일과 워킹 디렉터리 안에 있는 파일 내용에 차이가 있을 때는 unstage 상태가 된다. unstage 상태라고 해서 실제 파일이 없어지는 것은 아니다. 단지 파일이 수정되어 임시적으로 스테이지 목록에서 제외된 것이다. git add 명령어를 사용하면 다시 스테이지에 추가가 가능하다.
코드를 변경하는 것은 워킹 디렉터리에서 파일을 수정하는 것이다. 파일이 수정되면 워킹 디렉터리와 스테이지 간 내용이 맞지 않는다. 따라서 스테이지는 수정한 파일과 원본을 구분하려고 수정함(modified) 상태와 수정하지 않음(unmodified)상태로 표현한다. 파일 수정 작업은 스테이지 영역과 긴밀한 상관관계를 맺는다.
- modified 상태 - 스테이지에 등록된 파일은 깃이 추적 관리한다. 깃이 실제로 기록한 파일이며, 사실상 버전을 의미한다. 개발 작업에서 수많은 코드가 변경되고, 깃을 사용하면 이 변경 내역은 영구적으로 기록된다. 앞에서 설명했듯이 깃은 tracked 상태인 파일만 수정 여부를 관리할 수 있다. tracked 상태인 파일이 수정되면 스테이지는 파일 상태를 modified 상태로 변경한다. 그러면 수정된 파일은 스테이지에서 잠시 제외된다. 깃은 수정 여부만 체크해 주기 때문에 modified 상태로 변경된 파일은 스테이지로 재등록해야 한다. 수정된 파일을 스테이지 영역에 다시 추가하려면 git add 명령어를 사용해 재등록해야한다.
- unmodified 상태 - unmodified 상태는 tracked 상태이면서 스테이지에서 한 번도 수정하지 않은 원본 상태를 의미한다. 이처럼 수정하지 않은 파일들은 재등록하지 않아도 된다. 스테이지에 등록한 후 수정한 적이 없으면 unmodified 상태다.
이상 포스팅을 마칩니다.
댓글