Essential Git
인류의 역사에 인쇄술의 발명이 있었다면, 프로그래밍의 역사에는 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 master
의 origin
, master
과4 bare
저장소의 개념을 통해 분산 저장소의 진수를 맛보면 좋다. 이 때가 되면 staging의 개념도 잘 잡히게 되고, 분산 저장소가 어떤 점에서 장점을 가지고 있는지, 그리고 Linus Torvalds가 얼마나 대단한 사람인지를 알게 된다.5
더불어 히스토리를 관리할 때는 log
가 유용하고, tag
도 잘 활용하면 좋다. 특히 좋은 브랜칭 모델은 좀 더 편리한 개발환경을 가능하게 한다. (예시, 배워보기)
아래는 괜찮은 Git 튜토리얼 몇 개.
함께 쓰면 좋은 도구로는 gitk
, gitweb
, scm-breeze
그리고 흥미롭게도 드랍박스가 있다. 물론 GitHub
도 빼놓을 수 없다.
여기서
git commit -m "Message"
를 입력하라고 했는데, 사실은git commit
만 입력하고 편집기에서 commit message를 입력하는 것이 더 바람직하다. 하지만 그러기 위해서는 nano나 vim 같은 에디터의 사용법까지 알아야하기 때문에 여기서는 문제를 단순화하기 위해-m
플래그를 사용했다. ↩Commit log는 여러줄로 입력 가능한데, 첫 줄에 주요내용을 담은 후 상세한 내용을 bullet으로 최대한 간략하게 적는다. 충실히 적는다는 것은 elaboration이 아니라 clarity를 의미한다. 이렇게 하거나 이렇게하면 혼난다.ㅎㅎ ↩
이건 꼭 Java 처음 배울 때
public static void main
이 뭔지 하나하나 알아가는 것과 유사하다고 생각. 일단 쓰고 보는거다… ↩