'Rebase'에 해당되는 글 1건

  1. 2012.08.02 Eclipse에서 Git Rebase 수행 및 충돌 해결 방법

참고 - http://wiki.eclipse.org/EGit/User_Guide#Rebase_Conflicts


Rebase 소개 

브랜치 A을 복사한 브랜치 B에서 작업 중, 누군가 브랜치 A에 커밋 하였다고 하자. 


 

                                          B'        A'

--o--o--o--o--o     Branch A

        |

         --o--o--o Branch B



향 후,  브랜치 B의 작업을 다시  브랜치 A에 반영하고 싶다면,  브랜치  B를 브랜치 A에 Merge해야 한다. 

그러나 아직, B의 작업이 끝나지 않아 반영하지는 않는다고 가정하자. 

대신 커밋 A'의 내용을 현재 B의 작업에 사용하기 위해,  브랜치 A을 B에 반영하기 원할 때가 있다.

아니면 향후 Merge 시의 무수한 충돌들이 염려되어 수시로 최신의  브랜치 A를  브랜치 B에 반영하면서 작업하고

싶다고 가정하자. 

 이럴 경우, 우리는 Merge 대신 Rebase을 선택하게 된다. Rebase 명령어의 동작 방식은 다음과 같다. 

  1. 브랜치 B의 커밋 B' 이후의 커밋들을 임시 저장하고  브랜치 B를 커밋 B' 상태로 되돌린다.
  2. 브랜치 B에  브랜치 A의 커밋 B' 이후의 커밋들, 즉 커밋 A'를 반영한다. 
  3. 1에서 임시저장한  브랜치 B의 커밋들을  브랜치 B에 반영한다.  

Rebase 후의 결과는 아래와 같이 우리가 원하는 결과를 볼 수 있다. 


 
                                          B'       A'

--o--o--o--o--o     Branch A

                      |

                       --o--o--o Branch B




Eclipse에서의 Rebase  방법

Image:EGit-0.10-StartRebaseFromRepoView.png

Eclipse의 EGit에서도 위와 같이 Rebase를 지원한다. Rebae 방법은 2가지가 있다. 

  1. Git 저장소 뷰에서나, 프로젝트의 Team 메뉴에서 Rebase를 선택하고 기준으로 삼기 원하는 브랜치, 혹은 커밋, 태그 등을 선택
  2. Git 저장소 뷰에서 기준으로 삼기 원하는  브랜치를 직접 선택



Eclispe에서 Rebase 충돌 해결 방법 

  그러나 실제 작업 중에는 위와 같은 Rebase 중 충돌이 일어날 때가 많다. Merge 때와 마찬가지로, 충돌을 해결해야 하는데, 

Eclipse에서 충돌을 해결해도 계속 문제가 발생하여 한참을 헤맨 적이 있다. 알고 봤더니, 본인은 문제가 일어나는 파일들을

수정을 했지만, 이것을 Git의 index 상에 반영하기 위한 작업을 하지 않았던 것이 문제였다. ㅡ.ㅡ 굳이 Eclipse가 아니고 리눅스 환경에서도 동일한 작업이 필요한데, 바로 충돌 해결 후, git add 를 해주어야 index에 제대로 반영된다. 그제서야 Merge 든 

Rebase든 진행이 가능하다. Eclipse에서 Rebase 중 충돌이 일어나면 다음과 같은 다이얼로그가 뜬다. 


위의 Action to perform에서 보듯이 현재 문제가 되는 커밋만 제외하고 계속 Rebase를 진행하거나, Rebase를 취소할 수도 있다. 

충돌을 해결할려면 Merge때와 같이, Merge Tool을 이용하면 된다. (혹은 Do nothing을 선택하여 직접 문제가 되는 부분들을 찾아 수정할 수도 있다.) 

여기서 중요한 포인트는, 모든 수정이 끝났으면, 꼭 Git Add를 해준다는 것! Eclipse 상에서는 다음 절차를 따른다. 

  1. 위의 Start MergeTool to resolve conflicts을 선택하여 MergeTool을 통해 수정하거나, 충돌이 일어난 파일을 수동을 찾아 직접 수정하여 충돌 해결
  2. Project의 Team Menu->Add to Index 선택 
  3. Project의 Team Menu -> Rebase -> Continue Rebaes 선택 

이 방법을 몰라 어제 작업 중 2시간을 날려 먹고, 결국에는 충돌나는 파일을 백업해놓고 지운 다음, 다시 Merge하는 등 온갑 삽질을 다하였다. Merge 시에도 위의 2번만 알았다면 파일을 백업해놓는 추태는 벌이지도 않았을텐데. 아쉽다; 

  개인적으로는, Merge 시 발생하는 Merge 커밋이 보기가 싫어 Rebase를 더 선호하는 편이다. 물론 Merge 커밋을 안 보이게 할 수도 있지만, 따로 옵션을 주는 것이 번거롭기도 하고, 변경 이력 관리도 Rebase가 더 깔끔하게 느껴지는 것 같다. 

앞으로 프로젝트에 자주 참고해야겠다!     

Posted by 라판