이 긴 글에 대해 죄송하지만 그만한 가치가 있다고 생각합니다.
나는 방금 작업 한 다른 장소와는 약간 다르게 작동하는 작은 .NET 상점으로 시작했습니다. 이전의 다른 직책과 달리 여기에 작성된 소프트웨어는 여러 고객을 대상으로하며 모든 고객이 동시에 최신 소프트웨어 릴리스를받는 것은 아닙니다. 따라서 "현재 프로덕션 버전"이 없습니다. 고객은 업데이트를 받으면 마지막 업데이트 이후 소프트웨어에 추가 된 모든 기능을 얻습니다. 소프트웨어는 고도로 구성 가능하며 기능을 켜고 끌 수 있습니다. "기능 토글"이라고합니다. 릴리스주기는 여기서 일정하지 않습니다. 기능이 완료되면 소프트웨어가 관련 고객에게 배포됩니다.
작년에만 팀이 Visual Source Safe에서 Team Foundation Server로 이동했습니다. 문제는 여전히 VFS처럼 TFS를 사용하고 단일 코드 분기에 Checkout 잠금을 적용한다는 것입니다. 버그 수정이 현장에 나올 때마다 (단일 고객이라도) TFS에 무엇이든지 빌드하고 버그가 수정되었는지 테스트하고 고객에게 배포합니다! (제약 및 의료 기기 소프트웨어 배경에서 나 자신은 믿기지 않습니다!). 결과적으로 절반의 구운 개발자 코드는 테스트조차받지 않고 생산에 투입됩니다. 버그는 항상 릴리스 빌드로 빠져 나가지 만, 버그가있는 기능을 사용하지 않으면 빌드를 방금받은 고객이이 버그를 보지 못할 수 있습니다. 갑자기 큰 고객들과 더 작은 고객들이 등장합니다.
버그가 있거나 완료되지 않은 코드의 배포를 없애고 팀 릴리스의 다소 비동기적인 특성을 희생시키지 않기 위해 소스 제어 옵션을 살펴 보라는 요청을 받았습니다. 나는 경력에 VSS, TFS, SVN 및 Bazaar를 사용했지만 TFS는 내 경험의 대부분이었습니다.
이전에 내가 작업 한 대부분의 팀은 한 달 동안 개발자가 Dev에서 직접 작업 한 다음 변경 사항이 Test와 Prod로 병합되거나 또는 "완료되었을 때"로 승격되는 Dev-Test-Prod의 2 개 또는 3 개의 지점 솔루션을 사용합니다. 고정 사이클. 크루즈 컨트롤 또는 팀 빌드를 사용하여 자동화 된 빌드가 사용되었습니다. 나의 이전 작업에서 Bazaar는 SVN 위에 앉아 사용되었습니다. 개발자는 자신의 작은 기능 지점에서 일한 다음 SVN으로 변경 사항을 푸시했습니다 (TeamCity에 연결됨). 변경 사항을 쉽게 분리하여 다른 사람들과 공유 할 수 있다는 점에서 좋았습니다.
이 두 가지 모델에는 코드가 푸시되는 중앙 개발 및 생산 (및 때로는 테스트) 분기가 있었고 (라벨을 사용하여 릴리스가 나온 제품을 빌드하는 데 표시했습니다 ... 버그 수정을 위해 분기로 만들었습니다. 릴리스하고 다시 dev로 병합). 그러나 이것은 여기서 일하는 방식에 실제로 적합하지 않습니다. 다양한 기능이 출시 될 때까지의 순서는 없으며 완료되면 푸시됩니다.
이 요구 사항을 통해 "지속적인 통합"접근 방식이 나옵니다. 지속적인 통합으로 새로운 기능을 구현하려면 dev-test-prod를 통해 기능을 푸시해야하며 개발에서 완료되지 않은 작업을 캡처합니다.
나는 이것을 극복하기 위해 우리는 dev-test-prod 브랜치가없는 무거운 피처 브랜치 모델을 내려 가야한다고 생각합니다. 소스는 개발 작업이 완료되면 잠금, 테스트, 고정, 잠그는 일련의 피처 브랜치로 존재해야합니다. 테스트하고 릴리스했습니다. 다른 피처 브랜치는 다른 브랜치가 필요 / 원할 때 다른 브랜치의 변경 사항을 가져올 수 있으므로 결국 모든 변경 사항이 다른 모든 사람에게 흡수됩니다. 이것은 내가 마지막 직장에서 경험 한 것에서 순수한 Bazaar 모델과 매우 잘 어울립니다.
유연성이있는 것처럼 어딘가에 개발 트렁크 또는 제품 분기가없는 것은 이상한 것처럼 보이며 분기를 다시 통합하지 않아도 분기 또는 다른 지점과 개발자가 불평하지 않는 작은 늦은 변경이 걱정됩니다. 재난 병합 ...
이것에 대한 사람들의 생각은 무엇입니까?
두 번째 최종 질문 : 분산 소스 제어의 정확한 정의에 대해 다소 혼란 스럽습니다. 일부 사람들은 TFS 또는 SVN과 같은 중앙 저장소가없는 것에 대해 제안하는 것 같습니다. 그리고 TFS는 완벽하게 작동하는 오프라인 모드를 가지고 있습니다) 그리고 다른 사람들은 그것이 기능 브랜치와 부모-자식 관계가없는 브랜치 간 병합의 용이성에 관한 것이라고 말합니다 (TFS는 기본이없는 병합을 가지고 있습니다!). 아마도 이것은 두 번째 질문입니다!