SVN MERGE
여전히 실무에서 많이 사용하고 있는 svn 의 merge 기능에 대하여 알아보겠습니다.
merge 란 branch 에서의 작업 내용을 trunk 로 적용하는 작업입니다.
예를 들면
- main trunk 에서 branch 를 생성하고 (svn copy)
- branch 에서 작업한 모든 변경 내용을 commit 한 이후에
- main trunk 로 다시 변경 내용을 병합합니다. (svn merge)
대상 | 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
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 에 변경 사항이 보여집니다.