git에 궁금한 점이 있습니다.

hyde1004의 이미지

안녕하세요.

요즘 git, 특히 github가 대세입니다.
git가 Distributed VCS라고 알고 있습니다.
즉 중앙의 서버가 필요치 않고, 이덕분에 Network 연결 없이 commit 이 가능하고,
fork가 장려되는 것으로 알고 있습니다.
이러한 성격으로 인해 많은 open source가 github로 옮겨가고 있습니다.

저는 회사에서 주로 svn을 사용하고 있습니다.
만약 Network가 끊어지는 환경이 아니고, 또한 개발하는 project가 open source가 아니라는 가정하에서,
기존의 VCS (예를 들면 svn)과 비교하면 어떤 장점이 있을까요?
즉 svn을 git로 변경할 만한 이유가 있을까요?
(저의 git 경험은 tutorial의 간단한 예제를 실행해본 정도입니다.)

그리고 아래에 대해서도 궁금합니다.
- clone : 모든 정보를 가지고 있다. 이로 인해 중앙 서버에 접속할 필요가 없어서 log 속도가 빠르고, commit 이 가능하다.
모든 정보를 가지고 있어야 하므로, 저장 공간 크기는 더 커지게 되나요?
- fork : 개발하는 project가 open source가 아니라면, 기존의 svn에서의 branch와 동일할것 같은데요. 더 좋은 점이 있나요?
fork를 해서 변경사항을 push하는 것과 svn의 branch에서 merge하는 것과 차이가 있습니까?
- merge : git의 merge기능이 svn의 merge보다 뛰어날까요?

감사합니다.

yojo1000의 이미지

오픈소스가 아니라면 구지 바꿀필요는없다고 봅니다.

planetarium의 이미지

git을 많이 사용해본 것은 아닙니다만, DVCS의 제일 기본적인 장점중 하나는
"여럿이 작업하는 프로젝트에서 중간 작업물을 부담없이 저장할수 있다" 아닐까 합니다.
SVN의 경우는 하나의 저장소를 여러명이 공유하다보니,
특히 오류가 있는 상태라거나... 혹은 무의미해질수도 있는 찔러보기식 시도같은 것들은 저장소에 저장하기가 어렵잖아요?
반면 DVCS의 경우엔 부담없이 기록 남겨가며 작업하다가 잘 되었을때 중앙으로 올릴수 있다는게 장점인것 같습니다.

newyorker의 이미지

개인적인 경험상 가장 큰 장점은 브랜치 생성과 머지에 있다고 봅니다. svn 쓰는 동안은 항상 머지할 때마다 문제가 생기는 경우를 정말 많이 봤는데, git에서는 좀 덜하더군요. 물론 git으로 아직 svn에서 만큼 큰 프로젝트를 다뤄본 경험이 없어서일 수도 있습니다만 어쨌건 개인적으로는 머지는 훨씬 쉬웠습니다.

Hyun의 이미지

gerrit을 쓰면 코드 리뷰도 쉽게 할 수 있습니다.

jick의 이미지

예전 회사에서 svn을 썼었고, 현재 회사에서는 perforce와 git를 번갈아 쓰고 있습니다. 제가 생각할 때 git의 장점은:

* 중간 작업 결과를 맘놓고 저장할 수 있다. (개인 컴퓨터에 중간 결과를 저장하다 이제 중앙에 커밋할 수 있겠다 싶으면 그때 push하면 되죠.)
* svn에 비해 강력한 merge 기능. (제가 svn을 마지막으로 써본 게 2007년이니... 공정한 비교가 아닐 수도 있습니다.)
* 빠른 속도.

단점은:

* svn에 비하면 문서화가 정말 열악하다 못해 개판이다. (제가 작년쯤에 git 처음 써보면서 느꼈으니 지금은 좀 나을지도 모르겠습니다.) 거의 모든 git 문서는 사용자가 이미 git을 어떻게 쓰는지 개념을 잡고 있다고 가정하고 시작합니다. 개념이 없는 상태에선 몸으로 부딪혀 봐야 되는데, 몸으로 부딪혀도 되긴 되는데 이게 왜 된 건지 알수가 없습니다. 혹시라도 안되면 패닉. -_-;;
* 명령어 이름들이 매우 낯설어서, 다른 VCS 사용자가 익숙해지는 데 오래 걸린다.

제 생각엔 회사 내에 git 전문가가 있어서 뭔가 막힐 때 물어볼 수 있거나, 아니면 개발자들이 svn의 한계를 심각하게 느끼고 "뭔가 다른 걸로 바꿔보면 낫지 않을까" 하는 상황이면 git로 옮기는 것도 괜찮을 것 같습니다. (잘 돌아가는 걸 굳이 바꿀 이유는 없죠.)

이응준의 이미지

git의 가장 큰 장점은 일단 속도가 매우 빠르고, 그에 더해 편리한 기능이 굉장히 많다는 것입니다.

편리한 기능의 예:
* 버그를 찾아주는 git bisect
* 똑똑한 merge. 브랜치를 merge 할 때 리비전을 지정하지 않아도 됨
* 히스토리를 다 뒤져서 특정 단어를 찾을 수 있음 (git log --grep)
* 이미 커밋한 것도 고칠 수 있음 (git rebase)

단점은 알려진대로, svn 사용자 입장에서 사용법이 굉장히 낯설다는 점입니다.
git 도움말을 봐도 무슨말인지 알기 어려운데, 그 이유는 도움말이 git의 동작방식을 이해하고 있다는 것을 전제하고 있기 때문입니다.

따라서 동작방식을 공부하는 것이 필수입니다. 책 progit(번역이 공개되어 있음)의 1장을 읽는 정도로도 충분합니다. (9장까지 읽으면 더 좋음)
그러나 이 과정을 생략하면 1년을 매일같이 써도 어렵게만 느껴질 것입니다.

그리고 질문하신 내용에 대해:

> - clone : 모든 정보를 가지고 있다. 이로 인해 중앙 서버에 접속할 필요가 없어서 log 속도가 빠르고, commit 이 가능하다.
> 모든 정보를 가지고 있어야 하므로, 저장 공간 크기는 더 커지게 되나요?

모든 정보를 가지고 있지만, 그럼에도 불구하고 크기가 생각보다 크지 않습니다. 리눅스 커널 프로젝트를 clone해도, 크기가 1.3기가밖에 안됩니다.

> - fork : 개발하는 project가 open source가 아니라면, 기존의 svn에서의 branch와 동일할것 같은데요. 더 좋은 점이 있나요?

fork는 기존 저장소를 복제하여 새 저장소를 만들어 프로젝트를 진행한다는 개념이므로 기존의 저장소에 영향을 주지 않는다는 장점이 있습니다.

> fork를 해서 변경사항을 push하는 것과 svn의 branch에서 merge하는 것과 차이가 있습니까?

push란 내 저장소의 커밋을 원격저장소로 전송해서 merge하는 것이므로, 결국 git의 merge냐 svn의 merge냐의 차이만이 있습니다.

> - merge : git의 merge기능이 svn의 merge보다 뛰어날까요?

git의 merge가 svn의 merge보다 더 똑똑합니다. 브랜치가 갈라진 시점을 알고 있기 때문에 그 정보를 활용합니다. (svn도 1.5 이후는 mergeinfo를 저장하는 것으로 알고 있는데 머지시 활용하는지는 모르겠네요)