grep

Engineering

GitHub의 Merge, Squash and Merge, Rebase and Merge 정확히 이해하기

NHN

2017년 8월 10일

원문에서 보기 ↗

Git-Logo-2Color.png

GitHub의 새 버전에서 merge, squash and merge, rebase and merge 세 종류의 merge를 모두 지원하기 시작했습니다. 각 머지 방식에 따라 커밋 히스토리가 천차만별로 달라지는데요, 어떤 경우에 어떤 머지를 사용하는 것이 좋은지 공유하고자 각 머지에 대해 설명해 드리려고 합니다.

Screen Shot 2017-05-29 at 10.59.17 AM.png

그래프로

각 머지를 그래프로 표현하면 아래와 같습니다.

Screen Shot 2017-05-29 at 12.15.48 PM.png

Screen Shot 2017-05-29 at 12.15.51 PM.png

Screen Shot 2017-05-29 at 12.15.55 PM.png

메인 브렌치의 관점에서

메인 브렌치의 커밋을 통해 머지된 커밋들이 어떤 형상을 가진지 비교해보면 아래와 같습니다.

Screen Shot 2017-05-29 at 11.51.45 AM.png

Screen Shot 2017-05-29 at 11.51.54 AM.png

Screen Shot 2017-05-29 at 11.52.08 AM.png

사용 예시

Git Flow 를 따른다고 했을 때, 아래와 같이 정리할 수 있습니다.

보너스

두 브렌치간 Rebase는 위와 같은 관점으로 사용할 수 있지만, cli의 interactive rebase (ex, git rebase -i HEAD~5)를 사용하면 단일 브렌치 내에서 rebase를 사용하여 커밋 히스토리를 정리할 수 있습니다.

예를 들어, 아래와 같이 cli에서 작업 대상 브렌치에서 git rebase -i HEAD~5를 입력하고, 아래처럼 reword, squash를 적절히 사용하면,

Screen Shot 2017-05-29 at 12.34.53 PM.png

그래프로 표현하면 아래와 같습니다.

Screen Shot 2017-05-29 at 12.31.06 PM.png

기존의 커밋 히스토리인 아래 히스토리가

Screen Shot 2017-05-29 at 12.35.41 PM.png

아래처럼 변경됩니다. (reword, squash 모두 커밋 메시지를 임의로 변경할 수 있습니다. 자세히 적진 않았지만, 아래 reword, squash 작업 후의 커밋 메시지들은 모두 제가 임의로 작성한 것입니다.)

Screen Shot 2017-05-29 at 12.35.49 PM.png

즉, rebase를 다른 브렌치 간의 머지하는 용도 이외에도, 단일 브렌치를 정리하는데에도 사용할 수 있습니다.