Rebase

브랜치 간 병합하는 방법으로 merge 와 rebase 가 있다.
이번 포스팅에서는 rebase 가 어떤 원리로 수행되는지 정리한다.

동작 순서

  1. 첫 번째 브랜치에서 c1, c2, c3 커밋을 한다.
  2. 그리고, 두 번째 브랜치로 checkout 을 한뒤에 c4, c5 커밋을 한다.
  3. 그리고, 다시 첫 번째 브랜치로 checkout 을 하여 c6 커밋을 한다. 이 때, conflict 가 발생하도록 공통 부분을 수정하자.

여기까지의 상황을 그림으로 표현하면 다음과 같다.

이 상황에서, 두 번째 브랜치를 첫 번째 브랜치로 ‘re’base 시도하면 어떤 일이 발생할까 ?
conflict 가 발생한다. 위의 3번에서 공통 부분을 수정하였기 때문이다. 그래서, 개발자가 직접 conflict 발생 부분을 수정해줘야 병합을 계속 진행할 수 있다. 이것이 핵심이다. rebase 는 순차적으로 병합을 시도한다. 다음과 같이, c4 를 c6 까지의 결과에 병합을 시도하고, 이 병합된 결과에 c5 를 병합 시도한다.

예제

위와 같은 상황을 실제로 재현하여 직접 rebase 테스트를 해보자. 브랜치는 다음 두 개로 한다 : master, jko

  1. master 에서 test.txt 파일을 생성하고, “commit 1 by master” 내용을 기입하고 commit 한다.

  2. “commit 2 by master” 내용을 기입하고 commit 한다.

  3. “commit 3 by master” 내용을 기입하고 commit 한다. 지금까지의 상황을 확인해보자.

  4. 이제 jko 브랜치로 checkout 한다. head 는 jko 를 가리키고 있다.

  5. “commit 4 by jko” 내용을 기입하고 commit 한다.

  6. “commit 5 by jko” 내용을 기입하고 commit 한다. 지금까지의 상황을 확인해보자.

  7. 이제 conflict 를 발생시킬 것이다. master branch 로 checkout 를 하자. 파일에는 jko branch 에서 추가한 두 커밋 내용이 당연히 없다.

  8. “commit 3 by master” 을 ‘’will be conflict” 로 변경하고 커밋하자.

  9. master 와 jko 브랜치의 test.txt 파일 내용은 각각 다음과 같다.

  10. 이제 jko 브랜치로 checkout 하자. master 로 rebase 해보자. 다음과 같이 conflict 를 해결하고 rebase continue 를 진행하라고 나온다. 여기가 핵심이다.

  11. test.txt 파일을 열어보자. conflict 지점이 master 에서 ‘“will be conflict” 로 수정한 지점이다. 그런데 왜, jko branch 에서 커밋한 “commit 5 by jko” 내용이 없을까 ? 앞서 강조하였듯이, rebase 는 순차적으로 진행하기 때문이다. “commit 4 by jko” 까지의 내용을 master 브랜치로 병합하고 있기 때문에, 현재 conflict 가 발생한 파일에는 “commit 5 by jko” 내용이 없는것이다.
    이제, 빨간 박스 부분을 지우고, rebase 를 계속 진행하자.

![](/image/git-rebase-10.png)

![](/image/git-rebase-11.png)
  1. 최종 병합된 결과의 log history 와 최종 결과 파일은 다음과 같다.

Comments