본문 바로가기

개발

SVN MERGE

SVN MERGE


여전히 실무에서 많이 사용하고 있는 svn 의 merge 기능에 대하여 알아보겠습니다.


merge 란 branch 에서의 작업 내용을 trunk 로 적용하는 작업입니다.

예를 들면

  • main trunk 에서 branch 를 생성하고 (svn copy)
  • branch 에서 작업한 모든 변경 내용을 commit 한 이후에
  • main trunk 로 다시 변경 내용을 병합합니다. (svn merge)

설명을 위해 아래와 같이 수정된 소스 (branch) 와 목적지 소스 (trunk) 를 가정하겠습니다.

 대상

 svn 경로

디렉토리 경로 

 수정된 소스

svn://localhost/leerounn/branches/br_1

 svn.trunk

 목적지 소스 

svn://localhost/leerounn/trunk

 svn.trunk


branch 디렉토리로 이동합니다.

그리고 svn log --stop-on-copy 를 실행합니다.


[leerounn@localhost svn.br_1]$ svn info

경로: .

작업 사본의 루트 경로: /home/leerounn/blog/common/svn.br_1

URL: svn://localhost/leerounn/branches/br_1

저장소 루트: svn://localhost/leerounn

저장소 UUID: 8b8cd763-7a0f-47dc-91c9-f257d8ec82d8

리비전: 4

노드 종류: 디렉토리

스케쥴: 일반

마지막 수정 작업자: leerounn

마지막 수정 리비전: 4

마지막 수정 일자: 2019-03-17 21:45:38 +0900 (2019-03-17, 일)


[leerounn@localhost svn.br_1]$ svn log --stop-on-copy

------------------------------------------------------------------------

r4 | leerounn | 2019-03-17 21:45:38 +0900 (2019-03-17, 일) | 1 개의 행


version 0.0.2

------------------------------------------------------------------------

r3 | leerounn | 2019-03-17 21:41:35 +0900 (2019-03-17, 일) | 1 개의 행


copy branch br_1 from trunk@2

------------------------------------------------------------------------


svn log 를 이용해 branch 에서 일어난 이력을 살펴봅니다.

이때 --stop-on-copy 옵션은 svn 의 기록을 copy 가 발생하기 전까지만 보여줍니다.

copy 와 관련없이 수없이 많은 기록이 출력되면 내용을 분석하기 어렵기 때문에 항상 --stop-on-copy 옵션을 붙여 사용하는 습관을 가져봅시다.



위의 기록을 보면 revision 3 이 최초 기록입니다. r3 은 제가 copy 를 이용해 branch 를 생성한 기록입니다. 

branch 의 최소 revision 이 중요한데, 병합 작업시에 병합의 최초 지점으로 지정해야 하기 때문입니다.


comment 에 trunk revision 2 에서 copy 해왔다고 써있지만, 만약 comment 가 부실했다면 어떻게 확인 가능할까요?


r3에 대한 기록을 자세히 보겠습니다.


[leerounn@localhost svn.br_1]$ svn log -r3 -v

------------------------------------------------------------------------

r3 | leerounn | 2019-03-17 21:41:35 +0900 (2019-03-17, 일) | 1 개의 행

변경된 경로:

   A /branches/br_1 (원본 /trunk:2)


copy branch br_1 from trunk@2

------------------------------------------------------------------------


svn log 의 옵션으로 revision 과 -v 를 이용하여 svn log --stop-on-copy 의 최초 기록을 자세히 보면

원본 디렉토리와 해당 revision 을 알 수 있습니다.


※ branch 디렉토리에 commit 되지 않은 수정된 내용이 있다면 병합 작업에 포함되지 않습니다.


이제 실제로 병합 작업을 하기 위해 trunk 디렉토리로 이동합니다.


[leerounn@localhost svn.trunk]$ svn info

경로: .

작업 사본의 루트 경로: /home/leerounn/blog/common/svn.trunk

URL: svn://localhost/leerounn/trunk

저장소 루트: svn://localhost/leerounn

저장소 UUID: 8b8cd763-7a0f-47dc-91c9-f257d8ec82d8

리비전: 4

노드 종류: 디렉토리

스케쥴: 일반

마지막 수정 작업자: leerounn

마지막 수정 리비전: 2

마지막 수정 일자: 2019-03-17 21:39:29 +0900 (2019-03-17, 일)


[leerounn@localhost svn.trunk]$ svn st -q

[leerounn@localhost svn.trunk]$ 


svn info 를 실행해서 목적지 소스인 trunk 가 맞는지 확인합니다.

그리고 svn st -q 를 실행해서 수정된 내용이 있는지 확인합니다.

작업 사본에 수정된 내용이 있다면 commit 을 하거나 새로 checkout 을 받는 등 수정된 내용이 없도록 합니다.

이유는 병합된 내용과 이미 수정된 내용이 구분이 되지 않기 때문입니다.

항상 깨끗한 작업 사본에서 병합 작업을 하도록 합니다.


이제 마지막 병합 작업입니다.

[leerounn@localhost svn.trunk]$ svn merge svn://localhost/leerounn/branches/br_1 -r3:head

--- 병합중: r4 리비전을 '.'에 병합:

U    main.cpp

A    version.h

--- r4의 병합정보를 '.'에 기록중:

 U   .


실행 결과에 대한 출력은 svn 버전에 따라 상이 할수 있습니다.


실행한 merge 명령의 의미는 아래와 같습니다.

  • 병합할 원본 소스의 svn 경로는 svn://localhost/leerounn/branches/br_1 이다.
  • 병합할 수정 내용, 즉 revision 범위는 3~head 까지다.

병합할 원본 소스는 수정 작업을 수행한 branch 의 svn 경로가 되겠습니다.


병합할 범위의 시작 지점은 branch 에서 svn log --stop-on-copy 명령으로 찾은 branch 시작 지점입니다.

다른 시작 지점을 사용할수도 있지만 특별한 이유가 없으면 branch 시작 revision 이 대부분 사용됩니다.


병합 마지막 지점은 head 입니다.

branch 의 모든 수정 사항을 반영하겠다면 head 를 사용합니다.

만약 branch 의 마지막 내용 중 일부를 반영 하지 않겠다면 반영하고자 하는 마지막 revision 을 사용합니다.


이제 병합이 완료 되었지만 병합 내용이 commit 되지는 않았습니다.

즉, 작업 사본에 수정된 상태로만 남아있지 trunk 에 반영된 상태는 아닙니다.


[leerounn@localhost svn.trunk]$ svn st -q

 M      .

M       main.cpp

A  +    version.h


위에서 보듯이

main.cpp 파일은 수정되었으며

version.h 파일은 추가되었습니다.


이제 병합된 내용을 충분히 확인하고 검증을 하였으면

trunk 로 commit 을 수행합니다.


[leerounn@localhost svn.trunk]$ svn commit -m "merge branch br_1"

전송중         .

전송중         main.cpp

추가          version.h

파일 데이터 전송중 .

커밋된 리비전 5.


[leerounn@localhost svn.trunk]$ svn log 

------------------------------------------------------------------------

r5 | leerounn | 2019-03-17 23:36:42 +0900 (2019-03-17, 일) | 1 개의 행


merge branch br_1

------------------------------------------------------------------------

r2 | leerounn | 2019-03-17 21:39:29 +0900 (2019-03-17, 일) | 1 개의 행


main version 0.0.1

------------------------------------------------------------------------

r1 | leerounn | 2019-03-17 21:32:49 +0900 (2019-03-17, 일) | 1 개의 행


add dir

------------------------------------------------------------------------


이제 commit 을 완료 했습니다.


svn log 를 실행하면 trunk 에 변경 사항이 보여집니다.