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


TFS의 Check In/Out 만을 기계적으로 하는 분들이 ^^ 있으신 듯해서, TFS의 소스 코드 관리에 대한 다양한 기능들을 잠시 알아볼까 합니다.

실습을 위해 다음과 같이 설정된 팀 프로젝트와 솔루션이 생성되어져 있고 이를 바탕으로 하나씩 살을 붙여가면서 설명해 보겠습니다.

tfs_apply_changeset_1.png
tfs_apply_changeset_2.png




파일 단위 복원


설정된 TestLibrary 프로젝트에 다음과 같은 변경을 합니다.

  1. Class1.cs 체크 아웃 및 편집
  2. MyClass.cs 파일 추가
  3. 1번 ~ 2번에 대한 체크인

위의 변경으로 인해 추가된 Changeset 번호는 52입니다. (Changeset 번호는 "팀 프로젝트" 단위가 아닌, "팀 프로젝트 컬렉션" 단위로 증가합니다. 즉, 이미 다른 팀 프로젝트의 체크인에서 번호가 증가했기 때문에 이번에는 그 이후의 번호를 할당받은 것입니다.)

이런 상태에서 다음과 같은 상황으로 진행될 수 있습니다.

  • 다시 Class1.cs 파일을 체크아웃하고 수정하고 있는데, 코딩이 원하는 방향으로 진행되지 않아서 다시 지난번 체크인 했던 시점으로 소스 코드를 돌리고 싶은 경우
  • Class1.cs 파일을 이후 변경/체크인 하고 나서 배포를 했는데, 그 버전의 Class1.cs 파일에 버그가 있다는 것이 밝혀졌으나, 고칠 시간은 없고 일단 이전 버전으로 빨리 돌려서 배포해야 하는 경우

2가지 경우 모두, 이전에 마지막으로 "체크인"했던 시점의 파일을 원하게 되는데요.

이를 해결하기 위해서, 솔루션 탐색기(또는 소스 컨트롤 탐색기)에서 오른쪽 마우스 버튼을 눌러서 "View History" 또는 "Get Specific Version..." 또는 "Get Latest Version" 등을 이용해서 해당 파일의 이전 체크인 시점을 선택하고 복원을 할 수 있습니다. 아마도 소스 컨트롤을 사용하면서 가장 빈번하게 사용하는 기능중의 하나일 것입니다.




Changeset 단위 복원


그런데, 파일 하나만이 아니고 체크인 했던 Changeset 전체를 제거하고 싶은 경우가 있습니다. 사실 개발하다 보면 이런 경우가 빈번하게 발생합니다. 왜냐하면 기능 하나를 구현하기 위해서 파일 하나를 수정하는 경우보다는 여러 개의 소스 코드를 같이 수정하게 되고, 이런 묶음을 같이 check-in 하기 때문입니다. (바로 이런 묶음 단위를 Changeset이라고 합니다.)

예제에서 설명해 보면, "Class1.cs" 파일과 "MyClass.cs" 파일을 한꺼번에 이전 시점으로 돌리고 싶은 경우가 이에 해당합니다. 즉, 원복을 하면 Class1.cs 파일은 편집이전의 상태로 돌아가고 "MyClass.cs" 파일은 프로젝트에서 삭제될 것입니다.

이런 때는, 지금까지 솔루션에 가했던 모든 Changeset을 확인하는 것이 도움이 되는데요. 일단, 솔루션 탐색기에서 "솔루션" 노드를 마우스 오른쪽 버튼을 클릭하고 아래와 같이 "View History"를 선택합니다.

tfs_apply_changeset_3.png

위와 같이 하고 나면, "TestSolution.sln" 파일만 포함하는 Changeset 목록이 나옵니다.

tfs_apply_changeset_4.png

이 때문에 전체 Changeset 목록을 확인하려면 다음과 같이 직접 "Source location"에서 "TestSolution.sln"을 없애고 "새로 고침"을 해주시면 됩니다.

tfs_apply_changeset_5.png

(또는 소스 컨트롤 탐색기에서 해당 팀 프로젝트 노드를 클릭하고 "View History"를 실행하면 위와 같은 결과를 동일하게 볼 수 있습니다.)

자, 이 상태에서 "Changeset 51" 번을 선택하고 "Get This Version"을 실행해 주면 "Class1.cs" 파일은 편집 이전의 상태로 돌아가고, "MyClass1.cs" 파일은 프로젝트로부터 제거됩니다.

tfs_apply_changeset_6.png




(2018-07-21: 아래의 기능은 이제 "Rollback..." 메뉴로 TFS에서 제공됩니다.)

그런데, "Get This Version"만 한 다음, Class1.cs (또는 이외의 솔루션/프로젝트) 파일을 선택하고 "최신 버전 가져오기"를 실행하면 Changeset 52번에서 적용한 내용으로 바뀌게 됩니다. 즉, 여전히 최신 버전은 Changeset 52번이고, 자신의 PC에만 원복한 것일 뿐이어서 다른 개발자들에게는 여전히 Changeset 52번으로 유지됩니다.

이유가 있어서 원복한 것인데, 이러면 곤란하죠.

그래서, 현재 상태를 최신 버전으로 만들어야 하는 데 이 과정이 다소 복잡합니다. ("Make this latest version"이라는 식의 메뉴가 있다면 좋을 텐데! ^^)

우선, "솔루션 탐색기"에서 해당 솔루션 이름을 선택하고 "Check Out for Edit" 메뉴를 실행해 주어서 전체를 체크아웃 시킵니다. (구체적으로 어떤 파일을 변경했는지 일일이 추적하는 것이 어려울 때(또는 귀찮을 때)를 기준으로 설명하는 것입니다.)

이때, 주의할 것은 다음과 같이 체크아웃 상자에서 "잠금 유형"을 "Check Out - Prevent other users from checking out and checking in"으로 설정해 주는 것이 좋습니다. (이유는 나중에 나옵니다.)

tfs_apply_changeset_7.png

그다음 곧바로 다시 "체크인"을 하시면 다음과 같이 충돌을 감지해서 체크인을 할 수 없다고 나옵니다.

tfs_apply_changeset_8.png

"확인" 버튼을 누르시면 아래와 같이 별도의 "Pending Changes" 창에 충돌된 목록이 나옵니다.

tfs_apply_changeset_9.png

위의 화면에서 항목의 왼쪽에 있는 "아래로 향한 화살표"를 클릭하면 다음과 같이 상세 옵션 화면이 펼쳐집니다. 여기서 "Keep Local Version"을 선택해야 되고, 나머지 목록들의 파일들도 모두 동일하게 작업해 주시면 됩니다.

tfs_apply_changeset_10.png

만약 이 과정에서 "잠금 유형"을 "Check Out - Prevent other users from checking out and checking in"으로 해주지 않았다면 누군가가 Changeset 52번으로 되어 있던 파일을 수정할 수 있고, 이렇게 되면 "Merge Changes In Merge Tool" 버튼으로 일일이 확인하면서 작업을 해주어야 합니다.

현실적으로 다른 사람이 작성한 소스를 함께 병합하는 것은 여간 귀찮은 작업이 아니기 때문에 차라리 애초부터 이를 방지하기 위해 잠금유형을 강하게 해서 체크아웃하시는 것이 좋습니다. (물론, 누군가가 체크아웃을 이미 했다면 그 개발자에게 이유를 설명하고 조치를 취하는 것이 편합니다.)

그렇게 모두 충돌을 해결한 다음 다시 Check-In을 시도하면 현재 버전으로 서버에 새롭게 Changeset이 53번으로 추가됩니다. 물론, 다른 개발자들도 최신 버전 가져오기를 하면 변경되기 이전의 Class1.cs 파일과 MyClass.cs 파일이 제거된 프로젝트로 돌아가게 됩니다.

아래는 최종 결과입니다.

tfs_apply_changeset_11.png




일단, 이 정도로 Changeset에 대한 개념 및 활용은 설명이 끝난 것 같습니다. 다음은, Shelveset에 대해서 알아보겠습니다.



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

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/7/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)
12906정성태1/9/20227069.NET Framework: 1131. C# - 네임스페이스까지 동일한 타입을 2개의 DLL에서 제공하는 경우 충돌을 우회하는 방법 [1]파일 다운로드1
12905정성태1/8/20226732오류 유형: 780. Could not load file or assembly 'Microsoft.VisualStudio.TextTemplating.VSHost.15.0, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
12904정성태1/8/20228743개발 환경 구성: 623. Visual Studio 2022 빌드 환경을 위한 github Actions 설정 [1]
12903정성태1/7/20227315.NET Framework: 1130. C# - ELEMENT_TYPE_INTERNAL 유형의 사용 예
12902정성태1/7/20227384오류 유형: 779. SQL 서버 로그인 에러 - provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.
12901정성태1/5/20227424오류 유형: 778. C# - .NET 5+에서 warning CA1416: This call site is reachable on all platforms. '...' is only supported on: 'windows' 경고 발생
12900정성태1/5/20229107개발 환경 구성: 622. vcpkg로 ffmpeg를 빌드하는 경우 생성될 구성 요소 제어하는 방법
12899정성태1/3/20228607개발 환경 구성: 621. windbg에서 python 스크립트 실행하는 방법 - pykd (2)
12898정성태1/2/20229163.NET Framework: 1129. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 인코딩 예제(encode_video.c) [1]파일 다운로드1
12897정성태1/2/20228026.NET Framework: 1128. C# - 화면 캡처한 이미지를 ffmpeg(FFmpeg.AutoGen)로 동영상 처리 [4]파일 다운로드1
12896정성태1/1/202210898.NET Framework: 1127. C# - FFmpeg.AutoGen 라이브러리를 이용한 기본 프로젝트 구성파일 다운로드1
12895정성태12/31/20219360.NET Framework: 1126. C# - snagit처럼 화면 캡처를 연속으로 수행해 동영상 제작 [1]파일 다운로드1
12894정성태12/30/20217305.NET Framework: 1125. C# - DefaultObjectPool<T>의 IDisposable 개체에 대한 풀링 문제 [3]파일 다운로드1
12893정성태12/27/20218900.NET Framework: 1124. C# - .NET Platform Extension의 ObjectPool<T> 사용법 소개파일 다운로드1
12892정성태12/26/20216896기타: 83. unsigned 형의 이전 값이 최댓값을 넘어 0을 지난 경우, 값의 차이를 계산하는 방법
12891정성태12/23/20216834스크립트: 38. 파이썬 - uwsgi의 --master 옵션
12890정성태12/23/20216950VC++: 152. Golang - (문자가 아닌) 바이트 위치를 반환하는 strings.IndexRune 함수
12889정성태12/22/20219367.NET Framework: 1123. C# - (SharpDX + DXGI) 화면 캡처한 이미지를 빠르게 JPG로 변환하는 방법파일 다운로드1
12888정성태12/21/20217518.NET Framework: 1122. C# - ImageCodecInfo 사용 시 System.Drawing.Image와 System.Drawing.Bitmap에 따른 Save 성능 차이파일 다운로드1
12887정성태12/21/20219598오류 유형: 777. OpenCVSharp4를 사용한 프로그램 실행 시 "The type initializer for 'OpenCvSharp.Internal.NativeMethods' threw an exception." 예외 발생
12886정성태12/20/20217502스크립트: 37. 파이썬 - uwsgi의 --enable-threads 옵션 [2]
12885정성태12/20/20217771오류 유형: 776. uwsgi-plugin-python3 환경에서 MySQLdb 사용 환경
12884정성태12/20/20216823개발 환경 구성: 620. Windows 10+에서 WMI root/Microsoft/Windows/WindowsUpdate 네임스페이스 제거
12883정성태12/19/20217676오류 유형: 775. uwsgi-plugin-python3 환경에서 "ModuleNotFoundError: No module named 'django'" 오류 발생
12882정성태12/18/20216770개발 환경 구성: 619. Windows Server에서 WSL을 위한 리눅스 배포본을 설치하는 방법
12881정성태12/17/20217273개발 환경 구성: 618. WSL Ubuntu 20.04에서 파이썬을 위한 uwsgi 설치 방법 (2)
... 16  17  18  19  20  21  22  23  24  25  26  27  28  [29]  30  ...