인류의 역사에 인쇄술의 발명이 있었다면, 프로그래밍의 역사에는 VCS이 있다. (그 정도로 중요하다는 것)

오늘날 VCS는 크게 집중형(ex: SVN)과 분산형(ex: Hg, Git)으로 나눠볼 수 있는데, 여기서는 그 중 분산형 저장소인 Git을 단시간 안에 사용할 수 있도록 핵심적인 명령어들을 살펴보기로 한다.

Configuration

Git을 설치했다는 가정하에 사용설정부터 한다.

git config --global user.name "Lucy Park"
git config --global user.email "[email protected]"

이건 코드 저장소(repository)에 수정된 파일을 올릴 때(commit), 누가 수정을 했는지 기록을(labeling)하기 위함이다.
최초에 한 번만 하면 된다.

Cloning

저장소의 주소가 https://github.com/octocat/Spoon-Knife.git라고 하면 다음과 같이 Spoon-Knife 폴더로 코드를 복사(cloning)해서 수정할 수 있다.

git clone https://github.com/octocat/Spoon-Knife.git
cd Spoon-Knife/
...[이후 원하는대로 코드 수정]...

Pulling and Pushing

Cloning 후에 index.html 파일을 수정했다고 하자. 수정된 파일을 업로드하고 싶을 때는, 다음과 같이하면 된다.1

git pull origin master      # 그 사이에 업데이트 된 파일이 있는지 확인하기 위함
git status                  # 'Changes not staged for commit'에 'index.html'가 있음
git diff                    # 뭐가 수정된 것인지 확인
git add index.html          # 업로드할 파일들을 한 군데에 모아둠 (staging)
git status                  # 'Changes to be committed'에 'index.html'이 있음
git commit -m "Message"     # 수정사항을 *상세히* 기록함
git status                  # 'Your branch is ahead of 'origin/master' by 1 commit'
git push origin master      # 서버로 수정된 코드를 푸시하는 단계

자, 끝이다.
일단 이렇게 clone, pull, status, diff, add, commit, push의 일곱 개 키워드만 알면 혼자서 Git을 써보는데는 충분하다.2 이 때 git status와, 충실한 commit log 기록3만 습관화하면 금상첨화.

협업을 할 땐 나와 다른 사람이 파일을 동시에 수정을 했을 때(conflict) 어떻게 merge하는지를 알아두는 것이 중요하다. (사실 auto-merging 될 때가 많지만)

rebase, reset 등 다른 명령어도 많지만 이들의 개념은 꾸준히 삽질사용을 하다보면 자연스레 습득하게 된다.

이후 Git에 익숙해져서 그에 대해 좀 더 알고 싶어지면, git push origin masterorigin, master4 bare 저장소의 개념을 통해 분산 저장소의 진수를 맛보면 좋다. 이 때가 되면 staging의 개념도 잘 잡히게 되고, 분산 저장소가 어떤 점에서 장점을 가지고 있는지, 그리고 Linus Torvalds가 얼마나 대단한 사람인지를 알게 된다.5

더불어 히스토리를 관리할 때는 log가 유용하고, tag도 잘 활용하면 좋다. 특히 좋은 브랜칭 모델은 좀 더 편리한 개발환경을 가능하게 한다. (예시, 배워보기)

아래는 괜찮은 Git 튜토리얼 몇 개.

함께 쓰면 좋은 도구로는 gitk, gitweb, scm-breeze 그리고 흥미롭게도 드랍박스가 있다. 물론 GitHub도 빼놓을 수 없다.

  1. 여기서 git commit -m "Message"를 입력하라고 했는데, 사실은 git commit만 입력하고 편집기에서 commit message를 입력하는 것이 더 바람직하다. 하지만 그러기 위해서는 nano나 vim 같은 에디터의 사용법까지 알아야하기 때문에 여기서는 문제를 단순화하기 위해 -m 플래그를 사용했다. 

  2. 여기에 이 과정에 대한 깔끔한 그림이 있다. 

  3. Commit log는 여러줄로 입력 가능한데, 첫 줄에 주요내용을 담은 후 상세한 내용을 bullet으로 최대한 간략하게 적는다. 충실히 적는다는 것은 elaboration이 아니라 clarity를 의미한다. 이렇게 하거나 이렇게하면 혼난다.ㅎㅎ 

  4. 이건 꼭 Java 처음 배울 때 public static void main이 뭔지 하나하나 알아가는 것과 유사하다고 생각. 일단 쓰고 보는거다… 

  5. Yes, Git was definitely written in C.