여러 병렬 릴리스 분기가있는 Git 흐름 및 마스터


87

우리는 git-flow로 구현 된 성공적인 Git 분기 모델 을 채택하려고합니다 . 이제 우리는 적어도 두 개의 릴리스 브랜치를 작업하고 있습니다. 하나는 최신 안정 릴리스 용이고 다른 하나는 다음 ( "미리보기") 릴리스 용입니다. 내가 이해하지 못하는 것은 모든 릴리스가 마스터 에게 "선형화" 되고 태그가 지정된 것처럼 보이는 이유 입니다. 릴리스 브랜치에서 릴리스에 태그를 지정하지 않는 이유는 무엇입니까? 왜 주인 인가? 아니면 왜 개발 브랜치를 사용하고 마스터 를 사용하지 않습니까?

답변:


77

git-flow 모델에서 "최신 릴리스"버전은 실제로에 매핑되는 master반면 "미리보기 릴리스"는 git-flow release브랜치에 매핑됩니다 . 실제 릴리스가 발생할 때 분기되어 develop최종적으로 병합됩니다 master. 그러면 이것이 "최신 릴리스"가되고 일반적으로 git-flow hotfix브랜치를 사용하여 해당 릴리스의 버그만 수정합니다 . 이렇게하면 master항상 최신 릴리스 버전의 가장 안정적인 상태를 나타냅니다.

이전 릴리스의 버그를 수정하거나 거기에서 다른 개발을 수행하려는 경우 support적절한 커밋에서 분기를 포크합니다 master( 모든 버전이 생성됩니다). support브랜치는 여전히 실험적 이며 ( 문서에 따르면 ) 잘 문서화되어 있지 않습니다. 그러나 명령 줄 도움말에서 볼 수 있듯이 :

usage: git flow support [list] [-v]
       git flow support start [-F] <version> <base>

이러한 분기는 방금 시작되었으며 다시 병합 할 의도가 master없습니다 develop. "고대"릴리스에 대한 수정 사항이나 "고대"릴리스에 구현되도록 고객이 요청한 기능은 master. 여전히 생각한다면 메인 개발 라인 ( master및로 develop표시됨)에 수정 사항을 이식하려면을 시작하고 hotfix변경 사항을 선택하고 hotfix.


17
이것은 테스트에서 QA, 프로덕션에 이르는 느린 파이프 라인을 다루지 않습니다. 두 개 (또는 그 이상이지만 지금은 두 개만하자) 릴리스 브랜치가 열릴 수 있으며, 각각은 해당 파이프 라인의 다른 단계에 있으며 각각 테스트에서 발견 된 버그에 대한 수정을 허용해야합니다. 개발 기능이 그 지점 아직 이루어지지 않은 릴리스에 대한 축적되고 있었다 곳에 지사는 것이다. 이러한 상황에서 릴리스 n-2에 대한 수정 사항은 결국 병합되어 개발되지만 적어도 표준 git 흐름에 따라 릴리스 n-1을 건너 뜁니다. 이 릴리스 N에 결국 고정 N-1의 회귀로 이어질 것
브렌든

릴리스 브랜치가 유지되지 않고 새로운 릴리스 브랜치가 생성되면 이전 버전이 "지원"브랜치로 진화하는 이유는 무엇입니까?
lkanab

1
릴리스 브랜치는 개발에서 "분기"가 아니라 개발에서 "분기"되는 이유는 무엇입니까?
Sandra K

gitflow-avh 는 원래 gitflow의 유지 된 (즉, 죽지 않은) 포크처럼 보입니다. git flow support실험용으로 표시되지 않았습니다.
Timo Verhoeven

9

대부분은 가지를 너무 많이 강조하는 정신적 모델처럼 보입니다. 동의합니다. 릴리스 한 커밋을 마스터로 다시 병합하는 대신 태그 만 지정할 수 있습니다.

그래도 그림은 예쁘다. 모든 것을 마스터로 다시 병합하면 버전 태그가 그래프 전체에 흩어져있는 대신 시간적 순서로 릴리스가 명확하게 표시됩니다.

하지만이 모델은 이전 릴리스의 버그 수정에는 작동하지 않는다고 생각합니다. 깔끔한 주문을 엉망으로 만듭니다.

  1. 버전 1.0.1을 출시하고 나중에 기능을 추가하고 1.1.0을 출시했다고 가정 해 보겠습니다.
  2. 1.0.1에서 버그를 발견했으며 두 버전 모두에서 수정하고 싶습니다.
  3. master에서 1.1.0 뒤에 1.0.2를 추가 한 다음 1.1.1도 직접 (또는 이전) 추론해야합니다.

귀하의 질문에 답하기 위해 : 이것은 어떤 경우에는 단순한 정신 모델을 만드는 일련의 규칙이라고 생각합니다. 모든 규칙이 순전히 기술적 인 관점에서 의미가있는 것은 아니지만 그렇다고해서 나쁜 것은 아닙니다. 정신 모델은 인간에게 좋습니다.


1
support브랜치는 이전 릴리스에서 버그 수정을 위해 설계되었지만 여전히 '실험용'으로 레이블이 지정되어 있습니다.
mstrap 2013 년

2

개인적으로 언급 된 git-flow가 너무 복잡하다고 생각합니다.

GitHub를 사용하는 경우 GitHub flow(Scott Chacon이 설명한대로) 시도해보십시오 .

특히 여러 기능에 대한 공동 작업, 코드 검토에 유용하며 .NET Framework를 사용하여 지속적 통합 솔루션과 결합 할 수 Commit Status API있습니다.

업데이트 : The GitHub Flow ™의 새로운 공식 웹 사이트가 있습니다.

업데이트 2 : The GitHub Flow ™에 대한 새로운 공식 (및 단순화 된) GitHub 가이드 : https://guides.github.com/introduction/flow/


10
GitHub 흐름은 릴리스 중심이 아닌 컨텍스트에만 적합합니다 . git-flow 프로세스는 주로 "출시"를 중심으로 설계되었습니다. 우리는 매일 (종종 하루에 여러 번) 프로덕션에 배포하기 때문에 실제로 "릴리스"가 없습니다.
레미 Mélisson

10
또한 git-flow 는 유지 관리 릴리스가있는 릴리스 중심 컨텍스트 에서 그렇게 훌륭하게 작동하지 않는다고 덧붙입니다. 예를 들어, 1.3.0 릴리스 이후 1.2.1 릴리스가 발생하면 어떻게됩니까? 그것은 아마도 master작업 연대의 변칙 인에 병합 될 수 없을 것 입니다.
Ken Williams

@KenWilliams는 mstrap의 답변에 설명되어 있으며 이것이 support브랜치의 용도입니다. 그러나 당신이 옳습니다. 그러한 릴리스가 master모든 프로덕션 릴리스를 보유해야하는 으로 다시 병합되지 않는 것은 참으로 예외입니다 .
beatngu13

2

제 경우에는 기본은 동일하지만 각 버전에는 몇 가지 다른 기능이있는 동일한 소프트웨어의 두 가지 버전이 있습니다.

그래서 두 개 worktree를 만듭니다. 즉, 마스터 옆에 관련 장기 실행 분기를 두 개 만듭니다.

$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master

다음이 있습니다.

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

하나의 저장소가 있지만 위의 각 분기에 대해 서로 옆에 3 개의 별도 폴더가 있습니다. 그리고 마스터에서 일반적인 변경을 수행하십시오. 그런 다음 다른 두 버전과 병합하십시오.

cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here i get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here i get the basic.cpp latest changes for gold project

각 버전의 특정 변경 사항도 해당 폴더에 저장되며 각 프로젝트의 작업은 격리되어 IDE가 혼동되지 않습니다.

도움이 되었기를 바랍니다.


2

@Mot에 완전히 동의합니다.

같은 질문을 듣게되어 기쁩니다.

우리 팀은 또한 성공적인 분기 모델보다 더 많은 범용 분기 모델을 찾고 있었습니다. 예를 들어 안정적인 릴리스를 위해 kernel.org에서 수행하는 것처럼 별도의 * .git 저장소에서 release- * 분기를 지원하기위한 추가 저장소를 도입하지 않는 것이 주된 아이디어입니다. 하지만 kernel.org는 다운로드 크기를 최소화하기 위해 수행합니다.

나에게는 마스터개발의 메인 라인으로 사용 하는 것이 더 깨끗한 것 같습니다 .

또한 릴리스-* 모델마스터로 병합 하고 나중에 아이디어로 태그를 지정하는 데 약간의 충돌이 있습니다.

Git 후크 스크립트를 사용하여 마스터에 커밋이있을 때마다 소프트웨어를 자동으로 빌드하고 프로덕션 서버에 배포합니다.

원인 (병합 및 태그) 마무리 원자 거래되지 않습니다 :

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

그리고 git hook이 자동 버전 관리 지원으로 빌드를 시작하면 :

$git describe --tags --long >.ver

다음을 위해 잘못된 버전을 만들 수 있습니다.

$ git merge --no-ff release-1.2

성공적인 버전의 버전 관리는 일부 범프 버전 프로세스를 도입 하지만 자동은 아닙니다.

요약하자면-릴리스 용 브랜치 모델에 도입 한 주요 차이점-* 병합 및 태그 지정은 다음과 같습니다.-브랜치 생성시 릴리스 태그 지정-향후 유지 관리를 위해 릴리스의 브랜치 유지


-2

마스터 브랜치는 항상 프로덕션 코드베이스를 나타내야하므로 프로덕션 릴리스 직후에 코드를 항상 마스터로 다시 병합합니다.

태깅은 프로덕션 릴리스에 들어간 정확한 코드를 "기억"하는 데 사용되므로 나중에 돌아가서 문제가 발생하면 코드를 분석 할 수 있습니다.

이론적으로는 마스터로 다시 병합 한 후 릴리스 브랜치 또는 마스터 브랜치에서 코드에 태그를 지정하는 것은 중요하지 않습니다. 개인적으로 릴리스 브랜치의 코드에 태그를 지정하는 것을 선호합니다. 이것은 빌드 / 릴리스에 정확히 들어간 코드이기 때문입니다 (병합에 문제가 발생할 수 있다고 가정).

개발 분기 개념의 문제는 단일 스레드라는 것입니다. 이 스레드에서 Brendan은 개발 분기 개념과 관련하여 사용할 수있는 전략을 언급했습니다.


4
여러 릴리스 (예 : v1.0, v1.1, v1.5)를 병렬로 유지하는 경우 "프로덕션 코드베이스"란 무엇입니까?
Thomas S.

Production Code Base는 현재 생산중인 것입니다 (예 : v1.0). 브랜치는 향후 프로덕션에 배포 될 릴리스 (예 : V1.0.1, v1.1 및 v2.0)에 대한 변경 사항을 전달합니다. "미래"릴리스가 프로덕션에 배포되면 마스터에 다시 병합되어 마스터가 프로덕션에있는 내용을 반영합니다. 또한 순방향으로 병합되므로 (예 : v1.0.1에서 1.1 및 v2.0으로) v1.1이 프로덕션으로 출시 될 때 v1.0.1 변경 사항이 손실되지 않습니다.
Bernie Lenz

4
나는 향후 버전이 아니라 여러 릴리스 버전을 유지하는 것에 대해 이야기하고 있습니다.
Thomas S.

4
당신은 나를 이해하지 못하는 것 같습니다. 일부 회사에서는 여러 릴리스 버전이 유지되고 있다고 상상할 수 없습니까? 예를 들어 Microsoft는 Windows 7, 8, 8.1 및 10에 대한 업데이트도 유지합니다. 그렇다면 다른 회사는 어떻습니까?
Thomas S.

1
맞습니다 토마스. 이 모델은 웹 사이트와 같이 특정 시점에 단일 프로덕션 릴리스가있는 제품을 대상으로합니다. 또한 동일한 버전 번호를 사용하여 Android 또는 iPhone 빌드 (또는 둘 다)를 생성하도록 빌드가 매개 변수화 된 Android 및 iPhone과 같은 모바일 빌드에도이 모델을 사용했습니다. 일부 구성 요소가 공유되고 일부 구성 요소가 다른 특정 시점에 프로덕션에 여러 라이브 버전이있는 제품에 대한 빌드 모델을 구성하는 방법에 대한 귀하의 의견을 알고 싶습니다. 저희에게 알려주십시오 ...
Bernie Lenz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.