2019년 4월 7일 일요일

Merge 와 Rebase 의 차이

https://backlog.com/git-tutorial/kr/intro/intro1_1.html 

에서 읽고 배운 글인데, 
급하게 실무에서 뛰던 당사에는 필요한 내용만이 급급한데, 
git 관련 검색하면 항상 top으로 나오면서도 크게 도움이 안되서 저 원숭이 마스코트에게 악감정이 있었습니다. 
어쨋든 지금은 잠깐의 휴식기도 생겼고, 같이 Git 기초 공부도 할겸 정독을 했고, 
상당히 도움이 되었지만, 여전히 초심자가 읽기는 힘들지 않을까? 하는 생각에 
나름대로 정리를 해서 올려봅니다.

Merge 와 Rebase 의 차이

기능적으로 merge와 rebase는 동일한 작업을 합니다. 
두 branch를 하나로 병합하는 기능을 작동합니다. 
하지만 몇가지 detail의 차이로 인해 두 기능이 나누어졌으며, 그 기능의 차이를 알아봅니다.

Merge

다른 branch 를 현재 banch에 합친다는점은 merge와 rebase 동일하나, 작동방식이 다릅니다.
전자인 merge의 경우의 합치는 방법은 기본적으로 fast-forward 방식으로 작동합니다.

이 방법은 HEAD master branch 에서 새 branch를 작업하여, marge 할 경우,
gir graph 상에서는, 하나의 master branch 변경 이력으로 변경처리가 되어 하나의 줄기만을 표시하게 됩니다.



(병합 대상 master 가 HEAD 인 경우의 병합 전)

(병합 후)

하지만 아래같은 상황에서는 이야기가 조금 달라지게 됩니다.
master branch 가 새 branch인 A branch가 merge 하려는 당시에 HEAD 가 아닌 상황입니다.


(병합할 master 가 HEAD가 아닌 경우)

이런 가지가 두개 가 된 경우에는, fast-forward 방식에 따라 A branch가 master에 합쳐진(merge)뒤, commit 되어야 합니다.


(merge 를 통해 아래와 같은 graph로 commint됩니다)



Rebase

위 이슈를 rebase 방법으로 봅니다.


( 위와 같이, 병합해야 할 master가 HEAD가 아닌경우 입니다 )


이번에는 rebase 병합을 하게 되면 아래와 같은 flow를 보이게 됩니다.


( rebase 방삭을 하는 경우 )

master branch의 위치는 변경되지 않으며, master branch에서 병합할 branch의 모든 commit 이력들을 차례로 commit 시킵니다.



( rebase 이후 상태, master의 위치는 병합 이전 상태에 머물러 있습니다 )

병합 대상의 branch는 graph 이력에서 사라지며, master graph로 흡수됩니다.
이때 master branch는 push 되지 않고 rebase 전 상태를 유지합니다.


( 다시한번 merge 하게되면 master가 HEAD를 보게 됩니다 )

이렇게 함으로써 최종 병합 작업이 끝이나게 됩니다.



결론적으로 merge와 rebase 의 차이는 ?

merge 의 경우는 병합할 branch들의 이력이 남아있게 되어, 디테일한 버전 관리가 가능하나, 더 복잡한 graph를 가지게 됩니다.
반면 rebase의 경우는 병합할 branch의 내역들을 master branch 하위로 변경처리를 하기떄문에, 결과적으로 보게 되는 graph는 단 하나의 줄기를 갖게 됩니다. 하지만 이는 merge의 graph와는 달리 명확하게 분석할 수 없게 될것 입니다.



훌륭한 Rebase 적용기

rebase를 사용할 수 있는 훌륭한 예를 하나 들어보겠습니다. 들어가기 앞서 이 또한 merge를 통해서 동일한 작업을 할 수 있습니다. 그러므로 merge를 사용하는가 / rebase를 사용하는거는 전적으로 팀의 결정에 따를것 같습니다.

B라는 이름의 master branch에서 추가 가능을 위해 O branch 를 만들어 작업을 하고있었습니다.

( O branch 는 develope branch로서 기능 추가 작업을 진행중 이었습니다 )

하지만 -항상 그렇듯- 서비스중인 B branch에서 중대한 문제점을 파악하게 되어 긴급 수정이 불가피해졌습니다.



(우리의 깃몽키는 B branch에서 헐레벌떡 X 브렌치를 따 버그픽싱을 합니다.)

X branch는 성공적으로 수정이 완료되어, B branch 에 merge 되어 퍼블리싱 됩니다.




다시 O branch 로 돌아와 기능추가작업을 계속 하려고 했으나, C branch의 커밋 내역이 O branch에서 또한 필요하다는 사실을 뒤늦게 파악했습니다.







( 이럴줄 알았다니깐! 그냥 O branch 작업하면서 X branch 작업 하면 될 정도로 작고 마이너 한건데, 일을 복잡하게 두번 만든단 말야.. )

이런 경우, 우리는 C branch 의 내역을 가져와야 합니다. merge 와 rebase 모두 가능하지만, rebase를 해 볼 수 있습니다.
O branch에서 C branch를 target으로 rebase를 합니다.








( Ta-Da! )

댓글 없음:

댓글 쓰기