Subversion (및 CVS)에서는 저장소가 가장 중요합니다. git과 mercurial에는 실제로 같은 방식으로 저장소의 개념이 없습니다. 여기서 변화는 중심 주제입니다.
+1
CVS / SVN의 번거 로움은 이러한 시스템이
변경의 부모 역할을 기억 하지 못한다 는 사실에서 비롯 됩니다. Git과 Mercurial에서는 커밋에 여러 자식이있을 수있을뿐만 아니라 여러 부모도있을 수 있습니다!
즉, 쉽게 그래픽 도구 중 하나를 사용하여 관찰 할 수 있습니다 gitk
또는 hg
view
. 다음 예제에서 브랜치 # 2는 커밋 A의 # 1에서 분기되었으며 이후 한 번 병합되었습니다 (M에서 커밋 B와 병합 됨).
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
A와 B에는 두 명의 자녀가있는 반면 M에는 두 명의 부모가 있습니다. 이러한 관계는 저장소에 기록 됩니다. 이제 분기 # 2의 관리자가 분기 # 1의 최신 변경 사항을 병합하려고한다고 가정 해 보겠습니다. 다음과 같은 명령을 실행할 수 있습니다.
$ git merge branch-1
도구는 기본 이 B 라는 것을 자동으로 인식합니다. 왜냐하면 # 2 팁의 조상 인 커밋 M에 기록되었고 B와 C 사이에 발생한 모든 것을 병합해야하기 때문입니다. CVS는이 정보를 기록하지 않습니다. , 버전 1.5 이전의 SVN도 마찬가지입니다. 이러한 시스템에서 그래프는 다음과 같습니다.
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
여기서 M은 A와 B 사이에 일어난 모든 일에 대한 거대한 "분쇄 된"커밋이며 M 위에 적용됩니다. 증서가 완료된 후에는 M 위치에 대한 흔적이 남지 않습니다 (잠재적으로 사람이 읽을 수있는 주석 제외). 에서도의 유래 않았다 얼마나 많은 역사를 훨씬 더 꿰 뚫을 만들기 - 함께 붕괴되었다 커밋.
하나는 병합 기지 (첫 번째 병합시 무엇인지 파악하는 하나는 : 설상가상으로, 두 번째 병합을 수행하는 것은 악몽이되고 있다 을 알고
처음부터 병합이되었다는!), 그 후 현재 M 위에 A..B를 재생하지 않도록 도구에 정보를 제공합니다.이 모든 것은 긴밀한 협업으로 작업 할 때 충분히 어렵지만 분산 환경에서는 불가능합니다.
(관련된) 문제는 "X에 B가 포함되어 있습니까?"라는 질문에 답할 방법이 없다는 것입니다. 여기서 B는 잠재적으로 중요한 버그 수정입니다. 따라서 해당 정보 는 병합 시간에 알려 지므로 커밋에 해당 정보를 기록하면 안됩니다 !
추신. -SVN 1.5+ 병합 녹음 기능에 대한 경험이 없지만 워크 플로는 분산 시스템보다 훨씬 더 인위적인 것 같습니다. 이것이 사실이라면 아마도 위의 의견에서 언급했듯이 변경 사항 자체가 아닌 저장소 구성에 중점을 두었 기 때문일 것입니다.