[자바.java] eclipse 에서 subversion[VisualSVN] 사용하기 #4 버전관리

이제 파일에 변화를 주었을때 어떤일이 벌어지는지 살펴보자

01. 파일의 내용을 변경시켰을때
02. 파일을 추가,삭제,이름을 변경했을때
03. 폴더를 추가,삭제,이름변경을 했을때

하나하나 살펴보도록하자.

먼저 파일의 내용을 변경해본다.

이모습이 E2.java 파일의 내용을 바꾸고 저장했을때의 모습이다.


[Package Explorer]뷰에서는 E2.java 파일옆에 별표아이콘이 나타났고 그 파일이 속한 East폴더옆에도 보이고 또 그 폴더가 속한 src폴더옆에도, 최종적으로 프로젝트이름옆에도 별표아이콘이 보인다. 변화가 한눈에 팍 들어오지는 않는다. 조금후 변화가 한눈에 느껴지도록 색깔을 입혀보도록한다,

[Synchronize]뷰를 보면 명확하다. 변화가 생기면 바로 표시가 되니까. 예상대로 오른쪽화살표가 나타났다. [outbound changes] 가 발생했음을 의미한다고 말했었다. 그리고 [Commit]버턴도 활성화되어있다.
만약 이 뷰에 변화가 없다면 이 화면과 프로젝트가 연결이 되어있지 않아서 그런것이니까 서로 연결을 시켜주면된다. 프로젝트이름에서 컨텍스트메뉴[그 이름을 마우스 오른쪽 버턴으로 눌러서 나타나는 메뉴]를 불러 [ Team > Synchronize with Repository ]를 선택하면 된다.


[SVN Repo..]뷰에서 빨간박스친 [Refresh view]버턴을 눌러도 변화가 없다. 당연하다. 이 뷰는 서버저장소의 상태를 나타내는데 아직 서버에서는 로컬의 변화를 전해듣지 못했다.

더 진행하기전에 [Package Ex..]뷰에 색깔을 입혀보자.

메뉴의 [ Window > Preferences ] 를 눌러 나타나는 대화상자에서 두군데를 바꿔줘야된다

첫번째는 [ General > Appearance > Colors and Fonts ] 의 [SVN]에서 [Outgoing Change (Background)]에 색깔을 입히는 것이고 물론 그 밑의 글자색을 바꿔도 되겠다.

두번째는 [ Team > SVN > Label Decorations ] 의 [General ] 탭에서 [ Enable font and color decorations ] 에 체크하는것이다.

두 화면을 그림한장에 담고자 약간 편집했다..



이렇게 설정을 바꾸면 [Package Explorer]의 화면이 이렇게 바뀐다. 
색칠이 되어있어 한눈에 알아볼 수 있다.


이제 커밋하면 아래와 같이 변화된 파일만 그러니까 E2.java파일만 리비전이 3으로 바뀌었다.


여기서 리비전3 인 E2.java 파일과 리비전2인 W1.java파일에 수정을 가한다음 두개를 같이 커밋한다면 리비전번호가 어떻게 변할까? 리비전3은 4로, 리비전2는 3으로 변할까? 아니면 둘다 가장 높은번호인 4로 같이 변할까?
한번 확인해보자.

먼저 두개의 파일의 내용을 변경하고 저장했을때의 모습이다.(커밋전)


이게 커밋후의 모습이다.


[ SVN Repositories ]는 자동갱신되지 않기때문에 빨간박스친 [ Refresh View ]버턴을 눌러줘야된다.

둘다 리비전4로 변했다. 

이것은 Subversion 이 파일단위로 리비전번호를 매기는 것이 아니라 커밋이 일어난 횟수로 리비전번호를 매김을 알 수 있다. 즉 각각의 파일에 몇번의 변화가 있었는가를 추적하는게 아니라 전체적으로 몇번의 변화가 있었는가를 추적하는 것이다. 지금 W2.java 는 [리비전2]인데 이 파일의 내용을 수정하여 커밋한다면 바로 [리비전5]가 될것임을 예상할 수 있다. 이 파일입장에서는 3번의 변화밖에 없었지만 리비전은 5 가 되는것이다. 왜 이런 일을 벌이는 것일까? 
그건 아마 저장소단위[ falls레벨 ]로 파일을 관리하고 싶기 때문일것이다. 오늘 하루 서너시간 작업을 했다고 하면, 보통 파일이 하나만 변하지는 않을것이다. 여러개의 파일들에 변화가 있었을 것이고 어쩌면 폴더가 추가되었거나 삭제되었을 수도 있을것이다.  작업을 마치며 커밋을 하면 하나의 리비전번호를 변화된 파일들이 다 같이 공유해서 갖기때문에 히스토리를 볼때나 과거로 돌아갈 때도 편리할 듯도 싶다.

히스토리뷰를 한번 보자.

[SVN Repositories]뷰에서 https://localhost/svn/falls 의 컨텍스트메뉴에서 [Team > Show History ] 하면 버전번호와 작업했던 내역을 알 수가 있다.


[4]가 적힌 행을 클릭하면 조금전 파일두개를 고치고 커밋하면서 적어넣었던 설명까지 포함해서 내역이 나타난다. 조금 더 구체적인 내역을 알고 싶으면 해당되는 곳에서 컨텍스트메뉴를 불러 [Compare...] 를 클릭하면 다음과 같은 상자가 나타난다.


[리비전4] 와 [리비전3]을 비교하려면 여기서 OK버턴을 누르면 된다. 나타나는 화면을 보면 두개를 어떻게 비교하고 있는지 직관적으로 이해할 수 있다. 

[Compare with HEAD Revision]은 최신리비전과 비교하겠느냐하는 뜻이다. 여기에서 HEAD는 문자그대로 머리를 뜻하는데 이렇게 생각하면 쉽다. 동전쌓듯이 변화가 있을때마다 차곡차곡 버전별로 쌓아올린곳에서 제일 꼭대기, 머리에 해당되는 곳의 데이타는 가장 최신의 데이타가 아니겠는가

* 파일을 수정하고 저장한 뒤 커밋을 하기전에 그 수정을 취소하고 싶을때는 어떻게 하는가?

두가지 방법이 있다.

[ Rivert ]와 [Get Contents]인데 결과는 같은데 차이가 있다. 파일하나만 수정하면 그 차이를 느끼기 어려우니 두개의 파일을 수정하여 그 차이를 명확하게 알고 있도록 하자.

W1.java 파일과 W2.java파일을 수정하고 저장한 다음 커밋하기 전에 그 파일을 수정전으로 돌려보자.

두개의 파일을 수정하고 저장을 하면 패키지뷰가 이렇게 변한다.

프로젝트이름인 [tr]의 컨텍스트메뉴를 연다음 [ Team > Revert... ]을 선택하면 [Revert]대화상자가 나타나는데 


각각을 선택할 수 있는 체크박스가 나타나있다. 다 선택할 수도있고 그렇게 하지 않을 수도 있다. [OK]버턴을 누르면 수정전으로 돌아간다. 

[Get Contents]는 하나의 파일만 대상으로 한다.
그러니 각각 하나씩 선택해서 두번을 실행해야된다.

다시 두개의 파일을 수정하고 저장한 뒤 W1.java파일의 컨텍스트메뉴를 띄운다음 [ Team > Show history ] 를 선택하여 히스토리뷰를 연다. 히스토리뷰의 해당항목에서 다시 컨텍스트메뉴를 띄운다음 [ Get Contents ]를 선택하면 [ You have local changes. Do you want to overwrite them ? ] 이라고 묻는 대화상자가 뜨는데 [Yes]를 선택하면 된다. W2.java파일에도 반복 적용한다.

아마 이 방법보다는 [Rivert]를 더 자주 사용할 것 같다.



컨텍스트메뉴의 [Team]은 메뉴의 아래쪽에 있어서 선택하는데 시간이 걸리는데 이것은 [ SVN ] 메뉴바를 등록하여 쓰면 편하다. [Window > Customize Perspective... ] 에서 [ Command Groups Availability ] 의 [SVN]을 선택하면 그게 메뉴바에 나타난다. 이제 부터는 이 메뉴바를 사용하겠다.


* 파일을 변화시키고 저장후 커밋까지 한다음에 되돌리고 싶을때는 어떻게 하는가?

이때도 히스토리뷰의 컨텍스트메뉴를 사용한다.
차례대로 해보자

01. W2.java파일을 수정하고 저장한다음 커밋하면서 [W2수정]이라고 주석을 붙여본다. 그러면 전체상황이 이렇게 보일것이다.



[히스토리]뷰는 어디에서 부르느냐에 따라 다른 결과가 나타난다는것에 유의하며 [패키지]뷰의 W2.java파일을 선택한 다음 [SVN]메뉴의 [Show history]를 선택한다. 이것은 W2.java파일의 히스토리를 보여준다.

히스토리뷰의 [리비전5]항목에서 컨텍스트메뉴를 띄워 [Revert Changes from Revision 5]를 수행하면 이런 에러메시지를 만나게된다.

이 메시지는 [ Revert ..] 명령을 실행할 때마다 만나게 되는데 여기서 명심해두자. 밑줄친 안내 처럼 먼저 [ update ]를 실행한 다음 이 명령을 실행하자. 이 명령은 undo 명령이다. 과거로 돌아가는 명령, 그러니까 [리비전5로 올라가면서 일어난 모든 변화를 무효로 하겠다]는 명령이다. 지금은 파일 하나의 내용을 변화시키면서 리비전4에서 5로 올라갔는데 만약에 파일을 삭제,이름변경,폴더삭제,폴더이름변경같은 일을 하고 리비전5로 올라갔어도 그 모든변화를 무효로 한다. 이건 조금있다 다시 살펴보겠다.

프로젝트이름을 선택한다음 [SYN]메뉴에서 [ Update to HEAD ]를 누르면 물어보는것 없이 업데이트가 실행된다. 여기서 HEAD는 서버저장소에 저장되어있는 여러버전중에서 가장 최신의 버전이라고 말한바 있다. 화면상의 변화는 없고 콘솔창의 메시지를 살펴보면 update명령을 실행했음을 알 수 있다. 이제 위의 [Revert Changes from Revision 5] 명령을 실행하면 수정한 W2.java 파일이 수정전으로 돌아가고 [패키지뷰]와 [Sync..뷰]에서는 커밋할게 생겼다는 표시를 해준다. 이제 주석을 달면서 커밋을 하면 W2.java의 리비전이 5 에서 4로 돌아가지 않고 [6]으로 변한다. 커밋을 했으니까 무조건 리비전번호는 올라간다. 이 번호는 과거로 가는 일은 없다. 물론 히스토리에도 내역이 남는다. 

이제 파일과 폴더를 삭제하고 이름을 바꾸는걸 해보자.

그 전에 각 파일들의 버전을 기억해놓자. 차례대로 2,4,4,6 이다. 

[Package Explorer : 이것을 줄여 패키지뷰라고 부르자]에서 하는것과 [SVN Repositories : SVN뷰]에서 하는게 조금 차이가 있는데 이것만 기억해두면된다. 복원할 때 [ revert..] 하기 전에 [ update..]를 할것.

01. East폴더를 복사하여 South로 만든다.
02. West폴더를 삭제
03. East폴더의 이름을 North로 바꾼다.
04. North폴더의 E1.java ---> N1.java로 이름을 바꾼다
05. North폴더의 E2.java ---> N2.java로 이름을 바꾼다.

패키지뷰에서 01과 02작업을 하고 
03작업은 SVN뷰에서 하면서 주석을 [East -> North]라고 한다음 커밋한다.
04작업은 SVN뷰에서 하면서 주석을 [E1 -> N1 ]이라 하고 커밋한다.
이제 05작업을 패키지뷰에서 하기 위해 패키지뷰의 프로젝트이름을 마우스로 선택한다음 커밋한다. 주석은 [East=South,West삭제]라고 한다. 이 커밋을 하면 에러가 날텐데 이때는 [Update to Head]를 한다음 [Commit]한다.
05작업을 이런식으로 해보자. 즉, 패키지뷰에서 E2.java를 N2.java로 복사한 다음 E2.java파일을 지운다. 이제 커밋을 하면서 주석은 [E2=N2,E2삭제]하고 한다. 자바문법관련 에러가 생길 수가 있는데 무시하고 커밋한다.

E1,E2,N1,N2 중 과거의 이력을 가지고 있는 파일이 무엇인가?

E1,E2,N2는 복사되어 새로 만들어졌으니까 과거가 없다. 그러나 N1은 이름만 바뀌었기 때문에 과거추적이 가능하다. N1을 선택한다음 [show history]하면 과거의 이력이 나타난다. 그러나 딴 파일들은 그런게 없다. 

이제 파일작업을 하기전의 좋았던 시절로 돌아가보기로 하자.


패키지뷰의 [tr]의 히스토리뷰을 불러와야된다. 딴걸 불러오면 [revert]메뉴가 나타나지 않는다. 주의

히스토리뷰에서 빨간박스친 부분을 다 무효로 만들면 된다. 하나하나 revert 할 수 밖에 없다. 즉, 먼저 리비전10을 무효로 돌리고 그다음은 리비전9,8,7까지 이처럼 역순서로 그러니까 최근에 했던 작업부터 무효로 만든다.

여기서 실수를 하면 충돌이 발생하면서 과거로 돌아가지 못할 수도 있으니까 주의한다.

01. 리비전10의 컨텍스트메뉴를 불러 [Revert Changes from Revision 10]선택.
02. 나타나는 [Revert Revision]대화상자에서 OK버턴을 누른다.
03. 패키지뷰의 tr을 선택한다음 [commit]한다.
04. 패키지뷰의 tr을 선택한다음 [update to head] 한다.
05. 히스토리뷰를 [refresh]하여 변화내역을 확인한다.

위 과정을 세번 더 반복한다. [리비전9,8,7]
그러면 아래그림처럼 리비전6의 상태로 돌아올 수 있다.

파일들의 리비전을 살펴보면 다시 2,4,4,6 으로 돌아왔다. 파일의 내용이 아니라 파일이름이나 폴더관련해서 커밋이 일어났기 때문에 파일들이 복원되면서 예전의 번호를 되찾았다는 사실에 유의한다. 파일의 내용을 수정한 뒤 커밋하면 커밋하면서 1증가하고 만약 커밋을 취소한다면 revert한뒤 그 revert한 결과를 커밋해야하기 때문에 다시 리비전번호가 1증가하게 된다. [ 리비전번호 변화관련해서는 차차 자세히 다룰것이다 ]

덧글

  • 손님 2013/06/18 13:16 # 삭제 답글

    좋은 정보 감사합니다. ㅎㅎ 혹시나 해서 검색해봤는데 찾는게 있었네요~
  • 손님1 2017/08/23 21:48 # 삭제 답글

    팀싱크 에서 옆에 이름 뜨게는 못하나요?
댓글 입력 영역