새 프로젝트에 대한 마스터 링을 언제 중단해야합니까?


26

새로운 프로젝트가 시작될 때마다 "안정적인"무언가를 얻을 수있을 때까지 마스터에게 직접 커밋하여 시작한 다음, 지점에서 일을 시작하는 것이 좋습니다.

적어도 이것이 내가 정상적으로하는 방법입니다. 두 번째 커밋에서 즉시 분기를 시작하는 방법이 있습니까? 이런 식으로하는 것이 합리적입니까? 분명히, "초기 커밋"은 항상 마스터가되지만, 그 이후에 새로운 기능을위한 브랜치를 만들기 시작하는시기가 언제인지 알 수 있습니까?

답변:


23

바로.

열쇠는 스승님의 정책이 무엇인지에 대한 문제입니다. git을 사용하면 일반적으로 Master의 분기 정책이 빌드 가능한 안정적인 릴리스입니다. 때때로 마스터는 릴리스 브랜치에 병합하기 전에 브랜치가 만들어지고 병합되는 '기본'입니다. 이들은 두 가지 역할 / 정책 접근 방식입니다.

사람들이 프로젝트를 통해 지점의 역할이나 정책을 변경하는 것은 종종 오류의 원인입니다. 솔로 개발자는 이러한 변경 사항을 컨트 리뷰 터에게 전달하는 것이 더 쉽지만, 수십 명의 프로그래머가 모든 사람들에게 알리려고 노력하고 있습니다. "마스터는 이제 1.0입니다.

위의 정책 접근 방식을 다루었습니다. Master의 정책은 빌드 가능한 안정적인 릴리스라는 것입니다. 당신이 뭔가를하지 않아도이 수단에 작은 증분 변경에 확인 빌드 할에 항상 안정. 작은 변경 사항을 확인하지 않는 것이 최선의 정책 인 경향이있는 (그리고 쉬운 분기로 권장되는) "많은 (완전한) 체크인"에 반대합니다.

역할 기반의 관점에서 마스터는 기본, 릴리스, 유지 관리 개발 역할 인 마스터로 시작한 다음 개발 및 유지 관리 역할이 지점으로 이동하는 과정을 어느 정도 중단했습니다. 이것은 다시 마스터에서 허용되는 내용의 변경을 의미하며 기여자가 어디에 속하는지 혼동 할 수 있습니다. 또한 지점 기록을 (약간) 혼동하여 병합을 이해하기가 더 크고 어려운 큰 커밋을 장려 할 수 있습니다.

처음부터 간단하고 일관된 지점의 역할과 정책을 키하십시오.

이 "정책 변경에 대한 분기 "는 분기 패턴 에서 볼 수 있습니다 . 역할이있는 각 지사의 아이디어는 Advanced SCM Branching Strategies 에서 읽을 수 있습니다 . 둘 다 아주 잘 읽습니다.


3
나는이에 대부분 동의하지만, 난 그냥 언급하지 않았다 빌드 할 , 내가 말하고 싶지만 해제 (안정). 마스터는 단순히 빌드하는 코드를 포함해서는 안되며 실제로 철저히 테스트 된 코드를 포함해야합니다. 심각한 결함이 없음을 확신하면서 언제라도 마스터로부터 정보를 얻을 수 있어야합니다.
Aaronaught

IMHO가 하나의 구축 가능한 상태에서 다음 상태로의 단계가 항상 작은 증분 변화 일뿐 결코 큰 변화 가 아닌 방식으로 작동하는 것이 가능하기 때문에 Aaronaught에게 전적으로 동의합니다 .
Doc Brown

1
@MichaelT 저는 'dev'브랜치를 여러 번 보았지만 "초창기 마스터"라는 맥락에서 설명하지 않았습니다. 나는 이것을 사용할 것이라고 생각합니다. 감사합니다.
Droogans

13

일반적으로 브랜치 작업을 시작하려는 두 가지 상황이 있습니다.

  • 사용자 또는 팀이 다음 릴리스 (첫 번째 릴리스 일 수 있음)에 추가되지 않을 가능성이 가장 적은 새 기능을 시작한 경우 별도의 기능 분기에서 개발을 시작하십시오.

  • 최신 릴리스에 심각한 버그에 대한 수정 사항을 제공해야하고 해당 수정 사항 만 포함하지만 새로 개발 된 (아마도 불안정한) 기능이없는 새로운 버그 수정 릴리스를 작성하려는 경우

이러한 종류의 결정에 대해서는, 프로그램의 첫 번째 컴파일 가능 / 실행 가능한 버전이있는 시점에서 항상 "새로운 기능"또는 "버그 수정"의 관점에서 생각하는 것이 도움이된다고 생각합니다.

마이클 페더스 (Michael Feathers)는 그의 유명한 저서에서 변경해야 할 네 가지 이유를 나열 하지만, "새로운 기능 브랜치"(비 기능적 기능의 경우) 아래에 "자원 최적화"를, "새로운 기능 브랜치"의 경우에도 대부분 "디자인 개선"을 넣을 것입니다. IMHO는 특정 기능 의 구현을 보다 쉽게 하기위한 목적으로 설계를 개선해서는 안됩니다 .


12

git-flow 를 따르는 경우 -그리고 솔직히 Git을 사용하고 해당 브랜칭 모델을 사용 하지 않으면 미쳤다고 생각합니다 . 공개 릴리스를 실제로 준비 할 때까지 절대 커밋 해서는 안됩니다master .

첫 번째 커밋 master은 빈 저장소 여야합니다. 다음 커밋 masterdevelop브랜치 또는 임시 릴리스 브랜치 의 병합 커밋 이어야하며 안정적이며 테스트되어 배포 (응용 프로그램 인 경우) 또는 공개 배포 (라이브러리 인 경우) 준비가되어 있어야합니다.

있는 다른 분기 모델 힘내 위해,하지만 그들 중 대부분은 나이가 중앙 집중식 SCM 모델에서 파생 한과 DVCS 환경에서 심각한 문제가 발생할 수 있습니다. 실제로 git-flow 확장을 사용할 필요는 없으며 반드시 릴리스 / 핫픽스 / 기능 분기가 모두 필요하지는 않지만 베어 본은 developmaster이며 불안정한 코드가 들어갑니다 develop.


처음 커밋 할 필요조차 없습니다 master. master자식에게는 특별한 것이 아니라는 것을 기억하십시오 . 릴리스를 원할 때까지 개발 브랜치를 가질 수 있습니다.
Miles Rout

2
@MilesRout : 원칙적으로 사실이지만 , 브랜치가 이미 존재하지 않는 한 병합 할 수 없으며 프로세스는 마스터에 대한 모든 커밋이 빨리 감기가 아닌 병합이어야한다고 지시합니다. 내가 누락 된 것이 아닌 한 초기 빈 커밋의 유일한 대안 은 임의의 개발 커밋 또는 릴리스 브랜치에서 브랜치 마스터를 분리 하는 것입니다. 즉, 동일한 커밋을 공유하고 있다는 것을 의미합니다. 피하기 위해.
Aaronaught

1
아, 정말 좋은 지적입니다. 게시하고 댓글을 달려면 +1입니다.
Miles Rout

1

Thoughtworks의 Neal Ford는 "지옥 병합"문제를 피하기 위해 분기에 기능 토글을 사용하도록 권장합니다. 두 프로그래머가 매일 메인 브랜치에서 정식으로 병합하고 몇 주 동안 상당한 변경을 한 다음 커밋하는 경우를 고려하십시오. 다른 프로그래머는 병합 지옥으로 끝날 수 있습니다. 이 문제를 피하기 위해 Ford는 지점이 하나만 있고 매일 커밋함으로써 "고통을 가져 오는 것"(잘 알려진 민첩한 속성)을 권장합니다. 기능이 완전히 테스트 될 때까지 기능을 비활성화하는 기능 토글을 통해 추가 기능이 추가됩니다.

이 방법론은 커밋 문제가 즉시 포착되므로 지속적인 전달을 구현하는 환경에서 가장 잘 작동하는 것 같습니다.


1

이 질문에 대한 마지막 답변 이후 2 년이 지났으며 이제 이야기가 바뀌 었다고 생각합니다. 나에게 답은 "소스 코드 컨트롤을 사용하여 버전을 추적 할 때마다"입니다.

자세히 설명하자면, 요즘 소스 코드 제어로 프로젝트 버전을 추적하는 것이 항상 작동하는 것은 아닙니다. (예를 들어 npm을 사용하여 종속성을 관리하고 '^'로 의미 버전을 지정하는 경우)이 경우 빌드가 발생할 때마다 프로젝트 아티팩트가 변경되며, 매번 소스 코드 변경에 필요하지 않습니다. 이런 종류의 새로운 과제를 처리하기 위해 일부 팀은 프로젝트 버전 추적을 위해 이슈 제어 시스템 (예 : JFrog Artifactory)에 저장된 '아티팩트'를 이미 구축하기로 선택했습니다.

분명히 아티팩트 버전 제어가 이미있는 경우 GIT 분기에서 '프로덕션 코드'를 가져 와서 제작 / 배치하지 않고 직접 아티팩트 제어 시스템에 문의하여 직접 실행할 수있는 버전을 배포 할 수 있습니다. 이러한 경우 '릴리즈 브랜치'라는 개념이 갑자기 의미를 잃어 버렸습니다. 그리고 팀이 git 브랜치를 릴리스 버전과 연관시키지 않기로 결정할 때마다 마스터에 직접 커밋 / 푸시는 다시 한 번 올바른 선택이됩니다. 리포지토리가 복제 될 때마다 기본 브랜치로 제공되므로 시맨틱이 널리 받아 들여지고 잘 전달됩니다. 변화. 여전히 받아 들여진 대답에서 알 수 있듯이 master를 포함하여 지점에 역할을 할당하고 해당 특정 지점에만 해당 지점을 사용해야합니다.

마지막으로 한 걸음 더 나아가서 소수의 핵심 커미터가있는 프로젝트에서 master를 개발 브랜치로 사용하도록 제안합니다. 우리 팀의 경우는 아마도 대부분의 마이크로 서비스 상점에서도 마찬가지입니다. 마스터에 커밋하면 변경 프로세스의 통신이 제거되고 여러 스프린트에서 기능을 작업 할 때 '지옥 병합'을 피할 수 있습니다. 또한 마스터 브랜치의 코드는 '작동'할 필요가 없으며 자동화 된 빌드 / 테스트 프로세스는 무엇이 잘못되었는지 알려주며 어쨌든 git history를 확인하고 빌드 / 테스트를 중단 한 저자에게 연락하기에 충분히 쉽습니다 :-)


0

나는 모든 아이디어의 지점 인 과격한 입장을 취할 것입니다. 먼저 git 브랜치가 저렴하기 때문에 브랜치의 주요 비용은 무엇인지 기억하는 것입니다. 또한 마스터에 대한 첫 번째 커밋이 릴리스 후보라는 데 동의합니다. 개념 증명 분기로 시작하는 것이 좋습니다. 당신이 당신의 개념을 입증했을 때 당신은 그것을 빈 devel 브랜치와 병합하거나 첫 시도가 얼마나 좋은지에 따라 다시 쓸 수 있습니다. 이 시점에서 모든 버그, 기능, 추상화 등을 위해 devel에서 분기합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.