본문 바로가기

형상관리

Push와 Pull 과정에서의 충돌 문제

충돌 문제를 말씀드리기 이전에 먼저 SVN과 Git에서 중앙 Repository로 데이터를 전송하는 과정에 대해서 비교를 해보도록 하겠습니다.

  • SVN
    1. 소스를 수정한다.
    2. 중앙 Repository와 동기화(Synchronize)를 하여 충돌 나는 문제가 없는지 확인한다.
    3. commit하여 데이터 전송

  • Git
    1. 소스를 수정한다.
    2. Local Repository에 commit한다.
    3. 중앙 Repository와 동기화를 하여 충돌 나는 문제가 없는지 확인한다.
    4. Push하여 데이터를 전송

조금 차이가 있죠? 그럼 이제 충돌 났을때의 처리 과정을 비교해 보겠습니다.

  •  SVN
    1. 소스를 수정한다. 
    2. 중앙 Repository와 동기화(Synchronize)를 하여 충돌 나는 문제가 없는지 확인한다.
    3. 충돌이 발생한 소스를 Merge 한다.
    4. Merge한 소스를 Mark as merged처리를 한다.
    5. commit하여 데이터 전송 

  • Git
    1. 소스를 수정한다.
    2. Local Repository에 commit한다.
    3. 중앙 Repository와 동기화를 하여 충돌 나는 문제가 없는지 확인한다.
    4. Pull을 이용해 Remote Repository의 최신 Branch를 Local Repository로 내려 받고 Merge한다. (여기서 Merge는 자동으로 해줍니다. 충돌나는 문서는 꺽쇠 괄호(<>)로 표기해줍니다.) 
    5. 충돌이 발생한 소스를 Merge 한다.
    6. Merge한 소스를 Add to Git Index 처리를 한다.
    7. Index처리된 소스를 Local Repository에 commit한다. 
    8. Push하여 데이터 전송
     

Git이 Repository를 Local에 한벌 더 가지고 있다보니 SVN보다는 과정이 조금 더 복잡하긴 합니다만, 이러한 단점을 상쇄하고도 남을 정도의 장점이 있기 때문에 이정도는 감수해야 하지 않을까요? ㅎㅎ

SVN은 간혹가다 동기화 작업을 안하고 Commit하시는 분들이 계셔서 어떨땐 중앙 Repository에 있는 소스에 문제가 생기는 경우를 종종 봐왔습니다. Git은 충돌이 발생할 경우 Pull 이전에 Push를 할 수 없게끔 엄격하게 관리 되기 때문에 SVN에서 개발자의 실수로 인해 발생하는 문제가 조금 줄어들지 않을까 생각됩니다. (복잡하긴 하지만 이런건 장점이긴 하죠..)

 

충돌이 발생했을때의 처리 순서를 확인했으니 본격적으로 예제를 통해 확인해 보도록 하겠습니다. 

예제에 사용된 소스는 이전 게시물에서 생성 했었던 프로젝트에서 작성된 소스이며, StartMain.java 를 

두명의 개발자가 동시에 수정했다고 가정하고 진행하도록 하겠습니다.

현재 A개발자의 소스 내용은 아래와 같으며, B라는 개발자는 이미 동일한 소스를 수정하여 Remote Repository에 Push를 해놓은 상태입니다.

그럼 이제 위 소스를 수정부터 시작해서 Push과정까지 처음에 말씀드렸던 충돌이 발생했을 때 Git의 처리 순서대로 진행을 하도록 하겠습니다.


Step 1. 소스를 수정한다.

위 이미지의 소스를 아래와 같이 수정을 하겠습니다.


Step 2. Local Repository에 commit한다.

이전 push관련 문서에서 설명 드렸지만 Local Repository는 개인만 사용하는 공간이기 때문에 특별한 경우가 아니라면 문서 충돌이 발생하지 않습니다.  

바로 소스를 Commit 하도록 하겠습니다.

프로젝스명에서 오른쪽 마우스를 누르고 Team => Commit 선택합니다.

Commit Changes 창에서 내용을 입력 한 후 Commit 버튼을 누릅니다.

팝업 창 하단의 Commit and Push는 현재 충돌이 나고 있는 상태라서 누르시게 되면 충돌 오류가 발생합니다. (경험삼아 어떤 에러 문구가 나오는지 보시는것도 나쁘지 않습니다.)


Step 3. 중앙 Repository와 동기화를 하여 충돌 나는 문제가 없는지 확인한다.

Local Repository로 소스를 Commit한 상태이니 Remote Repository로 Push하기 전에 동기화를 거쳐 소스 충돌이 발생하고 있는게 없는지 확인해 보아야 합니다.

(확인 안하셔도 어차피 Push를 하게 되면 충돌로 인해 진행은 되지 않습니다.)

프로젝트명에서 오른쪽 마우스 클릭 후 Team => Synchronize Workspace를 선택합니다.

Synchronize Workspace를 선택하면 소스 확인을 거친 후 Team Synchronizing perspective 화면으로 전환할 것인지에 대해 물어보는 팝업 창이 발생합니다.

창을 이동하셔도 되지만 No를 선택하면 하단 View에 별도의 Synchronize View 생겨서 거기서 perspective에서 하는 작업을 동일하게 진행할 수 있기때문에 저는 No를 선택하겠습니다.

No를 선택하시면 이클립스 하단 Viewer에 동그라미 쳐진 View가 새로 생기며, 네모로 표시된 부분에서 충돌이 발생한 파일을 확인 하실 수 있습니다. 

네모로 표시된 부분에선 충돌이 발생한 파일 뿐만 아니라 수정되었거나 업데이트될 파일 목록들이 같이 표시 되며 충돌 문서는 그림에서처럼 붉은색 화살표로 표시됩니다.

(작아서 화살표인지는 잘 구분이 안되시겠지만 실제로는 화살표입니다.)


Step 4. Local Branch Update

Pull을 이용해 Remote Repository의 최신 Branch를 Local Repository로 내려 받고 Merge 합니다. 전에 잠깐 언급 한적이 있지만 Remote Repository에서 소스를 내려 받는 방식은 Fetch와 Pull이 있는데요,

여기서 사용될 Pull은 소스를 내려 받은 후 자동으로 Merge하는 기능까지 포함되어 있습니다. 

프로젝트명에서 오른쪽 마우스 클릭 후 Team => Pull을 선택합니다.

Local Repository에 소스를 내려 받은 후 Merge한 결과를 알려주는 팝업이 뜹니다. OK를 눌러 줍시다.



Step 5. 충돌이 발생한 소스를 Merge 한다.

Pull을 하게 되면 소스가 다음과 같이 꺽쇠(<>)를 통해 충돌나는 부분을 표시 해줍니다. Head부분이 A개발자 즉, 자신이 수정한 부분이며 이퀄(===)문자를 기준으로 그 아래는 Remote Repository에 올라가 있는 수정된 버전입니다.

충돌나는 부분이 어디인지 확인이 되었으니 이제 수동으로 Merge를 해보도록 하겠습니다. 

예제에서는 아래와 같이 B개발자가 수정한 사항도 반영하여 소스를 수정해 보았습니다.


Step 6. Add Index 처리를 한다.

Add Index 처리를 하는것은 Git의 개념적인 부분을 아셔야 이해 하실 수 있는 구간인데요, 수정한 소스는 기존에 있는 StartMain.java라는 파일이지만 해당 파일은 B라는 개발자가 수정한 파일과 A라는 개발자가 수정한 파일을 서로 취합하려고 했더니 충돌이 발생을 하여 새로운 Index를 만들어 줘야 정상적으로 Commit이 가능해 집니다. (개념은 잘 이해 안되셔도 그냥 Merge하고 Index 처리를 해야한다 정도만 알아두시면 됩니다.)

이클립스 하단의 Synchronize View에서 충돌난 StartMain.java 파일에 오른쪽 마우스를 클릭하고 Add to Git Index 를 선택합니다.

그러면 뭔가 좀 변했죠? 충돌난 파일에 조그맣게 +기호가 생겼습니다. 이제 Local Repository로 다시 Commit 하도록 하겠습니다.

캡쳐를 해봤더니 너무 작아 분간이 안되더군요. 나중에 직접 확인 해 보시기 바랍니다.



Step 7. Index처리된 소스를 Local Repository에 Commit한다. 

Commit은 Step 2에서 진행했던 그대로 해주시면 됩니다. 

한가지 차이점은 충돌난 문서를 수동으로 Merge하고 Commit을 하게 되면 Commit Changes창의 내용을 입력하는 부분에 충돌났던 파일 정보가 자동으로 들어가 있습니다. 

내용을 더 추가하실거면 이어서 작성 하시면 되구요, 저는 그냥 Commit만 하도록 하겠습니다.

Merge를 하고 Local Repository로 Commit을 하게 되면 아래 이미지의 네모로 표시해 둔 부분 처럼 이제 이클립스 하단 Synchronize View에 충돌이 난다는 붉은색 표시가 사라진걸 확인 하실 수 있으실 겁니다.



Step 8. Push하여 데이터 전송

충돌문제를 해결 하였으니 Remote Repository로 소스를 올려 보기로 하겠습니다. 프로젝트명에서 오른쪽 마우스 클릭 후 Team => Push to Upstream을 선택합니다.

정상으로 Push가 이루어 졌다면 아래 팝업 처럼 Push 결과를 보여주는 팝업이 띄워졌을 겁니다.



여기까지 Git에서 Remote Repository로 소스를 전송하거나 내려받을때 발생하는 충돌 문제를 해결하는 방법에 대해 확인해 보았습니다.

이정도만 되어도 프로젝트를 진행하시는데는 큰 무리는 없을거라 생각되지만 Git을 좀더 강력히 사용하기 위해서는 Branch와 Tag에 대해 더 알아 두시는게 좋을거라 생각됩니다.

나중에 시간이 되면 Branch와 Tag에 대해서도 다뤄보도록 하겠습니다.

'형상관리' 카테고리의 다른 글

Git의 Checkout과 Commit 그리고 Push Pull  (0) 2017.06.23
Git 프로젝트 생성하기  (0) 2017.06.20
Git 설치 및 명령어 정리  (0) 2017.06.20