오픈소스SW

오픈소스SW_Chapter03_깃 시작

강용민 2022. 10. 10. 17:48

깃 저장소

깃 저장소를 레포지토리(repository)라고도 부르며 일반적으로 사용하는 폴더와 유사하다.

깃 저장소에는 이력 정보가 관리되며 깃은 작성된 소스 코드 파일의 모든 변경 사항을 관리한다.

 

깃 저장소와 폴더

일반 폴더와 깃 저장소는 유사하지만 내부적으로 구조가 다르다.

깃 저장소에는 별도의 숨겨진 영역(숨겨진 폴더)이 있는데, 여기에 VCS에 필요한 파일 변경 이력을 기록한다. 즉, 일반적인 폴더와 깃 저장소 차이점은 숨겨진 영역이 있는지의 여부이다.

 

초기화 

깃 저장소를 생성하려면 먼저 초기화 작업이 필요한데, 여기서 초기화란 VCS 관리를 위한 숨겨진 영역을 생성하는 작업이다.

초기화를 하기위해서 터미널에 다음의 초기화 명령어를 입력해야한다.

git init 경로명

 

숨겨진 폴더

깃 초기화를 하면 해당 경로에 .git 폴더가 숨겨져 있다.

.git 폴더에는 깃 저장소에 필요한 모든 뼈대 파일이 담겨 있다.

  • 깃으로 관리되는 모든 파일 및 브랜치 등 이력을 기록
  • 컴퓨터에서 저장소를 통쨰로 복사하고자 할 떄는 숨겨진 .git 폴더까지 같이 복사해야 한다.
  • 로컬 컴퓨터에서 .git폴더를 삭제하거나 함께 복제하지 않으면 깃의 모든 이력은 없어진다.

 

워킹 디렉터리(working directory)

깃은 VCS의 특성 때문에 저장 공간을 논리적으로 분리한다.

저장 공간을 크게 3가지로 다음과 같이 구분한다.

  • 작업을 하는 공간(working)
  • 임시로 저장하는 공간(stage)
  • 실제로 저장하여 기록하는 공간(repository)

그 중 워킹 디렉터리는 작업을 하는 공간으로 로컬 저장소에 접근할 수 있으며, 실제 파일을 생성하고 수정하는 공간이다.

 

untracked / tracked

깃이 다른 VCS보다 뛰어난 장점은 지정된 파일들의 모든 것을 추적하는 관리 시스템 구조이기 때문이다.

하지만 모든 파일을 자동으로 완벽하게 관리하는 것은 시스템에 엄청난 부하를 발생기키기에 불가능하다.

깃에서는 어떤 파일이 정말로 추적 관리가 필요한지 알 수 없으므로 깃은 요청받은 파일들만 추적 관리한다.

이를 위하여 깃은 워킹 디렉터리에 있는 파일들을 'tracked'와 'untracked'상태로 구분한다.

  • untracked 상태
    • 실제 작업 중인 파일은 working directory 내부에 존재한다.
    • 워킹 디렉터리에 파일을 추가하거나 수정했다고 해서 깃이 자동으로 관리해 주지는 않는다.
    • 워킹 디렉터리에 새로 생성된 파일은 모두 추적되지 않음(untracked)상태이다.
      • 새로운 파일을 관리하려면 깃에 추적하라고 통지해야 한다.
      • 통지하지 않은 파일은 깃에서 따로 추적하지 않는다.
  • tracked 상태
    • untracked상태면 깃은 해당 파일을 추적하지 않는다. 즉 관리되지 않는 대상이다.
    • 워킹 디렉터리 안에 추적되지 않는 상태의 파일들은 별도로 명령어를 실행하여 추적(tracked) 상태로 변경해주어야 한다.
    • git add "파일명"

 

스테이지(stage)

스테이지는 '임시로 저장하는 공간'을 의미하며 워킹 디렉터리에서 제출된 tracked 파일들을 관리한다.

스테이지는 워킹 디렉터리와 리포지토리(repository) 사이에 있는 임시 역역으로 깃은 워킹 디렉터리에서 작업이 끝난 파일을 스테이지로 잠시 복사한다.

하지만 스테이지가 임시 영역이라고 해서 파일의 콘텐츠 내용을 직접 가지고 있지는 않는다. 단지 커밋하려는 파일의 추적 상태 정보들만 기록한다.

 

필요성

임시 영역인 스테이지를 별도로 운영하는 이유는 커밋을 빠르게 처리하기 위해서이다.

리포티토리는 스테이지 영역에서 가리키는 파일 내용을 기반으로 변경된 차이점만 기록한다.

파일들의 스테이지 상태는 status 명령어로 확인 가능하다.

 

stage / unstage

스테이지 영역으로 등록된 모든 파일은 untracked 상태에서 tracked 상태로 변경된다.

스테이지는 워킹 디렉터리 안에 있는 파일들의 추적 상태를 관리하는 역할을 수행한다.

스테이지 영역은 파일을 stage 상태와 unstage 상태로 구분한다. 깃이 변화 이력을 기록하려면 파일들의 최종 상태가 stage 상태여야 한다.

  • stage
    • 깃이 변화 이력을 기록하려면 파일들의 최종 상태가 stage 상태여야 한다.
  • unstage
    • 스테이지 영역에 있는 파일과 워킹 디렉터리 안에 있는 파일 내용에 차이가 있을 때 unstage 상태가 된다.
    • 넓게 보면 아직 스테이지 영역으로 등록하지 않은 워킹 디렉터리 안의 파일도 unstage상태이다. 즉, unstage 상태이자 untracked 상태이다.
    • unstage 상태라 해서 실제 파일이 없어지는 것이 아니라 단지 파일이 수정되어 임시적으로 스테이지 목록에서 제외된 것이다.
    • git add명령어를 사용하면 스테이지에 다시 추가할 수 있다.

 

modified / unmodified

  • modified
    • 깃이 실제로 기록한 파일이며, 사실상 버전을 의미
    • 앞서 설명했듯이 과부하 때문에 깃은 tracked사애인 파일만 수정 여부를 관리할 수 있다.
    • tracked 상태인 파일이 수정되면 스테이지는 파일의 상태를 modified 상태로 변경하고 수정된 파일은 스테이지에서 잠시 제외 된다.
    • 깃은 수정 여부만 체크해 주기 떄문에 modified는 untracked 상태여서 반드시 등록 명령으로 다시 스테이지 상태로 재등록해야 한다.
  • unmodified
    • tracked 상태이면서 스테이지에서 한 번도 수정하지 않은 원본 상태를 의미한다.
    • 깃은 파일의 수정 여부를 체크하고, 스테이지 영역의 갱신 작업 여부를 작업자에게 알려준다.

파일 상태 확인

status명령어를 이용하여 깃의 상태를 확인할 수 있다.

 

파일 관리 목록에서 제외

.gitignore

파일 뿐만 아니라 서브 폴더와 그 안의 파일들도 추적 관리에 포함한다. 그러나 프로젝트를 하다 보면 모든 파일을 추적하지 않아야 하는 경우도 있다.

이런 경우 깃으로 관리하고 싶지 않은 파일과 폴더는 별도의 .gitignore 설정 파일 안에 나열해서 적어 준다.

단 .gitignore 파일을 작성할 때는 저장소 폴더의 최상위 디렉터리에 두어야 한다.

 

표기법

  • *
    • * 기호는 모든 문자열을 대체할 수 있다.
    • 이를 통해 파일 확장자 기준으로 제외 시킬 수 있다. ex) *.properties
    • ignore 패턴을 작성할 때 추적 관리를 제외하는 파일만 작성하는 것은 아니다.
    • 제외하지 않는 파일과 필요한 파일은 파일 이름 앞에 !기호를 사용한다.

 

깃 저장소 복제

외부에 있는 기존 프로젝트(깃허브)를 기반으로 로컬에 저장소를 생성하고 싶다면 외부 저장소를 복제해서 생성할 수 있다.이를 깃 저장소 복제라 한다.

 

다운로드 vs 복제

다운로드는 원하는 코드의 최종 복사본은 내 컴퓨터로 가져오는 것 뿐 이력을 포함한 저장 영역까지 내려받는것은 아니다.

깃을 이용하여 저장소를 복제하면, 최종 코드뿐만 아니라 중간에 커밋 같은 변화의 모든 이력도 같이 내려받을 수 있다. 물론 일부 코드를 변경하여 기여하는 것도 가능하다.

git clone 원격저장소URL 새폴더이름

 

문제

깃 초기화는 어떻게 하는가?

git init

 

폴더와 깃 저장소의 차이는 무엇인가?

숨겨진 폴더(.git)의 유무이다. .git폴더에서는 깃으로 관리되는 모든 파일 및 브랜치등 이력을 관리한다.

 

깃의 상태를 확인하려면 어떤 명령어를 사용하는가?

git status

 

저장공간의 분류

분류 정의 및 특징
working directory 실제 파일을 생성하고 수정하는 공간. 작업을 하는 공간이다.
로컬 저장소에 접근할 수 있으며 untracked 파일과 tracked파일이 동시에 공존한다.
stage working directory에서 제출한 tracked파일들을 관리한다.
stage상태와 unstage상태로 나뉘며, 각 파일은 git add를 통해 stage상태여야 커밋을 할 수 있다.
modified상태와 unmodified상태로 나뉘며 stage상태에서 파일을 수정하면 modified상태로 바뀌고 unstage상태로 변경된다. 
modified상태에서 git add를 통해 스테이지에 올려야한다.
repository 푸쉬를 통해 실제로 저장하여 기록하는 공간

 

git ignore파일에서 꼭 필요한 파일은 올리기 위해서는 어떤 표기를 해야하는가

!

 

다운로드와 복제의 차이는 무엇인가

복제는 최종 코드 뿐아니라 중간 커밋 같은 모든 이력도 같이 내려받을 수 있다.

 

깃에서 등록은 워킹 디렉터리에 있는 파일을 스테이지 역역으로 복사하는 것을 의미한다.

이때 복사는 무엇을 의미하는가?

실제 파일을 본사하는 것을 의미하는 것이 아닌 깃 내부에서 논리적인 기록을 변경하는 과정이다.

 

스테이지 영역으로 등록된 파일들은 모두 unmodified상태인가?

아니다. 모두 tracked상태일 뿐 modified상태나 unmodified상태가 있다. 만약 modified상태라면 git add 명령어를 통해 stage상태로 변경해야 한다.

 

'오픈소스SW' 카테고리의 다른 글

오픈소스SW_Chapter05_서버  (0) 2022.10.10
오픈소스SW_Chapter04_커밋  (0) 2022.10.10
오픈소스SW_Chapter02_깃설정  (0) 2022.10.10
오픈소스SW_Chapter01_깃과 버전 관리  (0) 2022.10.10
오픈소스SW_Chapter06_브랜치  (0) 2022.10.04