육감적 코딩

[Git 교과서]3장. 깃 개념 잡기 본문

정리/Git

[Git 교과서]3장. 깃 개념 잡기

감감감감감감 2021. 11. 12. 19:58

3.1 깃 저장소 생성

깃은 작선된 소스 코드 파일의 모든 변경 사항을 관리합니다.

변경 사항은 전용 저장소(repository)에 저장합니다.

3.1.1 폴더와 깃 저장소

깃은 파일의 변경 내역을 어떻게 저장하고 관리할 수 있을까요?

깃 저장소는 외형적으로 폴더와 비슷합니다. 하지만 깃 저장소는 내부적으로 구조가 다릅니다. 깃 저장소에는 별도의 숨겨진 영역(숨겨진 폴더)이 있는데, 여기에 버전 관리 시스템(VCS)에 필요한 파일 변경 이력을 기혹합니다.

3.1.2 초기화

깃에서 초기화란 이미 존재하는 폴더에 초기화 명령어로 VCS 관리를 위한 숨겨진 영역을 생성하는 작업을 의미합니다.

해당 경로로 이동한 뒤,

git init

을 하면 초기화가됩니다. (숨겨진 폴더 생성)

3.1.3 숨겨진 폴더 =.git 폴더

깃 저장소를 초기화한다는 것은 별도의 숨겨진 폴더를 하나 추가하고 환경 설정 파일을 생성하는 것입니다.

숨겨진 파일은

ls -a

로 확인 할 수 있습니다.

보통 포더 이름 앞에 점(.)이 있으면 숨겨진 폴더를 의미합니다.

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

이 폴더는 모든 파일 및 브랜치등 이력을 기록합니다. 따라서 컴퓨터에서 깃 저장소를 통째로 복사하고자 할 때는 숨겨진 .git 폴더 까지 같이 복사해야 합니다.

3.1.4 소스트리와 연결

3.2 워킹 디렉터리

깃의 동작을 이해하려면 먼저 워킹 디렉터리(working directory) 개념을 알아야 합니다. 다른 용어로 워킹 트리(working tree)라고도 합니다.

3.2.1 워킹 디렉터리라?

깃의 저장 공간은 크게 '작업하는 공간(working)' , '임시로 저장하는 공간(stage)' , '실제로 저장하여 기록하는 공간(repository)'으로 나눕니다. 이렇게 논리적으로 공간을 분히나는 것은 깃의 동작과 이력을 좀 더 효율적으로 처리하기 위해서입니다.

워킹 디렉터리는 '작업을 하는 공간'을 의미합니다. 말 그대로 로컬 저장소에 접근할 수 있으며, 실제로 파일을 생성하고 수정하는 공간입니다. 단순하게 파일을 저장하는 공간이라고 생각하면 됩니다.

3.2.2 파일의 untracked 상태와 tracked 상태

깃의 추적(tracked) 개념을 알아봅시다. 깃의 뛰어난 점은 지정된 파일들의 모든 것을 추적하는 관리 시스템 때문입니다.
깃은 워킹 디렉터리에 있는 파일들을 '추적됨'과 '추적되지 않음' 상태로 구분합니다.

untracked 상태

실제 작업 중인 파일은 워킹 디렉터리 안에 있습니다. 현재 작업 중인 소스 코드를 담고 있으며, 운영 체제도 워킹 디렉터리 안에 있는 파일들만 접근하고 수정할 수 있습니다.

워킹 디렉터리에 파일을 추가하거나 수정했다고 해서 깃이 자동으로 관리해 주지는 않습니다. 워킹 디렉터리에 새로 생성된 파일은 모두 추적되지않음(untracked) 상태 입니다. 이 파일을 관리하려면 깃에 추적하라고 통지해 주어야 합니다.

tracked 상태

워킹 디렉터리 안에 추적되지 않는 상태의 파일들은 별도로 명령어를 실행하여 추적(track) 상태로 변경해 주어야 합니다. 이때는 git add 명령어를 사용합니다.

git3-1

깃은 요청받은 파일들만 추적 관리합니다. 수많은 파일을 모두 자동으로 처리해야 한다면 시스템에 엄청난 부하가 발생하기 때문입니다.

3.3 스테이지

깃은 여러 단계의 논리적인 저장 공간을 가지고 있습니다. 스테이지(stage)는 '임시로 저장하는 공간'을 의미합니다. 스테이지 영역은 워킹 디렉터리에서 제출된 tracked 파일들을 관리합니다.

3.3.1 스테이지 = 임시 영역

스테이지는 워킹 디렉터리와 '실제로 저장하여 기록하는 공간' 사이에 있는 임시 영역 입니다. 깃은 워킹 디렉터리에서 작업이 끝난 파일을 스테이지로 잠시 복사합니다. 스테이지가 임시 영역이라고 해서 파일의 콘텐츠 내용을 직접 가지고 있지는 않습니다. 단지 커밋하려는 파일의 추적 상태 정보들만 기록합니다.

임시 역역인 스테이지를 별도로 운영하는 것은 커밋을 빠르게 처리하기 위해서입니다. '실제로 저장하여 기록하는 공간'인 저장소는 스테이지 영역에서 가리키는 파일 내용을 기반으로 변경된 차이점만 기록합니다.

파일들의 스테이지 상태는 status 명령어로 확인 가능합니다. 또는 깃의 git ls-files 같은 명령어로도 확인 가능합니다.

ex)
git status
git ls-files —stage

스테이지 영역에 등록된 파일들은 또 다시 stage상태와 unstage 상태로 구분됩니다.

3.2.2 파일의 stage 상태와 unstage 상태

워킹 디렉터리에 있는 tracked 상태의 파일들은 스테이지 영역과 긴밀한 상관관계를 맺습니다.

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

unstage 상태라면 파일에 변화가 있다는 것을 의미합니다. 즉, 스테이지 영역에 있는 파일과 워킹 디렉터리 안에 있는 파일 내용에 차이가 있을 때는 unstage 상태가 됩니다.

또 넓게 보면 아직 스테이지 영역으로 등록하지 않은 워킹 디렉터리 안의 파일도 unstage 상태라고 생각할 수 있습니다. 이때는 unstage 상태이자 동시에 untracked 상태 입니다.

unstage 상태라고 해서 실제 팡ㄹ이 없어지는 것은 아닙니다. 단지 파일이 수정되 임시적으로 스테이지 목록에서 제외된 것 입니다. git add 명령어를 사용하면 스테이지에 다시 추가할 수 있습니다.

3.3.3 파일의 modified 상태와 unmodified 상태

코드를 변경한다는 것은 워킹 디렉터리에서 파일을 수정하는 것을 의미합니다. 파일이 수정되면 워킹 디렉터리와 스테이지 간 내용이 일치하지 않습니다. 따라서 구분을 위해 수정함(modified) 상태와 수정하지 않음(unmodified) 상태로 표현합니다.

modified 상태

스테이지에 등록된 파일은 깃이 추적 관리합니다. 깃이 실제로 기록한 파일이며, 사실상 버전을 의미합니다.

앞에서 설명했듯이 깃은 tracked 상태인 파일만 수정 여부를 관리할 수 있습니다. tracked 상태인 파일이 수정되면 스테이지는 파일 상태를 modified 상태로 변경 합니다.

git3-2

그러면 수정된 파일은 스테이지에서 잠시 제외됩니다. 깃은 수정 여부만 체크해 주기 때문에 modified 상태로 변경된 파일은 스테이지로 재등록해야 합니다. 수정된 파일을 스테이지 영역으로 다시 적용하려면 git add 명령어로 재등록합니다.

unmodified 상태

unmodified 상태는 tracked 상태이면서 스테이지에서 한 번도 수정하지 않은 원본 상태를 의미합니다.

3.2 절과 3.3 절에서 배운 개념을 그림 하나로 정리하면 다음과 같습니다. 워킹 디렉터리에서 등록 명령(git add 명령어)을 실행하면 스테이지에 등록됩니다. 이때 자동으로 tracked 상태가 됩니다. 파일을 수정하지 않으면 계속 stage 상태에 머무릅니다. 파일이 수정되면 modified 상태가 되고, 스테이지에서 떨어져 나와 unstage 상태가 됩니다. unstage 상태의 파일은 워킹 디렉터리에 잠시 담아 둡니다. 이때 다시 등록 명령을 실행하면 stage 상태로 변경됩니다.

git3-3

3.4 파일의 상태 확인

이번에는 파일들의 상태를 모니터링할 수 있는 status 명령어를 알아봅니다.

3.4.1 status 명령어로 깃 상태 확인

파일을 생성하고 수정한다는 것은 변화를 의미합니다.

status 명령어를 사용하면 깃의 상태 메시지를 확인할 수 있습니다. 특히 status 명령어는 많이 사용하는 깃 명령어 중 하나입니다.

$git status —— 상태 확인
On branch master
No commit yet —— 커밋이 없다는 메시지
nothing to commit (create/copy files and use 'git add' to track ) —— 변경된 내용이 없다는 메시지

깃 저장소를 처음으로 생성하고, 실습 이후에 아무 작업도 하지 않았습니다. status 명령어를 실행하면 이처럼 변경된 내용과 커밋이 없다고 메시지를 출력할 것입니다. 나중에 커밋 명령을 수행하면 status 명령어로 파일들의 변경된 상태를 확인할 수 있습니다.

3.4.2 소스트리에서 깃 상태 확인

3.5 파일 관리 목록에서 제외: .gitignore

프로젝트를 하다 보면 모든 파일을 추적하지 않아야 하는 경우도 있습니다. 실제 작업하다 보면, 워킹 디렉터리에 불필요한 파일이 생성되거나 보안에 민감한 파일들이 있을 수 있습니다. 로컬 저장소를 혼자 사용한다면 문제가 없지만, 공유한다면 이 파일들을 분리해서 관리해야 합니다.

3.5.1 .gitignore 파일

이 파일은 앞에 점(.)이 있어 숨겨진 파일로 관리됩니다.

.gitignore 파일은 깃에서 관리하지 않는 파일들의 목록을 가지고 있습니다. 깃은 이 파일에 작성된 목록들을 추적하지 않습니다. 또 로컬 저장소를 서버로 전송하거나 다른 사람과 공유할 때도 이를 분리하여 처리합니다.

특별한 도구 없이 파일 이름만 .gitignore로 만들면 됩니다. 제외할 파일 목록을 직접 적어주거나 규칙을 사용하여 나열할 수 있습니다. .gitignore 파일을 작성할 때는 저장소 폴더의 최상위 디렉터리에 두어야 합니다.

3.5.2 .gitignore 파일 표기법

파일에서 #으로 시작하는 줄은 주석으로 처리합니다.

#DB 접속 파일을 제외함
dbinfo.php

애스터리스크(*) 기호는 모든 문자열을 대체할 수 있습니다. 이러한 문자를 셸 글로빙(globbing)이라고 합니다.

#오프젝트 파일은 제외함
*.obj

제외하지 않는 파일과 필요한 파일은 파일 이름 앞에 느낌표(!)를 사용합니다. 느낌표는 not을 의미합니다.

#환경 설정 파일은 제외하면 안 됨
!config.php

깃에서 디렉터리를 표현할 때는 리눅스와 같이 슬래시(/) 기호를 사용합니다.

#현재 디렉터리 안에 있는 파일 무시
/readme.txt

#/pub/ 디렉터리 안의 모든 것을 무시
/pub/

#doc 디렉터리 아래의 모든 .txt 파일 무시
doc/*/.txt

깃은 glob 패턴을 지원하기 때문에 정규 표현식을 응용하여 규칙을 넣을 수도 있습니다.

3.6 깃 저장소 복제

외부에 있는 기존 프로젝트(깃허브, 비트버킷)를 기반으로 저장소를 생성하고 싶다면 어떻게 해야 할까요? 외부 저장소를 복제해서 생성할 수 있습니다. 이처럼 외부 저장소를 이용하여 로컬 저장소를 생성하는 것을 '깃 저장소 복제'라고 합니다.

3.6.1 공개 저장소

깃은 다수의 사람과 코드를 공유하여 협업하여 개발하는 도구입니다.

깃 호스팅 서비스는 공개된 저장소와 비공개된 저장소를 모두 지원합니다. 공개된 저장소는 누구나 복제하여 코드를 내려받을 수 있습니다.

3.6.2 다운로드 vs 복제

소스코드를 내려받는 다는것은 해당 코드의 최종 복사본을 내 컴퓨터로 가져오는 것입니다. 하지만 이러한 내려받기는 깃의 이력을 포함한 저장 영역까지 내려받는 것은 아닙니다.

이와 달리 깃을 이용하여 저장소를 복제하면, 최종 코드뿐만 아니라 중간에 커밋 같은 변화의 모든 이력도 같이 내려받을 수 있습니다.

3.6.3 복제 명령어

깃의 저장소를 복제하는 명령어는 clone 입니다. 복제하려면 공개된 저장소의 URL이 필요합니다. 복제할 때 폴더 이름을 지정하지 않으면 공개 저장소에서 사용된 폴더와 동일한 이름으로 새 폴더를 만듭니다. 다른 이름으로 복제하길 원한다면 새 폴더 이름을 추가 인자로 적어 줍니다.

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

'정리 > Git' 카테고리의 다른 글

[Git 교과서]7장. 임시 처리  (0) 2021.11.30
[Git 교과서]6장. 브랜치  (0) 2021.11.23
[Git 교과서]5장. 서버  (0) 2021.11.21
[Git 교과서]4장. 커밋  (0) 2021.11.21
[Git 교과서]1장. 깃과 버전 관리  (0) 2021.11.12
Comments