2024. 4. 26. 09:52ㆍ카테고리 없음
1. merge 와 rebase
merge : 브랜치를 병합한다는 의미
rebase : 베이스를 재정의하여 커밋 히스토리를 조작한다는 의미
master에서 develop 브랜치가 파생되어서 각각의 브랜치에서 커밋이 진행되었다는 상황을 가정했을때
이상황에서 merge가 일어나면 merge 커밋이 하나 생성이되고, 두 브랜치가 병합이 된다는 것을 볼 수 있습니다.
동일한 상황을 가정했을때 브랜치가 파생된 커밋을 저희는 Base라고 부르는데 develop 브랜치에서 rebase가 발생하면,
master 브랜치에 있던 커밋들 중 최신 커밋이 develop 브랜치에 새로운 베이스로 재정의가 됩니다.
그리고 develop 브랜치에 쌓여있던 커밋들이 재정의된 base 위로 순차적으로 새로운 커밋이 쌓이게 됩니다.
두개를 다시 본다면 merge는 두개의 브랜치가 하나의 merge 커밋으로 병합된다는 모습을 보이는 반면
rebase는 마치 하나의 브랜치에서 모든 작업이 이뤄지는것처럼 보이게 됩니다.
merge와 rebase의 특징에 대해 알아보면 merge는 충돌이 일어날 경우 한번에 해결이 가능합니다.
merge를 하는 도중 충돌이 일어나면 머지 커밋을 날리기 이전에 모든 충돌을 다 한번에 해결하고
하나의 커밋으로 충돌을 해결할 수 있습니다.
merge는 어떤 브랜치에서 merge가 발생했는지 알 수 있습니다.
그림에 보이는 merge 커밋 메시지를 본다면, merge branch 'develop'이라고 적혀 있는데
이를 통해 우리는 develop branch가 merge가 되었다는 것을 볼 수 있습니다.
이제 merge를 하게 된다면 어떤 브랜치에서 병합이 되었음을 보이기 때문에
브랜치와 커밋이 많아지게 된다면 git history 가 복잡해져 알아보기 힘들 수가 있습니다.
그림을 보시면 각 선이 브랜치를 의미하고,
오른쪽에 커밋 메시지를 의미하는데 커밋 메시지를 보면 merge가 엄청 많이 일어났음을 볼 수 있습니다.
브랜치가 너무 많다보니까 어떤 브랜치에서 어떤 브랜치로 머지가 일어났고,
어떤 커밋이 어떤 브랜치에 속해 있는지 한눈에 알아보기 쉽지가 않음을 볼 수 있습니다.
그리고 다음으로는 rebase의 특징으로 본다면,
rebase는 머지와 달리 충돌이 일어난 부분부터 하나하나씩 모든 충돌을 해결해야 합니다.
재정의된 base 이후부터 충돌이 일어나게 된다면 하나씩 충돌을 해결하고 또 충돌이 일어나면
그 다음 충돌을 해결하고 커밋을 알려야 하기 때문에 한번에 충돌을 해결하지 못하고,
충돌이 일어날때마다 충돌을 해결해 주어야 합니다.
그리고 리베이스는 하나의 브랜치로 깃 커밋 히스토리 정리가 가능합니다.
그림에서처럼 리베이스가 되면 마치 브랜치가 하나인것 처럼 깃 히스토리가 정리가 됩니다.
그리고 리베이스는 리베이스가 이루어진 브랜치의 커밋이 새로 생성이 됩니다.
그래서 rebase 전과 후의 히스토리를 보면 같은 커밋이어도 다른 해시 값을 가지고 있음을 확인할 수 있습니다.