Microsoft MVP성태의 닷넷 이야기
Team Foundation Server: 38. TFS 소스 코드 관리 기능 (4) - Branch [링크 복사], [링크+제목 복사],
조회: 33890
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
TFS 소스 코드 관리 기능 (4) - Branch


사실, Branch는 그다지 어려운 기능이 아니어서, 별다르게 설명할 것이 없습니다. 그래도 약간의 부연 설명이 있어서 이렇게 내용을 넣어본 것인데요. 거두절미하고, 곧바로 예제로 들어가 볼까요? ^^

실습을 위해 지난번 changeset 55번에 붙여둔 Label에 해당하는 제품을 "A" 업체에 납품했다고 가정해 보겠습니다. 그리고는 개발은 꾸준히 진행되어 changeset 59번까지 왔습니다. 이 시점에서 "A" 업체가 추가 기능을 요구했고, 이 기능은 도저히 changeset 59번에 이어서 개발할 수 없는 기능입니다.

이 때 아래와 같이 55번 label (또는 changeset)에서 소스 코드 분기를 할 수 있습니다. (Branch는 프로젝트 단위에 국한되지 않고, 소스 컨트롤에서 보여지는 폴더 및 파일 단위까지도 가능합니다.)

[그림 1: Branch 메뉴 실행]
tfs_apply_branch_1.png

[그림 2: Branch 대화 상자]
tfs_apply_branch_2.png

[그림 3: Branch 명령 실행 결과]
tfs_apply_branch_3.png

자, 이제부터 소스 코드는 별도로 관리되어지는 것입니다. "TestSolution" 노드와 "TestSolution-for_onlyA" 노드는 개별적으로 체크인/체크아웃 되고 서로 완전히 독립적인 프로젝트 처럼 형상관리가 이뤄집니다.

일단, 위와 같이 분기가 되면 "공통 구현"되는 코드는 2중으로 적용해야 합니다. 즉, TestSolution 원본에서 "화면 프린트"라는 기능을 구현했다면, "TestSoltuion-for_onlyA" 분기에도 동일하게 적용해 주어야 합니다. TFS에서는 이 과정을 "Merge"라는 기능을 통해서 자동화해주려고 노력하고는 있지만, 어쨌든 이 과정은 시간이 갈수록 세심한 주의를 요하는 작업이 될 것입니다.

따라서, "소스 코드 분기"를 할 때는 TFS Branch를 정말 꼭 써야 하는지? 차라리 "전처리기"를 써서 소스 코드를 관리할 것인지? plug-in 방식으로 해결하는 것이 올바른 것이 아닌지...? 심사숙고 후에 결정하시는 것이 좋습니다.




물론, Branch의 활용이 위와 같은 상황에서만 있는 것은 아닙니다.

Visual Studio TFS Branching Guide 2010 
; http://tfsbranchingguideiii.codeplex.com/

위의 PDF 문서는, Branch를 활용한 제품 개발 가이드를 적절하게 제시하고 있습니다.

내용인 즉,
평상 시처럼 팀 프로젝트와 기반 솔루션 프로젝트를 만들고, 그것을 "MAIN"으로 둡니다. 거기에서 "DEV" 브랜치를 하나 따서 모든 개발은 거기서만 합니다. 기능 구현이 완료될 때 마다 "DEV"에서 "MAIN"으로 (통째로) merge하고. 그래서 "MAIN" 솔루션은 언제든 배포가 가능한 노드로써 기능을 하게 됩니다.

위의 가이드는 우리가 보통 겪고 있는 문제를 잘 해결해 줍니다. 예를 들어, changeset만으로는 기능 단위로 정확하게 구현이 안되어서 중간중간 릴리스 가능하지 않은 상태로 솔루션이 머무는 기간이 종종 발생합니다. 예를 들어, "화면 캡처" 기능을 구현하는데 메뉴만 만들어놓고 check-in을 할 수도 있고, 또는 "화면 캡처" 기능 자체는 다 완료하고 check-in을 했는데 테스트 과정 중에 오류가 발생하는 경우도 있습니다.

바로 그런 상황이 빈번한 팀에서는 위와 같이 "MAIN"과 "DEV" 브랜치를 두고 관리를 한다면 모든 복잡함이 제거될 수 있습니다.

"가이드"에 보면 "RELEASE" 브랜치도 "MAIN"에서 파생됩니다. 일단, "RELEASE" 브랜치가 되어 릴리스 버전이 고객에게 전달되었다면, 이후의 기능들은 다음 버전이 되는 것이고 "DEV"에서 역시 모든 개발 코드가 먼저 작업이 되고 그때그때 "MAIN"에 반영되는 것이 가능합니다.

그 외에, 서비스 팩 및 핫픽스를 염두에 둔 브랜치 가이드가 추가되어 있는데 그 부분들은 각자 환경에 맞게 적절하게 선택을 하면 될 것 같습니다.

제 생각에는, 최소한 위에서 설명드렸던 "MAIN", "DEV" 브랜치 정도는 두는 것을 권장하고 싶습니다.

지금까지 4회에 걸쳐 TFS의 기능을 살펴보았는데요. 좀 더 아시게 된 만큼 효율적인 TFS 사용이 되기를 바랍니다.



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/17/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  [124]  125  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10857정성태10/1/201521784VS.NET IDE: 104. Visual C++ 프로젝트의 빌드 이벤트에서 환경 변수 사용하는 방법
10856정성태9/30/201533241.NET Framework: 532. WPF DataGrid의 데이터 바인딩 시 리플렉션의 부하는 어느 정도일까요?파일 다운로드1
10855정성태9/30/201522481.NET Framework: 531. C# - XSLT 내의 javascript에 전달한 XML 노드의 타입은?
10854정성태9/30/201522568오류 유형: 309. C# - 포인터를 쓰는 경우 VerificationException이 발생한다면?
10853정성태9/21/201521009오류 유형: 308. 공백 문자를 포함한 계정명의 권한으로 Visual Studio 확장을 설치할 때 오류 발생
10852정성태9/17/201526267VC++: 92. C++ 생성자를 DLL로부터 동적 로드해 객체를 생성한다면? [2]파일 다운로드1
10851정성태9/15/201525705.NET Framework: 530. C# - 중위식을 후위식으로 변환하는 예제파일 다운로드1
10850정성태9/14/201524524.NET Framework: 529. C# - volatile 키워드로 인한 차이점을 발생시키는 예제 [1]파일 다운로드1
10849정성태9/14/201558740오류 유형: 307. CLR20r3 오류 해결을 위해 mscorlib.dll을 덮어쓸때 주의할 점 [12]
10848정성태9/8/201528395VS.NET IDE: 103. Visual Studio의 Ctrl + F5 실행 동작파일 다운로드1
10847정성태9/8/201525099VS.NET IDE: 102. 목록(List) 타입의 값을 디버깅 중 Watch 창에서 확인하는 방법 [1]파일 다운로드1
10846정성태9/8/201522081오류 유형: 306. "query user" 명령어에 공백 문자가 포함된 계정을 전달하는 경우
10845정성태9/3/201523522오류 유형: 305. 윈도우 백업 시 오류 - 0x80780166
10844정성태9/2/201524430.NET Framework: 528. C# - 상호 참조하는 경우의 정적 생성자 동작 방식 [4]파일 다운로드1
10843정성태9/1/201524840VS.NET IDE: 101. Visual Studio 2015의 솔루션 탐색기가 클래스 뷰 정보로 인해 느려지는 현상
10842정성태9/1/201522161.NET Framework: 527. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 세 번째 이야기
10841정성태8/31/201531749개발 환경 구성: 276. Visual Studio 2013에서 C# 6과 닷넷 4.6 기능을 사용하려면?
10839정성태8/22/201529609Windows: 112. 윈도우 10에서 터치 키보드를 안 뜨게 할 수 있는 방법 [4]
10838정성태8/22/201540710오류 유형: 304. Windows 10에서 VPN 연결이 실패한다면? [3]
10837정성태8/21/201520129오류 유형: 303. Your computer is low on memory. Save your files and close these programs...
10836정성태8/21/201521970오류 유형: 302. 설치 파일 실행 시 "This app can't run on your PC" 오류가 뜬다면?
10835정성태8/21/201529866웹: 31. Microsoft Edge 브라우저를 명령행에서 띄우는 방법 [1]
10834정성태8/19/201522530.NET Framework: 526. 닷넷 - 값 형식을 new 없이 생성하면 0으로 초기화되지 않는다?
10833정성태8/18/201526963.NET Framework: 525. C# - 닷넷에서 프로세스가 열고 있는 파일 목록을 구하는 방법파일 다운로드1
10832정성태8/17/201531110디버깅 기술: 74. x64 콜 스택 인자 추적과 windbg의 Child-SP, RetAddr, Args to Child 값 확인 [8]파일 다운로드2
10831정성태8/13/201531572.NET Framework: 524. .NET 4.0과 .NET 4.5의 컴파일 결과 차이점 [1]파일 다운로드1
... 121  122  123  [124]  125  126  127  128  129  130  131  132  133  134  135  ...