2013년 9월 6일 금요일

2013-12: 고급 SW엔지니어로 가는 길 ③Git은 배워야 한다

들어가는 글: Git을 사용한지도 3년이 넘었다. 부끄럽게도 최소한의 명령어인 git pull / git push로 근근히 버텨오던 내게 드디어 '한계'가 찾아왔다. 최근 조직개편으로 나의 든든한 'Git 전문가'들은 모두 다른 팀에 있는 터라 충격이 더 컸다. 문제는 잘 해결되었지만 크게 반성하는 계기가 되었다. Git은 배워야 하는구나...


0. 지난 3년간 Git 사용기 

운이 좋게도 내가 속한 부서에는 항상 Git의 전문가가 있었다. 예전 회사에서는 CVS, SVN을 선도적으로 도입하자고 주장을 해왔던 나지만 Git 세계에 와서는 진짜 가장 최소한의 명령어만 사용하고 근근히 버텨왔던 것이다. Git이 와닿지 않았고 주변에 전문가에게 '물어보면' 되니까! 문제가 없었다.

GUI 툴을 쓰기보다는 콘솔에서 git command를 직접날리는 내 모습을 보며 '오~ 이정도면 되는거 아닌가?'라는 착각에 빠져들기 딱 좋은 나날들이었다.

<근근히 Git 쓰는 방법>
 - git init : 초기화 한다. 회사에서 문서 다 준다.
 - repo sync : 해당 branch 땡긴다.
 - repo start : 시작한다.

 - repo sync . 혹은 git pull : 난 두개의 차이가 무엇인지도 모른다.
 - git add -A : 추가하면 무조건 실행한다.
 - git commit : 커밋한다.
 - repo upload : git push랑 똑같음 (gerrit 연동하여 소스리뷰함)


1. Git은 무조건 어려워 


CVS, SVN을 쓰다가 Git으로 처음 넘어오면 하는 말이 'Git은 너무 어려워'이다. 나도 그랬고 덕분에 3년이라는 시간동안 정말정말 최소한의 필요한 명령어만 사용했던 것이다.

Git은 왜 어려울까?

1) SVN은 정말 단순하다. 내려받고(synchronize) 비교하고 커밋하면 끝난다. 이게 끝이다. 마치 중앙서버에 붙어있는 단말기(terminal)로 통신하는 것에 비유될 수 있다. 2009년까지 개발할 때는 branch라는 개념도 거의 없었던 것 같다. trunk라는 단일 브랜치면 충분했었다.

하지만 Git은 먼저 repository라는 개념부터 알아야 한다. 왜냐면 중앙서버가 아니니까. 그 얘기는 내 PC에도 레파지토리가 있고 서버에도 레파지토리가 있고 다른 개발자의 PC에도 레파지토리가 있는 것이다.

즉, '레파지토리가 있다' 라는 개념부터 시작해야 한다.

2) Git은 배워야 알 수 있다. 

SVN의 경우 시스템이라기 보다는 집에서 사용하는 망치, 줄자, 드라이버와 같은 소도구에 비교할 수 있다. 즉, 배울 필요가 없다. 상식만 가지도 쉽고 유용하게 사용할 수 있다.

Git은 배워야 알 수 있다.

Git이 무엇인지도 알아야 하고, 왜 복잡한 명령어가 필요한지도 공부하면 좋을 듯 하다. 요즘에는 좋은 gui tool도 많이 나와 있지만 급한 길도 돌아가라고 git command를 잘 쓰면 여러모로 훨씬더 power user에 가까이 갈 수 있다고 생각한다.


2. Git 어떻게 배울 것인가 


인터넷에 수많은 좋은 자료가 있다. Pro Git이라는 책은 무료로 배포가 된다.

 - git 궁극의 매뉴얼: http://git-scm.com/docs 
 - Pro git 책(한글)  : http://git-scm.com/book/ko 

하지만 내가 요즘 읽고 있는 요 책은 정말 감동적이다. 내 주변의 'Git 전문가'가 추천해준 책으로 Git의 원리부터 설명하는 접근법이 매우 맘에든다. 영어라는 점이 속도를 더디게 하지만 충분히 의욕을 가지고 도전해볼만한 서적이다. 

 - 제목 : Version Control with Git


3. Git이란 무엇인가 


Git이란 무엇인가? 왜 공부해야만 하는 주제인가? 소스코드 올리고 내리는 개발 tool 아닌가?

휴대폰을 개발하기 위해서는 수백명의 개발자가 투입되고 따라서 개발팀 , 운영팀의 Git repository는 별도 운영된다. 개발팀은 1개의 휴대폰만 개발하는 것이 아니고 어떤 모듈은 전 모델을 공통 대응하거나 아니면 특정 사업자의 모듈에만 대응해야 하기 때문에 그 관계는 매우 복잡하다.

 - 개발팀 : 프로그램을 개발하는 repository 운영
 - 운영팀 : 실제 휴대폰의 source를 build하는 역할(배포)

문제는 개발팀과 운영팀의 관계가 M:N 관계라는 데 있다.
그리고 수백명이 하루에도 몇만 라인을 갈아치울 수도 있다.

Git은 이러한 수많은 변경사항을 conflict를 최소화하면서 운영하게 해주는
소스코드 관리 시스템인 것이다.

     "Git은 도구가 아니고 배워야 알고 쓸 수 있는 소스코드 관리 시스템이다." 유동환

1) Git의 기본단위는 repository이다. 레파지토리는 중앙에만 있는 것이 아니다. 개발자 PC 각각에 존재한다.

2) Git은 파일을 저장하지 않는다. 각각을 object라고 부른다. 파일이 아니라 object라는 생각은 매우 중요하다. 객체 지향에서 말하는 그런 개념은 절대 아니며 '파일이 아니다'라고 생각하면 좋겠다.

3) Git은 SHA1를 통해 구별한다.


Summary 

1. Git은 배워야 알고 쓸 수 있다. 명령어를 쓰자.

2. Git의 기본단위는 레파지토리다. 각각의 레파지토리다.

3. Git은 파일을 저장하지 않는다. object를 사용한다.

4. Git은 SHA1으로 구별한다. 변경을 식별한다.


** 앞으로 Git에 관해서 몇 편더 글을 써볼까 합니다. Git맹에서 Git활용자로 거듭나는 모습을 보여드리고 싶습니다. 감사합니다.

2013.9.7 @Home







댓글 없음:

댓글 쓰기