언제 분기해야합니까?


답변:


59

분기에는 몇 가지 용도가 있습니다. 가장 일반적인 용도 중 하나는 한때 공통 코드 기반이 있던 프로젝트를 분리하는 것입니다. 이것은 메인 트렁크에 영향을주지 않고 코드를 실험하는 데 매우 유용합니다.

일반적으로 두 가지 분기 유형이 표시됩니다.

  • 기능 분기 : 특정 기능이 전체 개발 팀이 초기 단계에 영향을받는 것을 원하지 않을만큼 혼란스러운 경우이 작업을 수행 할 분기를 만들 수 있습니다.

  • Fixes Branch : 개발이 메인 트렁크에서 계속되는 동안, 소프트웨어의 최신 릴리스 버전에 대한 수정을 보관하기 위해 수정 브랜치를 생성 할 수 있습니다.

분기의 원칙과 사용시기를 설명하는 다음 기사를 확인하는 것이 좋습니다.


나는 당신이 언급 한 일반적인 사용을 듣거나 생각한 적이 없지만 정말 멋진 아이디어입니다. 나는 다가오는 프로젝트에서 이것을 정말로 사용할 것입니다. 지적 해 주셔서 감사합니다.
Nils Riedemann

82

일반적으로 분기 (VCS-버전 제어 시스템-기능)의 주요 목적은 코드 격리 를 달성하는 것 입니다.

당신은 적어도이 하나 개의 순차적 인 개발을 위해 충분히 될 수 분기를, 그리고 같은 독특한 분기에 녹화 (노력)있는 많은 작업에 사용됩니다.

그러나 그 모델은 그 한계를 빠르게 보여줍니다.

개발 노력 (리팩토링, 진화, 버그 수정 등)이 있고 현재 개발 브랜치와 동일한 브랜치에서 이러한 변경을 안전하게 수행 할 수 없다는 것을 깨달을 때 (API를 손상 시키거나 중단되는 코드를 도입하기 때문입니다. 모든 것), 그러면 다른 지점 이 필요합니다 .
( 나중에 두 코드 세트가 병합 되더라도 레거시 코드에 대한 새 코드 를 분리 하려면 )

이것이 바로 거기에 대한 답
입니다. 한 지점에서 두 가지 개발 노력을 추구하고 기록 할 수 없을 때마다 분기해야합니다.
(유지해야 할 끔찍하게 복잡한 역사가 없음).


브랜치는 소스 코드에서 작업하는 유일한 사람이더라도 유용 할 수 있습니다.
그러나 "개발자 당 하나의 브랜치"를 만들어서는 안됩니다.
"격리"목적은 개발 노력 을 분리하기 위한 것입니다 ( "다음 버전의 소프트웨어를 개발하자"처럼 일반적이거나 "수정하자"와 같이 구체적 일 수 있음). bug 23 "),
"리소스 "를 분리하지 않습니다 .

( "VonC"라는 분기는 다른 개발자에게 아무런 의미가 없습니다. "VonC"가 프로젝트를 떠나면 어떻게됩니까?이 프로젝트로 무엇을해야합니까?
"bugfix_212"라는 분기는 예를 들어 버그 추적 시스템의 컨텍스트에서 해석 될 수 있습니다. , 모든 개발자는 자신이해야 할 일에 대한 아이디어를 가지고 사용할 수 있습니다.)

분기는 태그가 아닙니다 (SVN은 저렴한 파일 복사를 통해 디렉토리를 통해 분기 및 태그 지정과 같은 버전 관리 기능을 제안 하려는 개정 시스템 입니다 . 태그가 분기라는 의미는 아닙니다)

브랜치를 정의한다는 것은 병합 워크 플로 도 정의하는 것을 의미 합니다. 브랜치를 완료 한 후 병합 할 위치를 알아야합니다.
이를 위해 Practical Perforce (Laura WINGERD-O'Reilly)의 7 장은 서로 다른 종류의 브랜치 간의 워크 플로우를 병합하는 좋은 소개 (VCS 불가지론)입니다. "" 소프트웨어가 진화하는 방법 "(pdf)

이 용어 정의 코드 라인 (코드의 중요한 발전 단계를 기록 지점, 중 특정 지점에서 태그를 통해, 또는 분기에 중요한 병합 다시 통해를)

메인 라인 모델 (릴리스를 기록하는 중앙 코드 라인)을 소개하고 분기를위한 다양한 목적을 설명합니다.

  • 활성 개발 스트림 : 순차적 인 다양한 개발이 발생할 때 지속적인 코드 라인
  • 작업 브랜치 :보다 구체적인 작업을위한 단기 브랜치 (버그 수정은 고전적인 작업이지만 완료하기 복잡하다고 알고있는 병합 작업에 대한 브랜치를 정의 할 수도 있습니다. 해당 작업 브랜치에서 병합, 커밋 및 테스트 할 수 있음) 현재 주요 개발 브랜치에 문제를 일으키지 않고)
  • 스테이징 브랜치 : 일부 사전 프로덕션 특정 데이터 또는 구성 파일이있는 릴리스를 준비합니다.
  • 비공개 브랜치, 임시 브랜치 및 스파 스 브랜치 : 매우 작은 작업의 경우 공식적인 완료 또는 테스트 검토를 기다리지 않고 진행중인 일부 작업을 수행 할 수 있습니다.
    이를 통해 "일찍 커밋하고 자주 커밋"할 수 있습니다.

VCS에 대한 기타 흥미로운 개념 : 기본 개념
(원래 ClearCase에 대한 것이지만 모든 VCS에도 유효 함)


19

21 세기의 모든 SCM은 다음과 같이 말합니다.

새로운 기능, 버그 수정, 테스트 여부에 관계없이 작업해야하는 모든 작업에 대해 분기합니다 . 이를 토픽 브랜치라고하며 SCM으로 작업하는 방식을 변경합니다.

당신은 얻을 :

  • 더 나은 격리
  • 더 나은 추적 성-> 작업을 개별 변경 집합이 아닌 분기와 연결하여 원하는만큼 자유롭게 커밋 할 수 있으며 "작업 당 하나의 체크인"과 같은 제한을 부과하지 않습니다.
  • 작업은 독립적이며 (일반적으로 안정적인 기준에서 시작하므로 사용자의 버그를 수정하는 것이 아니라 코드에만 집중할 수 있습니다.) 어느 시점에서 통합할지 아니면 나중에 통합할지 선택할 수 있지만 항상 아래에 있습니다. 버전 관리
  • 메인 라인에 도달하기 전에 코드를 쉽게 검토 할 수 있습니다 (사전 커밋이 아닌 버전 제어에서).

이를 수행 할 수있는 도구 :

할 수없는 도구 :

  • SVN
  • CVS
  • VSS
  • TFS
  • 억지로

1
왜 SVN으로 할 수 없습니까 ??
yegor256

4
SVN은 좋은 병합이 아닙니다. 적절한 병합 추적이 부족하기 때문입니다. 또한 지점을 만드는 것은 제가 지적한 것만 큼 저렴하지 않기 때문에 실제 조건에서 악몽이됩니다.
pablo 2010-07-22

더 나은 추적 성 : 왜 원하는만큼 커밋하고 싶습니까? 작업이 복잡한 기능이 아닌 경우 작업 당 한 번이면 충분하지 않습니까? 또한 사람들의 버그는 메인 브랜치로 쉽게 이동할 수 있으며 병합되는 순간에 "안정"되지 않고 "안전"하지 않게 만들 수 있습니다.
Paiman Samadian

@PaimanSamadian : "작업이 복잡한 기능이 아닌 경우 작업 당 한 번이면 충분하지 않습니까?" 확실한. 마찬가지로 작업 복잡 할 때 한 번의 커밋으로 충분 하지 않습니다 (잘 진행되면 몇 분마다 커밋합니다). 작업 당 하나의 커밋을 강제하는 이유는 무엇입니까? • "또한 사람들의 버그는 메인 브랜치로 쉽게 이동할 수 있습니다."실제로는 그렇지 않습니다. 기능 브랜치 워크 플로 의 핵심은 코드가 메인 브랜치에 병합 되기 전에 코드 검토 및 테스트를 가능하게한다는 것 입니다.
Marnen Laibow-Koser

1
@PaimanSamadian 다중 체크인은 중간 변경 사항을 설명하고 검토를 쉽게하는 데 유용합니다. 또한 몇 시간 동안 작업하는 경우 여러 번 체크인하는 것이 좋습니다.
pablo

8

또한 사용중인 SCM 도구에 따라 다릅니다. 최신 SCM (git, mercurial 등)을 사용하면 필요할 때마다 분기를 쉽게 만들고 파괴 할 수 있습니다. 예를 들어 작업중인 버그 당 하나의 브랜치를 만들 수 있습니다. 결과를 트렁크에 병합하면 분기를 버립니다.

예를 들어 Subversion 및 CVS와 같은 다른 SCM은 훨씬 "무거운"분기 패러다임을 가지고 있습니다. 즉, 분기는 20 줄짜리 패치보다 더 큰 것에 대해서만 적절한 것으로 간주됩니다. 여기에서 브랜치는 이전 또는 향후 제품 버전과 같이 전체 개발 트랙을 추적하는 데 고전적으로 사용됩니다.


5

특히 트렁크에 영향을주지 않고 중간 변경 사항을 커밋하려는 경우 코드베이스를 중요하거나 실험적으로 변경해야 할 때.


5

사용중인 SCM 유형에 따라 다릅니다.

최신 배포 버전 (예 : git 및 mercurial)에서는 항상 브랜치를 만들고 어쨌든 다시 병합합니다. 누군가가 메인 라인에서 빌드를 망가 뜨리거나 네트워크가 다운 되었기 때문에 잠시 동안 별도의 브랜치에서 작업 한 다음 나중에 수정되면 변경 사항을 다시 병합합니다. 작업이 너무 쉬워서 짜증나지도 않습니다. .

분산 시스템의 내용을 이해하는 데 가장 도움이 된 문서 (짧고 읽기 쉬운)는 UnderstandingMercurial 입니다.

중앙 저장소가있는 이전 시스템 (예 : CVS, SVN 및 ClearCase)에서는 팀 수준에서 결정해야하는 훨씬 더 심각한 문제이며 대답은 '허용하면서 이전 릴리스를 유지하는 것'과 비슷해야합니다. 메인 라인에서 계속 개발 '또는'주요 실험의 일부로 '.

분산 모델이 훨씬 더 좋으며 지배적 인 패러다임이 될 멋진 그래픽 도구 만 부족하다고 생각합니다. 그러나 널리 이해되지 않고 개념이 다르기 때문에 신규 사용자에게는 혼란 스러울 수 있습니다.


3

Perforce의 Laura Wingerd와 Christopher Seiwald의 조언은 정말 간결하고 유용합니다.

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

각각에 대한 자세한 설명과 기타 모범 사례는 http://www.perforce.com/sites/default/files/pdf/perforce-best-practices.pdf 를 참조 하십시오 .


3
P4 사람들은 이것을 말하곤했지만 오늘날 그들의 마케팅은 다른 것을 말하고 있습니다. 그들은 Git과 같은 다른 시스템만큼 좋은 작업 또는 주제 분기를 수행 할 수 없기 때문에 수년간 분기를 피하려고했습니다.
pablo

2015 년 대응! 분기를 피하는 이유는 병합 할 필요를 피하는 것입니다. Perforce에 작업 / 주제 분기가 없었기 때문이 아닙니다 (스트림에서 "작업 분기"를 수행 할 수 있습니다. Perforce에서는 "작업 스트림"이라고합니다. 다른 사람들이 언급했듯이- 분기는 DVCS에 내포되어 있으며 질문은 경건하지 않습니다. 토론은 클라이언트-서버 방식으로 작동하는 도구로만 제한되어야한다고 생각합니다. -) 두 세계의 최고.
레스터 청

2

분기에는 다양한 용도가 있습니다.

  1. 기능 / 버그 분기. 기능 / 버그 수정이 완료되면 트렁크로 다시 이동되는 동적 및 활성 분기.
  2. 정적 브랜치 (Subversion의 태그, 본질적으로 '일반 브랜치'임). 예를 들어 릴리스의 정적 스냅 샷을 제공합니다. 그들이 비록 수있는 작업 할, 그들은 그대로 유지됩니다.

1

분기의 필요성이 발생할 수도 있습니다.

  • 특정 고객 (중요하다고 말함)에게 핫픽스를 제공하고 싶고 수정이 향후 릴리스에 포함 될지 확실하지 않은 경우


  • 1

    당신이 그것을 느낄 때마다.

    브랜치가 공식 저장소의 일부이기 때문에 중앙 집중식 SCM으로 작업하는 경우에는 자주 사용하지 않을 것입니다. 이는 병합이 실제로 해를 끼치는 것은 말할 것도없고 많은 실험을 필요로하지 않습니다.

    OTOH, 분산 SCM에서 브랜치와 체크 아웃간에 기술적 차이가 없으며 병합이 훨씬 쉽습니다. 훨씬 더 자주 분기하는 것처럼 느껴질 것입니다.


    0

    변경해야하는 경우 현재 분기를 기준으로 해당 분기의 다음 릴리스 (이전이 아님)로 지정되지 않습니다.

    예를 들어, 우리는 보통 트렁크에서 작업합니다. 출시 시점 즈음에 누군가가 현재 릴리스에서 원하지 않는 변경을해야 할 것입니다 (출시 전일 수 있으며 현재는 일반적으로 릴리스 후). 이것은 우리가 분기 할 때, 릴리스를 자체 분기에 놓고 트렁크에서 다음 릴리스를위한 개발을 계속합니다.


    0

    모든 기술은 제쳐두고 .....

    다시 병합하는 것이 더 쉽다는 것을 알 때 분기하십시오!

    병합은 프로젝트에서 작업이 수행되는 방식에 항상 영향을 미친다는 점을 명심하십시오.

    이것이 달성되면 다른 모든 3 차 문제가 실행될 것입니다.

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