LHJ

I'm a FE developer.

2.2.4 깃과 버전 컨트롤

12 Apr 2020 » js_lj

이 책에서 버전 컨트롤에 대해 자세히 설명하지는 않지만, 혹시 버전 컨트롤을 사용하지 않았다면 지금부터라도 사용하십시오.
아직 깃에 익숙하지 않다면 이 책을 통해 기회가 있으니 꼭 익숙해지기 바랍니다.

먼저 프로젝트 루트에서 저장소를 초기화합니다.

$ git init

이 명령은 프로젝트 저장소를 만드는 명령입니다.
이제 프로젝트 루트에 숨김 디렉터리 .git이 생겼습니다.

버전 컨트롤을 사용하다 보면 깃에서 추적하지 않았으면 하는 파일이 분명 생길 겁니다.
빌드 과정에서 생기는 파일, 임시 파일 같은 것들입니니다.
.gitignore 파일을 만드십시오.

# npm 디버그 기록
npm-debug.log*

# 프로젝트 의존성
node_modules

# macOS 폴더 속성
.DS_Store

# 임시 파일
*.tmp
*~

이 밖에도 쓸모없는 파일이 있어서 제외하고 싶다면 여기 추가하면 됩니다.
예를 들어 에디터에서 파일을 저장할 때마다 .bak 파일을 만든다면 이 리스트에 *.bak을 추가하면 됩니다.

깃을 사용하다 보면 git status 명령을 아주 많이 사용하게 될 겁니다.
이 명령은 저장소의 현재 상태를 출력하는 명령입니다.
지금 해 보십시오.
다음과 같은 내용이 보여야 합니다.

$ git status
On branch master

Initial commit

Untracked files:
	(use "git add <file>..." to include in what will be committed)
	.gitignore
	
nothing added to commit but untracked files present (use "git add" to track)

여기서 눈여겨볼 점은 깃이 디렉터리에 새 파일(.gitignore)이 있지만, 추적하고 있지 않다(untracked)고 보고하는 겁니다.

깃 저장소를 사용하는 작업의 기본 단위는 커밋입니다.
현재 저장소에는 커밋이 없습니다.
저장소를 초기화하고 파일을 하나 만들었지만, 깃에 등록한 것은 아무것도 없습니다.
깃은 어떤 파일을 추적해야 하는지 짐작하지 않으므로 .gitignore 파일을 명시적으로 저장소에 추가해야 합니다.

$ git add .gitignore

아직 커밋은 하지 않았습니다.
다음 커밋에서 .gitignore 파일을 커밋하게끔 대기(stage) 시키기만 했습니다.
git status 명령을 다시 실행하면 달라진 것이 있습니다.

$ git status
On branch master

Initial commit

Changes to be committed:
	(use "git rm --cached <file>..." to unstage)
	
		new file: .gitignore

이제 .gitignore를 커밋할 준비가 됐습니다.
아직 커밋은 하지 않았지만, 다음에 커밋할 때는 .gitignore를 변경한 내용이 포함될 겁니다.
파일을 더 추가할 수 있지만, 일단 커밋을 해 봅시다.

$ git commit -m "Initial commit: added .gitignore."

이 명령에서 -m 다음에 있는 것은 커밋 메시지입니다.
커밋할 때마다 간단한 설명을 붙일 수 있습니다.
커밋 메시지를 읽어보면 프로젝트를 어떻게 바꿔 왔는지 알 수 있습니다.

커밋을 일종의 프로젝트 스냅샷이라 생각해도 됩니다.
지금 찍은 스냅샷에는 .gitignore 파일 하나만 있고, 필요하다면 언제든 이 상태로 돌아올 수 있습니다.
git status 명령을 다시 내리면 다음과 같은 화면을 볼 수 있습니다.

On branch master
nothing to commit, working directory clean

프로젝트를 조금 더 바꿔봅시다.
npm debug.log 파일을 무시하도록 .gitignore 파일을 설정 했는데, 확장자가 .log인 파일은 모두 무시하도록 바꿔 봅시다.
.gitignore 파일을 열고 npm-debug.log*를 *.log로 바꿉니다.
프로젝트 설명을 마크다운 형식으로 제공하는 것이 일반적이니 README.md 파일도 하나 만듭시다.

# Learning JavaScript, 3rd Edition
## Chapter 2: JavaScript Development Tools

In this chapter we're learning about Git and other development tools.

다시 git status 명령을 내리면 다음과 같은 화면을 볼 수 있습니다.

$ git status
On branch master
Changes not staged for commit:
	(use "git add <file>..." to update what will be committed)
	(use "git checkout -- <file>..." to discard changes in working directory)
	
		modified: .gitignore
		
Untracked files:
	(use "git add <file>..." to include in what will be committed)
	
		README.md

바뀐 것이 두 가지 있습니다.
하나는 추적 중인 파일 .gitignore이고 다른 하나는 새 파일 README.md입니다.
앞서 git add 명령을 내렸던 것과 똑같이 할 수도 있습니다.

$ git add .gitignore
$ git add README.md

하지만 이번에는 와일드카드를 써서 바뀐 사항을 모두 추가하게 한 다음 한꺼번에 커밋해 봅시다.

$ git add -A
$ git commit -m "Ignored all .log files and added README.md."

프로젝트를 만들다 보면 이 작업, 즉 바뀐 것을 추가하고 커밋하는 작업을 아주 자주 하게 될 겁니다.
커밋 메시지는 짧고 논리적으로 일관되게 만들어야 합니다.
당신이 생각하는 내용을 다른 사람에게 설명한다고 생각하고 커밋 메시지를 만드십시오.

$ git add -A
$ git commit -m "[brief description of the changes you just made]"

TIP 초보자들은 git add라는 명령을 보고 저장소에 ‘파일을 추가한다’고 착각하곤 합니다.
물론 새 파일을 추가하는 경우도 있겠지만, 저장소에 이미 있는 파일을 수정하는 경우도 많습니다.
다시 말해, 파일이 아니라 변경사항을 추가하는 겁니다.

여기서 설명한 것은 깃으로 하는 작업 중 가장 간단한 것입니다.
깃에 대해 더 자세히 알고 싶다면 깃허브의 초보자용 자료를 보거나, 존 롤리거와 매튜 맥컬로프가 쓴 Version Control with Git, 2nd ed. (O’reilly, 2012)을 보십시오.
https://git-scm.com/book/ko/v2에 한글로 번역된 문서가 있으므로 필요할 때마다 찾아보면 도움이 될겁니다.