답변:
바로.
열쇠는 스승님의 정책이 무엇인지에 대한 문제입니다. git을 사용하면 일반적으로 Master의 분기 정책이 빌드 가능한 안정적인 릴리스입니다. 때때로 마스터는 릴리스 브랜치에 병합하기 전에 브랜치가 만들어지고 병합되는 '기본'입니다. 이들은 두 가지 역할 / 정책 접근 방식입니다.
사람들이 프로젝트를 통해 지점의 역할이나 정책을 변경하는 것은 종종 오류의 원인입니다. 솔로 개발자는 이러한 변경 사항을 컨트 리뷰 터에게 전달하는 것이 더 쉽지만, 수십 명의 프로그래머가 모든 사람들에게 알리려고 노력하고 있습니다. "마스터는 이제 1.0입니다.
위의 정책 접근 방식을 다루었습니다. Master의 정책은 빌드 가능한 안정적인 릴리스라는 것입니다. 당신이 뭔가를하지 않아도이 수단에 작은 증분 변경에 확인 빌드 할에 항상 안정. 작은 변경 사항을 확인하지 않는 것이 최선의 정책 인 경향이있는 (그리고 쉬운 분기로 권장되는) "많은 (완전한) 체크인"에 반대합니다.
역할 기반의 관점에서 마스터는 기본, 릴리스, 유지 관리 및 개발 역할 인 마스터로 시작한 다음 개발 및 유지 관리 역할이 지점으로 이동하는 과정을 어느 정도 중단했습니다. 이것은 다시 마스터에서 허용되는 내용의 변경을 의미하며 기여자가 어디에 속하는지 혼동 할 수 있습니다. 또한 지점 기록을 (약간) 혼동하여 병합을 이해하기가 더 크고 어려운 큰 커밋을 장려 할 수 있습니다.
처음부터 간단하고 일관된 지점의 역할과 정책을 키하십시오.
이 "정책 변경에 대한 분기 "는 분기 패턴 에서 볼 수 있습니다 . 역할이있는 각 지사의 아이디어는 Advanced SCM Branching Strategies 에서 읽을 수 있습니다 . 둘 다 아주 잘 읽습니다.
일반적으로 브랜치 작업을 시작하려는 두 가지 상황이 있습니다.
사용자 또는 팀이 다음 릴리스 (첫 번째 릴리스 일 수 있음)에 추가되지 않을 가능성이 가장 적은 새 기능을 시작한 경우 별도의 기능 분기에서 개발을 시작하십시오.
최신 릴리스에 심각한 버그에 대한 수정 사항을 제공해야하고 해당 수정 사항 만 포함하지만 새로 개발 된 (아마도 불안정한) 기능이없는 새로운 버그 수정 릴리스를 작성하려는 경우
이러한 종류의 결정에 대해서는, 프로그램의 첫 번째 컴파일 가능 / 실행 가능한 버전이있는 시점에서 항상 "새로운 기능"또는 "버그 수정"의 관점에서 생각하는 것이 도움이된다고 생각합니다.
마이클 페더스 (Michael Feathers)는 그의 유명한 저서에서 변경해야 할 네 가지 이유를 나열 하지만, "새로운 기능 브랜치"(비 기능적 기능의 경우) 아래에 "자원 최적화"를, "새로운 기능 브랜치"의 경우에도 대부분 "디자인 개선"을 넣을 것입니다. IMHO는 특정 기능 의 구현을 보다 쉽게 하기위한 목적으로 설계를 개선해서는 안됩니다 .
git-flow 를 따르는 경우 -그리고 솔직히 Git을 사용하고 해당 브랜칭 모델을 사용 하지 않으면 미쳤다고 생각합니다 . 공개 릴리스를 실제로 준비 할 때까지 절대 커밋 해서는 안됩니다master
.
첫 번째 커밋 master
은 빈 저장소 여야합니다. 다음 커밋 master
은 develop
브랜치 또는 임시 릴리스 브랜치 의 병합 커밋 이어야하며 안정적이며 테스트되어 배포 (응용 프로그램 인 경우) 또는 공개 배포 (라이브러리 인 경우) 준비가되어 있어야합니다.
가 있는 다른 분기 모델 힘내 위해,하지만 그들 중 대부분은 나이가 중앙 집중식 SCM 모델에서 파생 한과 DVCS 환경에서 심각한 문제가 발생할 수 있습니다. 실제로 git-flow 확장을 사용할 필요는 없으며 반드시 릴리스 / 핫픽스 / 기능 분기가 모두 필요하지는 않지만 베어 본은 develop
및 master
이며 불안정한 코드가 들어갑니다 develop
.
master
. master
자식에게는 특별한 것이 아니라는 것을 기억하십시오 . 릴리스를 원할 때까지 개발 브랜치를 가질 수 있습니다.
Thoughtworks의 Neal Ford는 "지옥 병합"문제를 피하기 위해 분기에 기능 토글을 사용하도록 권장합니다. 두 프로그래머가 매일 메인 브랜치에서 정식으로 병합하고 몇 주 동안 상당한 변경을 한 다음 커밋하는 경우를 고려하십시오. 다른 프로그래머는 병합 지옥으로 끝날 수 있습니다. 이 문제를 피하기 위해 Ford는 지점이 하나만 있고 매일 커밋함으로써 "고통을 가져 오는 것"(잘 알려진 민첩한 속성)을 권장합니다. 기능이 완전히 테스트 될 때까지 기능을 비활성화하는 기능 토글을 통해 추가 기능이 추가됩니다.
이 방법론은 커밋 문제가 즉시 포착되므로 지속적인 전달을 구현하는 환경에서 가장 잘 작동하는 것 같습니다.
이 질문에 대한 마지막 답변 이후 2 년이 지났으며 이제 이야기가 바뀌 었다고 생각합니다. 나에게 답은 "소스 코드 컨트롤을 사용하여 버전을 추적 할 때마다"입니다.
자세히 설명하자면, 요즘 소스 코드 제어로 프로젝트 버전을 추적하는 것이 항상 작동하는 것은 아닙니다. (예를 들어 npm을 사용하여 종속성을 관리하고 '^'로 의미 버전을 지정하는 경우)이 경우 빌드가 발생할 때마다 프로젝트 아티팩트가 변경되며, 매번 소스 코드 변경에 필요하지 않습니다. 이런 종류의 새로운 과제를 처리하기 위해 일부 팀은 프로젝트 버전 추적을 위해 이슈 제어 시스템 (예 : JFrog Artifactory)에 저장된 '아티팩트'를 이미 구축하기로 선택했습니다.
분명히 아티팩트 버전 제어가 이미있는 경우 GIT 분기에서 '프로덕션 코드'를 가져 와서 제작 / 배치하지 않고 직접 아티팩트 제어 시스템에 문의하여 직접 실행할 수있는 버전을 배포 할 수 있습니다. 이러한 경우 '릴리즈 브랜치'라는 개념이 갑자기 의미를 잃어 버렸습니다. 그리고 팀이 git 브랜치를 릴리스 버전과 연관시키지 않기로 결정할 때마다 마스터에 직접 커밋 / 푸시는 다시 한 번 올바른 선택이됩니다. 리포지토리가 복제 될 때마다 기본 브랜치로 제공되므로 시맨틱이 널리 받아 들여지고 잘 전달됩니다. 변화. 여전히 받아 들여진 대답에서 알 수 있듯이 master를 포함하여 지점에 역할을 할당하고 해당 특정 지점에만 해당 지점을 사용해야합니다.
마지막으로 한 걸음 더 나아가서 소수의 핵심 커미터가있는 프로젝트에서 master를 개발 브랜치로 사용하도록 제안합니다. 우리 팀의 경우는 아마도 대부분의 마이크로 서비스 상점에서도 마찬가지입니다. 마스터에 커밋하면 변경 프로세스의 통신이 제거되고 여러 스프린트에서 기능을 작업 할 때 '지옥 병합'을 피할 수 있습니다. 또한 마스터 브랜치의 코드는 '작동'할 필요가 없으며 자동화 된 빌드 / 테스트 프로세스는 무엇이 잘못되었는지 알려주며 어쨌든 git history를 확인하고 빌드 / 테스트를 중단 한 저자에게 연락하기에 충분히 쉽습니다 :-)