문제

오늘 아침에는 리팩토링에 대한 두 가지 의견을 읽었습니다.

  • 의견 1(페이지가 없음)
  • 의견 2(페이지가 없음)

그들은 다음과 같이 코드를 분기(및 이후에 병합)하는 것을 권장합니다.

  1. 트렁크를 깨끗하게 유지하십시오.
  2. 개발자가 위험한 변경에서 벗어날 수 있도록 허용합니다.

내 경험에 따르면(특히 Borland의 StarTeam에서) 병합은 중요한 작업이 아닙니다.그런 이유로 나는 꼭 필요한 경우에만 분기합니다(예:릴리스 후보를 동결하고 싶을 때).

이론적으로는 분기가 합리적이지만 병합 메커니즘으로 인해 매우 위험한 작업이 됩니다.

내 질문:

  • 코드를 병합하는 것이 편합니까?
  • 릴리스 후보를 동결시키는 것 외에 다른 이유로 코드를 지정합니까?
도움이 되었습니까?

해결책

느슨한 안내 원리 :

  • 늦게 그리고 필요할 때만 분기
  • 일찍 그리고 자주 병합하십시오
  • 올바른 사람이 합병을 할 수 있도록하십시오. 변경 한 사람 또는 원본 버전을 작성한 사람이 가장 좋습니다.

분기는 또 다른 도구 일뿐입니다. 최대 이익을 원한다면 효과적으로 사용하는 방법을 배워야합니다.

분기에 대한 귀하의 태도는 분산 오픈 소스 프로젝트 (예 : GIT) 프로젝트와 회사의 개발 프로젝트 (SVN에서 실행)간에 달라야합니다. 분산 프로젝트의 경우 분기가 혁신과 실험을 극대화하도록 장려하고자합니다. 후자의 다양성을 위해, 분기가 발생 해야하는 경우에 지시하는 각 코드 라인에 대해 더 엄격한 제어를 원하고 주로 "보호"해야합니다. 코드.

다음은 분기에 대한 안내서입니다.
http://www.vance.com/steve/perforce/branching_strategies.html

다음은 몇 가지 높은 수준의 모범 사례가있는 짧은 가이드입니다.
https://www.perforce.com/sites/default/files/pdf/high-level-perforce-best-practices.pdf

다른 팁

가지는 고통 스러울 수 있지만 그렇지 않아야합니다.

이것이 바로 Git-Like Projects (Mercurial, Bazar)가 CVS 및 SVN에 대해 알려주는 것입니다. Git과 Mercurial에서는 가지가 쉽습니다. SVN에서는 쉽지만 큰 프로젝트를 사용하면 관리하기가 약간 하드 코어가 될 수 있습니다 (GIT 및 Mercurial과 같은 다른 사람들에 비해 매우 길어질 수있는 분기/병합 프로세스에 소요되는 시간 때문에 비가없는 경우 어렵습니다. -관찰 충돌). 그것은 분기에 익숙하지 않은 사용자가 자주 분기에 대한 자신감을 갖도록하는 데 도움이되지 않습니다. 많은 사용자가 분기의 강력한 용도를 알지 못하는 많은 사용자가 프로젝트에 새로운 문제를 추가하지 않기 위해 멀리 떨어져서 미지의 것에 대한 두려움으로 인해 효율성에서 멀리 떨어져 있습니다.

분기는 어떤 이유로 든 분기하기에 충분히 사용해야하는 쉽고 강력한 도구 여야합니다.

지점에 몇 가지 좋은 이유 :

  • 다른 사람들과 병렬로 특정 기능을 작업하는 (또는 프로젝트에서 혼자있는 경우 다른 기능에서 작업하는 동안);
  • 여러 브랜드 버전의 응용 프로그램이 있습니다.
  • 동시 기술과 같은 동일한 응용 프로그램의 병렬 버전을 갖는 동시 기술과 같은 시간에 팀의 일부가 더 나은 것이 무엇인지 확인하기 위해;
  • 아티스트/디자이너 (예 : 게임)에서 응용 프로그램의 리소스가 변경되는 반면 다른 지점과 트렁크는 기능 추가 및 디버깅에 사용됩니다.
  • 여기에 유용한 사용법 추가

분기는 사소합니다. 병합은 아닙니다. 이런 이유로, 우리는 거의 분기하지 않습니다.

SVN을 사용하여 분기가 비교적 고통스럽지 않다는 것을 알았습니다. 특히 트렁크를 지점에 정기적으로 병합하여 동기화가 너무 멀지 않도록합니다.

우리는 SVN을 사용합니다. 지점 코드에 약 5 분 밖에 걸리지 않습니다. 그것은 우리가 트렁크를 엉망으로 만들지 못하게하는 고통의 양에 비해 사소한 일입니다.

수백 개의 개발자 분기와 함께 수백만 줄의 코드 코드 기반에서 작업하는 것은 일상적인 일입니다. 지점의 수명은 수행되는 작업의 양에 따라 다릅니다.

작은 수정을 위해 :

  • 디자이너는 메인 스트림에서 사이드 브랜치를 만듭니다
  • 변경합니다
  • 테스트
  • 리뷰
  • 메인 스트림에서 사이드 브랜치로 누적 된 변경 사항을 병합합니다
  • 이전 단계 중 하나 이상을 반복합니다
  • 메인 스트림으로 다시 합쳐집니다

다인방 팀 기능의 경우 :

  • 팀은 메인 스트림에서 기능 사이드 브랜치를 만듭니다
  • 개별 팀 구성원은 "Small Fix"접근 방식과 같이 Feature Sidebranch에서 운영되며 Sidebranch 기능으로 병합됩니다.
  • SideBranch Prime은 주로 주류에서 Sidebranch의 기능으로 누적 된 변경 사항을 주기적으로 병합합니다. 주류에서 SideBranch 기능을 갖춘 작은 증분 합병은 처리하기가 훨씬 쉽습니다.
  • 기능이 작동하면 메인 스트림에서 Feature SideBranch로 최종 병합을 수행하십시오.
  • 기능 사이드 브랜치를 메인 스트림으로 병합하십시오

고객 소프트웨어 릴리스 :

  • 릴리스 브랜치를 만드십시오
  • 지점을 릴리스하는 데 필요에 따라 수정 사항을 제공합니다
  • 수정 사항은 필요에 따라 주 스트림에/에서 전달됩니다.

고객 릴리스 스트림은 지원하는 데 비용이 많이들 수 있습니다. 테스트 리소스 - 사람과 장비가 필요합니다. 1 ~ 2 년 후, 주류가 앞으로 나아갈 때 특정 스트림에 대한 개발자 지식이 오래되기 시작합니다.

XP, Vista 및 Windows 7을 동시에 지원하는 데 Microsoft가 비용이 얼마나 드는지 상상할 수 있습니까? 테스트 베드, 관리, 문서화, 고객 서비스 및 마지막으로 개발자 팀에 대해 생각해보십시오.

황금률: 절대 많은 수의 개발자를 멈출 수 있으므로 메인 스트림을 깨십시오. $$$

분기 문제는 분기 생성이 간단한 분산 버전 제어 시스템(제 경우에는 Git이지만 Mercurial 및 Bazaar도 있음)을 사용하는 이유입니다.

저는 개발을 위해 항상 수명이 짧은 브랜치를 사용합니다.이를 통해 내 저장소를 어지럽히고 실수와 잘못된 선택을 할 수 있습니다. rebase 메인 브랜치에 대한 변경 사항이므로 깨끗한 변경 사항만 기록에 보관됩니다.

나는 사용한다 tag고정된 코드를 표시하기 위한 것이며 이러한 시스템에서는 코드 베이스에 오래 지속되는 분기를 로드하지 않고도 버그 수정을 위해 다시 돌아가서 분기하는 것이 쉽습니다.

나는 전복을 사용하고 매우 간단하고 쉽게 분기를 고려합니다. 그래서 질문 1 .. 예.

분기의 이유는 크게 다를 수 있습니다. 내가 느끼면 분기. 모든 가능성에 대한 규칙과 이유를 낮추기가 매우 어렵습니다.

그러나 "개발자가 위험한 변화에서 벗어날 수 있도록"하는 한. 논평. 나는 그것에 동의한다. 코드를 가지고 놀고 싶을 때마다 지점을 만듭니다. 제가 그 일을하고있는 유일한 개발자가 되었으면 좋겠다.

나는 SVN과 TFS를 사용하여 프로젝트를 해왔으며 그 자체로 분기는 정말 간단한 일입니다.

우리는 릴리스 후보와 오랫동안 지속 또는 실험적 특징과 다른 팀의 간섭에서 분리하기 위해 분기를 사용했습니다.

구 또는 강렬하게 발달 된 지점이 트렁크와 크게 다를 수 있으며 다시 합병하기 위해 상당한 노력이 필요할 수 있기 때문에 분기에서 유일한 고통스러운 순간은 병합입니다.

위의 말을하자면, 분기는 개발 중에 고려해야 할 강력하고 유용한 관행이라고 말할 것입니다.

병합이 너무 많은 고통이라면 더 나은 VC로 마이그레이션하는 것을 고려하십시오. 그것은 더 큰 고통 일 것이지만 한 번만.

우리는 SVN을 사용하고 변화를 깨뜨리는 규칙을 채택했습니다. 트렁크에서 약간의 변경이 이루어집니다.

우리는 또한 분기 릴리스입니다.

분기와 병합은 우리에게 잘 작동했습니다. 우리가 앉아서 사물이 어떻게 맞는 지 생각해야 할 때가 있지만 일반적으로 SVN은 모든 것을 합병하는 데 큰 도움이됩니다.

SVN을 사용하고 지점 코드까지 1 분도 채 걸리지 않습니다. 나는 Clearcase를 사용했지만 지점 코드에 1 분도 걸렸다. 나는 또한 다른, 더 적은 SCM을 사용했으며 가지를지지하지 않았거나 너무 고통스럽지 않았습니다. Starteam은 후자처럼 들립니다.

따라서 더 유용한 것으로 마이그레이션 할 수 없다면 (실제로는 Starteam에 대해 나쁜 것만 들었습니다) 다른 접근 방식을 시도해야 할 수도 있습니다. 수동 분기. 여기에는 코드를 확인하고 다른 디렉토리에 복사 한 다음 새 디렉토리로 추가하는 것이 포함됩니다. 병합이 필요한 경우 두 디렉토리를 모두 확인하고 Winmerge를 사용하여 병합을 수행하여 결과를 원본 디렉토리로 확인합니다. 지점을 계속 사용한다면 어색하고 잠재적으로 어렵지만 작동합니다.

분기의 속임수는 그것을 완전히 신제품으로 취급하는 것이 아닙니다. 그것은 분기입니다 - 주요 제품 트렁크를 별도로 안전하게 변경하는 데 사용되는 비교적 짧은 장치입니다. 병합이 어렵다고 생각하는 사람은 코드 파일을 너무 많이 리팩토링하는 것입니다 (즉, 이름을 변경하거나 복사하고, 새롭고, 새롭고, 오래된 삭제) 지점이 완전히 다른 것이되거나 분기를 너무 오래 유지하여 누적 된 변경 사항이 곰을 유지합니다. 원본과 거의 유사합니다. 지점을 오랫동안 유지할 수 있습니다. 변경 사항을 정기적으로 다시 병합하면됩니다. 이 작업을 수행하면 분기/합병이 매우 쉬워집니다.

나는 몇 번만 해냈으므로 정확히 편안하지 않습니다.

나는 일부 체크인에 걸쳐있는 설계 실험을 수행하기 위해 해냈으므로 분기는 정원을 놀기 쉬운 방법입니다. 또한 다른 사람들이 메인 지점에서 일하는 동안 땜질 할 수있었습니다. 시간이 많이 남지 않았습니다.

나는 또한 트렁크를 고려할 수없는 광범위한 변화를 만들 때 그것을 해냈습니다. 내 프로젝트에서 코드베이스의 상당 부분에 대한 컴파일 타임 유형 안전을 제거해야한다는 것이 분명해졌습니다 (제네릭에서 System.Object로 이동). 나는 이것이 시간이 걸릴 것이라는 것을 알았고 다른 사람들의 일을 방해 할 코드베이스 전체에 변화가 필요할 것입니다. 또한 내가 완성 될 때까지 빌드를 깨뜨릴 것입니다. 그래서 나는 그 지점이 편집 될 때까지 일하면서 제네릭을 분기하고 제거했습니다. 그런 다음 트렁크로 다시 병합했습니다.

이것은 꽤 잘 밝혀졌습니다. 많은 발끝을 막았는데, 그것은 훌륭했습니다. 바라건대이 같은 것은 다시 등장하지 않을 것입니다. 디자인이 변화 할 드문 일은 이런 종류의 광범위한 편집을 요구하기 위해 많은 코드가 발생하지 않습니다 ...

병합을 쉽게 수행하려면 분기를 올바르게 관리해야 합니다.Perforce를 사용한 내 경험에 따르면 메인 라인에서 브랜치로의 정기적인 통합은 메인 라인으로의 통합이 매우 원활하게 진행되었음을 의미합니다.

병합이 실패하는 경우는 드물었습니다.메인 라인에서 브랜치까지의 지속적인 통합에는 병합이 포함되었을 수도 있지만 이는 인간의 개입 없이 자동 도구가 처리할 수 있는 작은 편집에 불과했습니다.이는 사용자가 이러한 일이 발생하는 것을 "보지" 못했다는 것을 의미합니다.

따라서 최종 통합에 필요한 병합도 자동으로 처리되는 경우가 많습니다.

Perforces 3방향 병합 도구는 실제로 필요할 때 큰 도움이 되었습니다.

편안한 분기 코드를 느끼십니까?

실제로 사용하는 도구에 따라 다릅니다. StartEam을 사용하면 분기가 실제로는 사소하지 않습니다 (TBH, STARTEAM은 분기에서 짜증납니다). git을 사용하면 분기가 정기적 인 활동이며 매우 쉽습니다.

릴리스 후보를 동결시키는 것 외에 다른 이유로 코드를 지정합니까?

글쎄, 이것은 실제로 버전 제어 패턴에 달려 있지만 짧은 대답은 예입니다. 실제로 다음 기사를 읽는 것이 좋습니다.

첫 번째 기사에 설명 된 패턴을 정말 좋아하며 STARTEAM을 포함한 (분산되지 않은) 버전 제어 시스템에 적용 할 수 있습니다.

Git, Mercurial과 같은 분산 버전 제어 시스템 (DVC)과 함께 두 번째 접근 방식 (실제로 두 전략의 혼합)을 고려할 수 있습니다.

우리는 STARTEAM을 사용하고 필요한 상황이있는 경우에만 분기됩니다 (즉, 릴리스주기 동안 생산에 대한 핫픽스 또는 여러 릴리스 Windows에 걸쳐있는 긴 도달 프로젝트). 우리는 뷰 레이블을 사용하여 릴리스를 식별하므로 필요에 따라 나중에 분기를 만들 수 있습니다. 모든 빌드는 이러한 뷰 레이블을 기반으로하며 표지되지 않은 코드를 구축하지 않습니다.

개발자는 "코드 - 테스트 - 커밋"모델을 따르고 있어야하며 테스트 목적 또는 "위험한"개발에 대한 견해가 필요한 경우이를 만들어 관리해야합니다. 저장소를 관리하고 필요할 때만 분기를 만듭니다. 그 시간은 다음과 같습니다.

  • 생산 핫픽스
  • 개발주기가 길거나 겹치는 프로젝트
  • 광범위한 재 작성 또는 실험 개발

STARTEAM의 MERGE 도구가 가장 크지는 않지만 아직 발생하는 문제는 아직 발생하지 않았습니다. 합병을하는 사람은 누구든지 자신이하고있는 일을 알고 있다고 확신해야합니다.

Star Team에서 "읽기 전용 참조"보기를 작성하고 플로팅 구성으로 설정하면 트렁크의 변경 사항이 브랜치에 자동으로 표시 될 수 있습니다. 변경 시점에 항목을 설정하십시오. 이것은 동시 개발 노력에 좋습니다.

라벨이 붙은 구성으로 "읽기 전용 참조"보기를 작성하는 것은 기존 프로덕션 릴리스에 대한 핫 수정에 사용하는 것입니다 (레이블이 붙은 것으로 가정).

분기는 대부분의 대답과 같이 사소하지만, 합병은 그렇지 않습니다.

실제 키는 분리 및 단위 테스트입니다. 분해를 시도하십시오 ~ 전에 당신은 분기하고 메인을 주시하여 디커플링과 인터페이스가 유지되는지 확인하십시오. 그렇게 합병 할 때가되면 레고 조각을 교체하는 것과 같습니다. 오래된 조각을 제거하고 새로운 조각이 그 자리에 완벽하게 맞습니다. 단위 테스트는 아무것도 깨지지 않도록합니다.

분기 및 병합은 매우 간단해야합니다.

  • 나는 매우 편안한 분기/합병을 느낍니다.
  • 분기는 개발 프로세스 모델에 따라 다른 이유로 수행됩니다.

몇 가지 다른 지점 모델이 있습니다.

여기에 하나가 있습니다

  Trunk          
  .      
  .      
  .      
  ..         
  . ....     
  .   ...
  .      ..Release1
  .      
  .      
  ...        
  .  .... 
  .    ...Release2
  .      
  .      
  ..         
  . ...  
  .  .. 
  .    ...Release3
  .      
  .      

이제 여기에 호기심이 있습니다. Release1에 일부 버그 문제가 필요하다고 가정합니다. 이제 1.1을 개발하려면 릴리스 1을 분기해야합니다. 이제는 R1을 분기하고 작업을 수행 한 다음 R1로 다시 병합하여 R1.1을 형성 할 수 있기 때문입니다. 이것이 어떻게 릴리스간에 Diffs를 명확하게 유지하는지 주목하십시오.

또 다른 분기 모델은 트렁크에서 모든 개발을 수행하는 것이며 각 릴리스는 태그가 지정되지만 해당 특정 릴리스에서는 더 이상 개발이 수행되지 않습니다. 지점은 개발을 위해 발생합니다.

  Trunk                                           
  .                                                         
  .                                                         
  .                                                         
  .Release1           
  .                       
  .                       
  .                   
  .                   
  .Release2           
  .                   
  .......                 
  .      ......       
  .           ...DevVer1
  .          .    
  .          .            
  .        ...DevVer2
  .      ....         
  .  ....             
  ...                     
  .Release3           
      .

하나 또는 두 개의 다른 주요 지점 모델이있을 수 있습니다. 머리 꼭대기에서 기억할 수 없습니다.

결론은 VCS가 유연한 분기 및 병합을 지원해야한다는 것입니다. 파일당 VCS 시스템은 주요 통증 IMO (RCS, Clearcase, CVS)를 나타냅니다. SVN은 여기서 번거 로움이라고합니다. 왜 그런지 잘 모르겠습니다.

Mercurial은 여기에서 훌륭한 일을합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top