[Github] Rebase


Rebase란 무엇인가?

Merge vs Rebase

브랜치들은 하나의 기준점에서 파생된 작업 공간이다.
하지만 만약 내가 현재 작업중인 브랜치의 파생 기준점인 main브랜치에 새로운 커밋이 생겨 업데이트 됐다면?

이런 경우 A브랜치의 파생 기준점은 아래의 그림에서 main브랜치였다. 즉 내가 A브랜치를 파생시킬 때 까지만 하더라도 main브랜치가 최신화된 기준 브랜치였던 것이다. 하지만 해당 main 브랜치에 새로운 new라는 커밋이 생겨 최신화되었기에… A브랜치와 main브랜치의 fast-forward merge가 불가능해졌다.

이유는 간단하다. 아래의 main브랜치A브랜치가 병합되면 new라는 새로운 커밋은 유실된다…. 따라서 모든 변경사항을 담아 merge하기 위해선 대책이 필요하다.

main에 new라는 새로운 커밋 발생

이 때문에 rebase가 필요한 것이다. 아래를 보면 쉽게 이해가 갈 수도 있는데, 말 그대로 base(기준점)를 변경(re)한다는 것이다. 이렇게 rebase를 하면 A브랜치의 파생 기준점은 main→new가 된다.

rebase 한 후의 모습

이에 따라 main과 A브랜치를 merge 하면 아래와 같이 모든 변경사항이 담긴 merge가 이루어질 수 있게 된다.

merge 후의 모습


‼️ 주의사항 ‼️

rebase는 위의 예시에서 A브랜치를 새롭게 커밋하여 완전히 새로운 커밋으로 만드는 것이다.

따라서 겉으로 보기엔 A브랜치(커밋)가 똑같이 복사된 것처럼 보이지만, history의 해시코드가 변경된다.

이러한 이유 때문에… 혼자 해당 브랜치 위에서 작업을 하고 있는 경우라면 상관이 없지만, 다른 개발자와 함께 같은 브랜치에서 작업을 하고 있을 경우에는 ‼️ 절대 rebase를 사용해선 안된다‼️ . (merge conflict이 발생할 수 있음)

⇒ 따라서 local작업 환경에서의 commit에 한해서만 활용하는 것이 좋다. (또는 혼자서 특정 브랜치 개발을 하고있을 때!)


rebase 방법

  1. 옮기고자 하는 브랜치로 이동한다.

    $ git checkout feature-b

  2. $ git rebase master 를 통해 최신 브랜치인 master로 rebase한다

  3. 다시 master 브랜치로 checkout 하고 → merge한다 ($ git merge feature-b)

  4. 머지된 이전 브랜치들을 삭제한다.


cherry pick 🍒

특정한 커밋만 콕 찝어서 최상단 브랜치에 merge하고싶을 때 사용하는 굉장히 유용한 기능이다.

  1. $ git hist 또는 $ git log를 통해 원하는 커밋의 해시코드를 복사한다.

  2. $ git cherry-pick [해시코드]

    이러면 [해시코드] 커밋이 master 또는 main과 같은 최상단 브랜치에 merge된다.


Author

Hoonjoo

Posted on

2022-01-31

Updated on

2022-02-07

Licensed under

Comments