본문 바로가기
Coding

Git rebase 사용하는 방법

by Hide­ 2019. 3. 18.
반응형

특정한 커밋만을 가져오는 Cherry pick에 대해 찾아보다가 rebase부터 잡고가야할 것 같아서 생활코딩에 나와있는 rebase 강의를 봤다. 한번에 익숙해질 수 없으므로 보다 능숙해지기 위해 해당 강의를 포스팅으로 남긴다.

머지(Merge)와 리베이스(Rebase)의 차이점은 아래와 같다.


Merge : 히스토리가 병렬로 표시

Rebase : 히스토리가 일렬로 표시


Rebase를 사용하면 추후에 버전 관리 히스토리를 봤을 때 Merge를 사용했을때보다 좀 더 직관적으로 볼 수 있다는 장점이 있다. 먼저 rb_example이라는 폴더를 하나 생성하고 git init을 진행해준다. 다음으로 f1.txt라는 파일을 생성하고 A라고 내용을 채워넣는다.


이 상태에서 git log --decorate --all --oneline --graph를 통해 로그를 살펴보면 아래와 같다.


* 585d45a (HEAD -> master) 1


다음으로 rb라는 브랜치를 하나 생성하고 re.txt파일을 생성한다음 커밋한다.


이 상태에서 깃 로그를 살펴보면 아래와 같다.


* 28e8064 (HEAD -> rb) R1

* 585d45a (master) 1


여기서 re.txt파일을 한번 수정하고 R2로 커밋을 한다.


깃 로그는 아래와 같다.


* ef328e4 (HEAD -> rb) R2

* 28e8064 R1

* 585d45a (master) 1


이제 다시 master로 이동하여 master.txt라는 파일을 하나 생성하고 커밋한다.


깃 로그는 아래와 같다.


rb 브랜치와 master를 병합하지 않았기 때문에 master는 그대로 뻗어나가고 마찬가지로 rb 브랜치 또한 따로 뻗어나가고 있는 형태이다. master 브랜치에서 master.txt파일을 수정하고 M2라고 한번 더 커밋한 이후 깃 로그를 살펴보면 아래와 같다.


이제 rebase를 시도해보자. 먼저 rb 브랜치로 checkout한 이후 git rebase master를 입력한다. 그다음 로그를 보면 아래와 같다.


* 7955b59 (HEAD -> rb) R2

* f9f4ac9 R1

* 2bb9989 (master) M2

* f0d7ed9 M1

* 585d45a 1


옆으로 뻗어나가던 rb브랜치가 이제 다시 일렬로 진행됨을 볼 수 있다. 참고해서 볼 점은, 우리가 가장 마지막에 master에서 커밋했던 2개의 커밋(f0d7ed9, 2bb9989) 이다음으로 rb 브랜치의 커밋 2개가 붙어있다는 점이다. 또한 rebase를 하기 전 rb의 커밋 아이디가 rebase한 이후의 커밋 아이디와 다른데, 이는 rebase시 임시 저장소에 커밋을 저장해두고 합치는 과정에서 새로운 커밋으로 등록하기 때문이라고 한다.

위와 같은 상태에서 이제 master 브랜치도 최신 커밋을 바라보도록 설정하자. master로 checkout하고 git merge rb를 통해 rb브랜치와 머지한 이후 로그를 보면 아래와 같다.


* 7955b59 (HEAD -> master, rb) R2

* f9f4ac9 R1

* 2bb9989 M2

* f0d7ed9 M1

* 585d45a 1


참고 : https://opentutorials.org/course/2708/15553