본문 바로가기

git/github

[Git] rebase

이런 명령어가 있는줄도 몰랐었고.. (ㅋㅋ --;)

지금도 좀 어려운 rebase입니다. progit에서 보면 merge를 하긴하는데.. 일반적인 merge와는 다르게 작동을 합니다. 

보통 rebase는 리모트 브랜치에 깔끔하게 적용하고 싶을때 사용한다고하네요..

실제로 rebase 후에 커밋 히스토리를 보면 갈라졌던 브랜치의 커밋 히스토리가 선형으로 변경되는 것을 보실 수 있습니다.


progit에서 나오는 케이스 중 첫번째 rebase 설명에 대한 예제만.. 소스트리를 통해 확인해보았습니다.


우선, 마스터 브랜치와 br1 브랜치가 나누어져 커밋이 되어있는 형태입니다.

이 상태에서 merge를 하면 3-way merge가 발생합니다. 



- 3-way merge가 된 후의 커밋히스토리입니다. 새로운 커밋이 생긴것이 확인가능하고, b1 브랜치의 커밋 히스토리도 그대로 남아있습니다.


하지만 rebase를 하게되면 최종 커밋이 가지고있는 결과는 같으나, 커밋 히스토리는 사뭇다릅니다.

일단, br1 브랜치에서  rebase 명령어를 실행합니다.


git checkout br1

git rebase master


위 명령어는 br1 브랜치의 마지막 커밋을 패치로 만들어서, 이를 C3에 적용합니다.


- rebase전


- rebase 후..


보시면 C2가 C3 이후로 변경된것이 확인 가능합니다. 이 C2에는 C3의 내용도 당연히 포함이 되어있습니다.

그리고 처음 rebase를 위와 같이 하고나면 실제 master는 여전히 C3를 가리키고 있습니다. br1이 C2를 가르키고 있고요.. 책에서는 "rebase후 master 브랜치를 fast-forward 시킨다" 라고 되어있는데...

저 같은 경우는 그냥 merge 명령어로 master 브랜치의 포인터를 C2로 옮겼습니다.


이제 br1 브랜치를 삭제하면 되겠죠..




역시 뭐든 개념을 알고 덤벼야하는것 같습니다.. --;