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


Shelve라는 단어가 다소 낯설기도 하고, 실제로 쓰는 경우가 많지 않아서 기능 자체에 대해서 모르시는 분들도 계신데요. 사실 개념은 무척 간단합니다.

가상 시나리오를 설정해 보면,

  • 소스코드를 변경하고 있는데, 다시 원복해야 하는 상황에서 지금까지 변경한 소스코드를 별도로 보관하고 싶은 경우
  • 기능 추가를 위해 소스코드를 한창 변경하고 있는데, 급하게 버그 패치건이 들어와서 현재 작업을 보관하고 싶은 경우

이 외에도 Shelve를 코드 리뷰 용도로 활용하고 있다고 웹에서 읽은 적이 있습니다. (국내에서 이런 사례가 있다고는 들어본 적이 없습니다.)

즉, 개발자들이 변경한 코드를 곧바로 Check-in을 못하게 하는 대신 Shelveset으로 남기도록 합니다. 이후 관리자(또는 팀 리뷰 인력)에 의해서 해당 개발자가 Shelving 해놓은 "파일 목록"을 얻어내서 검사(예를 들어, 지난 버전과의 변경 사항 확인)를 진행하는 것입니다. 그렇게 해서 체크인할만한 수준의 코드라고 확정이 되면 그제서야 해당 Shelveset을 체크인 하도록 하는 것입니다. (실제로 이렇게 진행되는 프로젝트가 있다면 제품의 품질은 당연히 수준급이 될 수 있겠지요.)




지난 시간에 했던 예제 팀 프로젝트를 그대로 이어보겠습니다.
Changeset 53번에서 Class1.cs 파일을 변경하고, TestClass.cs 파일을 추가해서 다음과 같은 상태로 되었다고 가정하고.

tfs_apply_shelveset_1.png

위의 상태에서 갑자기 이전의 코드로 빌드된 배포버전에서 치명적인 버그가 보고되었다고 가정해 보겠습니다. 개발자는 판단을 해야 합니다. 구현하고 있던 기능을 마저 구현하고 버그를 수정하고 배포할 것인가? 구현하던 코드를 버리고(이전의 Changeset으로 원복하고) 버그를 수정하고 배포할 것인가? 마지막으로 구현하던 코드를 잠시 형상관리 서버에 별도 보관(Shelve)해 두고 이전 체크인 상태로 원복 후 버그를 수정할 것인가?

당연히 여기서는 Shelve를 선택한다고 보고.

솔루션 탐색기에서 마우스 오른쪽 버튼을 클릭해서 "Shelve Pending Changes..." 메뉴를 실행합니다.

tfs_apply_shelveset_2.png

다음과 같이 체크인과 비슷한 창이 열리는데, 특이하게 상단에 "Shelveset name" 입력란이 하나 더 있습니다.

tfs_apply_shelveset_3.png

또한, 하단에 "Preserve pending changes locally" 체크 박스를 해제하면 자동적으로 해당 파일들을 변경 이전의 Changeset으로 원복시켜 줍니다.

예상할 수 있듯이, 이러한 과정을 거쳐서 결국 Changeset 53번 소스 코드로 돌아가게 됩니다. 그런 다음 버그를 수정하고 체크인을 하면 이제 Changeset 54번이 최신 버전이 됩니다.

tfs_apply_shelveset_4.png

자, 이제 버그도 수정했으니, 다시 이전에 작업했던 코드를 이어서 작업하고 싶을 것입니다. 이전 단계에서 Shelving 해놓은 코드를 불러와야 하는데요. 해당 메뉴는 솔루션 탐색기에는 없고, "File" / "Source Control" / "Unshelve Pending Changes..." 경로로 선택할 수 있습니다. 그러면, 다음과 같이 이전에 보관해 두었던 Shelveset 목록이 나오고,

tfs_apply_shelveset_5.png

"Details..." 버튼을 누르면 선택된 Shelveset에 포함된 파일 목록을 얻을 수 있고, 특정 파일을 선택해서 지난 버전과 비교하는 것이 가능합니다.

"Delete" 버튼은 당연히 선택된 Shelveset을 삭제하는 것이고.

"Unshelve" 버튼은 보관되어 있던 것을 다시 현재의 프로젝트에 반영하게 됩니다.




여기서 유의할 사항이 하나 있는데.

위에서 설명한 시나리오에서는 Class1.cs, TestClass.cs 파일을 Shelve했고 버그 수정으로 Class1.cs 파일이 변경되고 다시 Unshelve 해서 Class1.cs, TestClass.cs 파일을 이전 버전으로 복원한 것입니다.

즉, 이렇게 되면 버그수정으로 인한 변경사항이 현재 로컬의 소스 파일에는 반영되어 있지 않은 것입니다.

그게 말이 되냐고요? ^^
흥분하지 마시고 ^^ 좀 더 지켜봐주세요.

물론, 말이 안됩니다. 이 때문에 그냥 이 단계에서 버그 수정 코드를 수작업으로 반영시켜주어도 되지만, 새로운 기능을 그냥 묵묵히 구현하셔도 상관없습니다.

왜냐하면, 그렇게 한 후 체크인을 하게 되면 그 시점에 다음과 같이 충돌로 인해 소스 코드를 체크인할 수 없다고 나온 후,

tfs_apply_changeset_8.png

"확인" 버튼을 누르면 예의 그 "Pending Changes - Conflicts" 창을 열어줍니다. (지난 Changeset 이야기에서 봤었죠.)

tfs_apply_shelveset_6.png
(이 예제에서는 충돌이 발생한 파일이 "Class1.cs"뿐이기 때문에 위의 목록에 항목이 하나 있습니다.)

만약, 버그 수정 코드를 수작업으로 로컬에 있는 Class1.cs 파일에 반영시켜주었다면 이 단계에서 그냥 "Keep Local Version" 버튼을 눌러서 진행하시면 됩니다.
당연히 "Take Server Version"을 눌렀다가는 "Changeset 54"의 Class1.cs 파일이 로컬에 덮어써지게 되고.

위의 이미지에서는 활성화되어 있지 않은데 만약 활성화가 되어 있다면 그냥 "AutoMerge" 버튼을 누르시면 자동으로 병합됩니다. (가끔, 자동병합을 믿을 수 없다고 무조건 수작업으로 하시는 분이 계신데... 이 단계에서 확신을 드리고 싶군요. ^^ 무조건 자동병합을 믿으셔도 좋습니다. Visual Studio는 단순 유형에 대해서 자동 병합할 뿐 복잡한 경우에서까지 스스로 추론하는 등의 무리수를 두지는 않습니다. 바로 그런 경우에 위와 같이 "AutoMerge"를 스스로 포기하는 것입니다.)

하지만, 위와 같이 비활성화되어 있다는 것은 프로그램적으로 병합할 수 없는 충돌이 있기 때문이어서, 이 경우에는 개발자가 직접 병합을 해야 합니다. 대신 "Merge Changes In Merge Tool" 버튼을 누르셔서 하시면 아주 편하게 진행하실 수 있습니다. 아래는 그 예제입니다.

tfs_apply_shelveset_7.png

화면이 상단 2개, 하단 1개로 이뤄져 있는데, 상단의 입체감있게 튀어나온 영역을 클릭하면 하단의 소스 코드에 반영이 됩니다. 또는 하단 영역은 직접 키 입력이 가능한 에디트 윈도우이기 때문에 거기서 수작업으로 타이핑 해서 수정하는 것도 가능합니다.

게다가 틀린 부분만을 "Previous Change", "Next Change" 버튼을 이용해서 편리하게 이동할 수 있어서 (이전에 버그수정해서) 변경된 코드 부분을 빠뜨리지 않고 작업하는 것이 가능합니다.

어쨌든, 적절하게 병합해서 "확인" 버튼을 누르시고. 충돌이 발생한 나머지 파일들도 있다면 동일하게 병합한 후 다시 체크인을 해주시면 됩니다. 그렇게 해서 다음과 같이 현재 작업한 기준으로 "Changeset 55"번까지 오게 되었습니다.

tfs_apply_shelveset_8.png

이 정도면, Shelve 기능에 대한 거부감이 줄어드셨겠죠! ^^




Shelve 기능은 꼭 위와 같이 형상관리 측면에서만 사용하는 용도를 넘어서, 보관하고 싶은 코드 조각들이 발생했을 때에도 그냥 임의로 사용하셔도 무방합니다. 사실, 방대한 changeset 코드 양에 비하면 여러분들이 아무리 많이 shelving해 놓아도 그 양은 거의 미미한 수준이라고 할 수 있기 때문에 전혀 부담갖지 않으셔도 됩니다.

그럼... 이 정도로 Shelving은 접어두고, ^^ 다음에는 "Label" 기능을 알아봅니다.



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

[연관 글]






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

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

비밀번호

댓글 작성자
 




... 16  17  18  19  [20]  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13151정성태10/31/20226131C/C++: 161. Windows 11 환경에서 raw socket 테스트하는 방법파일 다운로드1
13150정성태10/30/20226048C/C++: 160. Visual Studio 2022로 빌드한 C++ 프로그램을 위한 다른 PC에서 실행하는 방법
13149정성태10/27/20226036오류 유형: 825. C# - CLR ETW 이벤트 수신이 GCHeapStats_V1/V2에 대해 안 되는 문제파일 다운로드1
13148정성태10/26/20225957오류 유형: 824. msbuild 에러 - error NETSDK1005: Assets file '...\project.assets.json' doesn't have a target for 'net5.0'. Ensure that restore has run and that you have included 'net5.0' in the TargetFramew
13147정성태10/25/20225029오류 유형: 823. Visual Studio 2022 - Unable to attach to CoreCLR. The debugger's protocol is incompatible with the debuggee.
13146정성태10/24/20225879.NET Framework: 2060. C# - Java의 Xmx와 유사한 힙 메모리 최댓값 제어 옵션 HeapHardLimit
13145정성태10/21/20226201오류 유형: 822. db2 - Password validation for user db2inst1 failed with rc = -2146500508
13144정성태10/20/20226083.NET Framework: 2059. ClrMD를 이용해 윈도우 환경의 메모리 덤프로부터 닷넷 모듈을 추출하는 방법파일 다운로드1
13143정성태10/19/20226590오류 유형: 821. windbg/sos - Error code - 0x000021BE
13142정성태10/18/20225919도서: 시작하세요! C# 12 프로그래밍
13141정성태10/17/20227204.NET Framework: 2058. [in,out] 배열을 C#에서 C/C++로 넘기는 방법 - 세 번째 이야기파일 다운로드1
13140정성태10/11/20226551C/C++: 159. C/C++ - 리눅스 환경에서 u16string 문자열을 출력하는 방법 [2]
13139정성태10/9/20226224.NET Framework: 2057. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프로부터 모든 닷넷 모듈을 추출하는 방법파일 다운로드1
13138정성태10/8/20227628.NET Framework: 2056. C# - await 비동기 호출을 기대한 메서드가 동기로 호출되었을 때의 부작용 [1]
13137정성태10/8/20225914.NET Framework: 2055. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프로부터 닷넷 모듈을 추출하는 방법
13136정성태10/7/20226497.NET Framework: 2054. .NET Core/5+ SDK 설치 없이 dotnet-dump 사용하는 방법
13135정성태10/5/20226778.NET Framework: 2053. 리눅스 환경의 .NET Core 3/5+ 메모리 덤프를 분석하는 방법 - 두 번째 이야기
13134정성태10/4/20225460오류 유형: 820. There is a problem with AMD Radeon RX 5600 XT device. For more information, search for 'graphics device driver error code 31'
13133정성태10/4/20225841Windows: 211. Windows - (commit이 아닌) reserved 메모리 사용량 확인 방법 [1]
13132정성태10/3/20225734스크립트: 42. 파이썬 - latexify-py 패키지 소개 - 함수를 mathjax 식으로 표현
13131정성태10/3/20228563.NET Framework: 2052. C# - Windows Forms의 데이터 바인딩 지원(DataBinding, DataSource) [2]파일 다운로드1
13130정성태9/28/20225429.NET Framework: 2051. .NET Core/5+ - 에러 로깅을 위한 Middleware가 동작하지 않는 경우파일 다운로드1
13129정성태9/27/20225709.NET Framework: 2050. .NET Core를 IIS에서 호스팅하는 경우 .NET Framework CLR이 함께 로드되는 환경
13128정성태9/23/20228401C/C++: 158. Visual C++ - IDL 구문 중 "unsigned long"을 인식하지 못하는 #import파일 다운로드1
13127정성태9/22/20226874Windows: 210. WSL에 systemd 도입
13126정성태9/15/20227477.NET Framework: 2049. C# 11 - 정적 메서드에 대한 delegate 처리 시 cache 적용
... 16  17  18  19  [20]  21  22  23  24  25  26  27  28  29  30  ...