2016년 10월 9일 코코넛냠냠


1. 필수 개념

다음은 깃을 사용하기 위해서 반드시 알고 이해하고 넘어가야 하는 용어들입니다.


- 작업공간 (working space)

개인 컴퓨터 환경에서 소스코드를 편집하는 일반적인 프로젝트 폴더를 일컬어 작업공간이라고 합니다.


- 저장소 (저장공간; 레포지토리; repository)

작업공간을 Git이 제공하는 자료구조 안에 압축시켜 넣은 것입니다. 저장소는 로컬 저장소와 원격 저장소로 나뉩니다. 일반적으로 저장소라고 하면 로컬 저장소를 가리킵니다. git init 명령어로 해당 작업공간의 저장소를 생성하면 작업공간 하위에 .git이라는 이름의 폴더가 생깁니다. 작업공간 안의 .git 폴더가 바로 로컬 Git 저장소입니다. 이 저장소 안에 모든 커밋들이 들어있습니다.


- 원격 (원격 저장소; 리모트 저장소; remote repository)

저장소가 내 PC의 프로젝트 폴더 안이 아닌 다른 어딘가의 서버에 위치해 있으면 원격 저장소라고 합니다. 원격 저장소를 사용하면 여러 사람이 서버에 있는 하나의 저장소를 공유해서 공동으로 작업할 수 있기 때문에 편리합니다.


- 커밋 (commit; 변경사항; 이력; snapshot; 스냅샷)

(명사) 어떤 순간 작업공간의 상태를 저장한 것입니다. 작업공간 안에 있는 모든 파일과 파일의 데이터를 사진 찍듯이 복사해서 저장소에 보존합니다. 즉 커밋은 작업공간의 어떤 시점의 스냅샷이라고 할 수 있습니다.

(동사) '커밋한다'는 말은 커밋을 추가한다는 뜻입니다. 즉 현재 작업공간의 상태를 커밋으로 만들어서 저장소에 저장한다는 의미입니다.



2. 배경 지식


- 깃(Git)

리눅스 커널을 개발하신 리누스 토발즈가 만든 버전 관리 툴(VCS; Version Control System)입니다. (리누스 토발즈는 리눅스를 오픈소스로 공개하고 개발 관리를 책임졌기 때문에 버전 관리 같은 일에 일가견이 있는 인물입니다.) 프로그래머가 작성한 소스 코드를 압축해서 리포지토리에 저장해 둔 다음 변경 이력을 열람하거나 불러올 수 있도록 만든 것이 깃입니다. 리눅스 태생인 만큼 기본적으로 리눅스 기본 쉘(Bash)을 이용해서 깃 명령어를 하나씩 입력하여 실행하는 방법으로 기능을 이용하지만, GUI 툴 등도 존재합니다.


- 커밋의 대략적 구조

커밋이란 git commit 명령어로 저장소에 올리는 작업공간의 하나의 변경된 상태입니다. 하나의 커밋이 더해질 때는 이전 커밋에서 변경된 사항만 추가하면 될 것입니다. 이 때문에 커밋은 서로 연결된 체인 구조를 형성합니다. 이 구조에서는 예컨대 이전 커밋이 훼손되면 그 이후 커밋도 망가집니다.



3. 용어1

- 추적(스테이지; stage): 작업공간에서 변경이 발생한 파일을 다음 커밋에 포함되도록 예약하는 것을 추적이라고 합니다. 어떤 파일을 추적하면 그 파일을 스테이지되었다고 합니다. 추적되는 파일은 스테이지 영역(stage area)에 들어가 있게 됩니다.

- 추적해제(언스테이지; unstage): 추적하고 있는 파일을 스테이지 영역에서 제외하는 것을 언스테이지라고 합니다.

- 커밋해시(commit hash): git log 명령어로 조회할 수 있는 커밋 해시는 각 커밋을 구분하는 Extended SHA-1 형식의 식별자입니다.


4. 용어2

- 브랜치(branch): 커밋에서 분기하면 브랜치가 됩니다. 말 그대로 한 갈래; 가지를 의미합니다.

- master: 기본 설정된 브랜치에 붙는 이름입니다.

- origin: 기본 설정된 원격 주소에 붙는 별명입니다.

- 태그(Tag): 알아보기 쉽게 하기 위해서 커밋(commit)에 달아 주는 별명입니다.

- HEAD: 현시점에서 작업중인 브랜치를 가리키는 포인터입니다. 작업공간이 현재 위치해 있는 브랜치를 가리킵니다.


5. 파일

- .git : 깃 저장소(레포지토리; repository) 폴더입니다.

- .gitignore : 작업공간 안에서 깃이 무시하게 하고 싶은 파일을 정의하는 파일입니다. 이 때 .gitignore 파일 자신도 커밋되어 있어야 효력이 적용됩니다. .gitignore 파일 안에 추적을 원하지 않는 파일들의 이름 패턴을 적어 넣고 커밋하면 그 파일들은 git status 목록에서 빨간색으로 나타지도 않고 git add . 명령어에서 제외됩니다.


6. 기본(로컬) 명령어

- git status : 마지막 커밋 이후 작업공간에서 변경이 일어난 모든 파일들을 나열하는 명령어입니다. 현재 추적되고 있는 파일을 초록색으로 표시하고 그렇지 않은 파일은 빨간색으로 나타냅니다.

- git add : 해당 파일을 추적(stage)시키는 명령어입니다. 추적되고 있는 파일만 커밋에 포함됩니다. 주로 git add . 의 형태로 사용합니다. git add . 명령어는 변경이 일어난 모든 파일을 추적하게 합니다.

- git rm : 해당 파일을 추적해제(unstage)시키는 명령어입니다. git add 명령어의 반대입니다.

- git commit : 커밋을 추가하는 명령어입니다. 커밋 명령어를 사용해서 커밋을 추가하는 것을 가리켜 '커밋한다'라고 부릅니다. 주로 git commit -m "(코멘트; 커밋에 덧붙일 말)" 형식으로 사용합니다. (참고: 명령어 입력중 덧붙일 말 사이에 줄바꿈을 추가하고 싶을 수 있습니다. 터미널에서는 Shift + Enter 를 입력하면 개행합니다.)

- git log : 커밋 이력을 열람할 수 있도록 하는 명령어입니다.

- git checkout : 커밋을 불러오는 명령어입니다. git checkout (커밋 해시) 형식으로 사용합니다. 커밋 해시는 전부 적을 필요는 없고 다른 커밋 해시와 중복되지 않아 고유하다면 앞의 몇 자리만 기입해도 인식됩니다. (팁: 가장 최근의 커밋을 기준으로 하여 작업공간에서 발생한 변경사항을 모두 버리고 원래 상태로 돌아가는 명령어는 git checkout -- . 입니다.)

- git diff : 커밋과 커밋 사이의 변경사항을 확인할 수 있게 하는 명령어입니다.


7. 원격 명령어

- git remote : 원격과 로컬 저장소를 연결시키는 명령어입니다.

- git clone : 로컬에서의 git init에 해당하는 명령어입니다. 원격에서 저장소를 최초로 가져올 때는 git pull 대신 git clone을 쓰는 것입니다.

- git fetch : 원격에서 업데이트된 저장소를 받아와서 로컬 저장소를 갱신하는 명령어입니다.

- git pull : git fetch 한 다음 작업공간까지도 갱신하는 명령어입니다.

- git push : 원격에 내 로컬 저장소를 올리는 명령어입니다. 원격과 로컬 저장소 변경 사이에 충돌이 있는 경우에 덮어씌운다, 합친다, 브랜치 등 선택할 수 있는 몇 가지 옵션은 있지만 그런 일은 거의 일어나지 않습니다.


8. 상표의 구분

- Git: 깃은 버전 관리 소프트웨어입니다.

- GitLab: 원격 저장소를 만들고 관리하는 일을 도와주는 툴입니다. 깃이 설치된 환경에 별도로 추가적으로 설치해서 사용합니다.

- GitHub: 깃허브는 깃허브라는 회사의 서버를 빌려서 원격 저장소를 만들고 관리할 수 있게 하는 웹사이트입니다. 공개 프로젝트에 한해서 무료입니다. 프로젝트를 비공개로 진행하고 싶고 어딘가의 서버에 내 소스코드를 제공하는 것이 싫다면 GitLab을 사용합니다. 깃이 설치되어 있어야 사용할 수 있습니다.


(본문의 끝입니다.)

Top