회사에서 처음으로 PR 요청을 하고나서 리뷰 폭탄(....)을 열심히 고친 후 dev 브랜치에 합치게 되었다.
팀원분이 rebase 후에 merge를 하면 된다고 하신다.
근데 PR 버튼에 보니까 Rebase and Merge라는 메뉴가 보인다.

이걸 쓰라는건가....? 라는 생각이 들었지만 일단 조사해보기로 했다.
취업 전 그룹 프로젝트를 할 때는 PR 후 바로 merge를 진행했었는데, rebase는 들어만 봤지 정확히 어떻게 하는지 까지는 알 지 못하는 상태였다.
이왕 이렇게 된거 merge와 rebase에 대해 간략하게 정리하고 내가 처한 오류에 대해 알아보고자 한다.
Merge and Rebase 개념
작업한 branch를 dev나 main branch에 합칠 때 자주 사용되는 두가지 개념이다.
둘의 가장 큰 차이는 branch flow(용어가 맞는지 모르겠다.)를 관리하는 과정에서 차이가 생긴다.
merge 같은 경우 PR을 통해 branch를 합칠 때 branch가 갈라져 있는 그대로 합쳐진다. 처음에는 잘 몰랐었는데, 시각적으로 branch를 표현하는 extension이나 프로그램을 사용하게 되면 여러가닥으로 갈라져 있는 branch 상태를 볼 수 있다.


merge를 여러번 하다 보면 위의 오른쪽 사진처럼 여러 branch가 겹쳐져서 나중에 이전 commit에 문제가 생기는 경우 추적하기가 힘들어진다고 한다.
반면 rebase의 경우에는 branch가 하나로 합쳐진다.



rebase 이후에 merge를 하게 되면 마치 하나의 branch에서 작업한 것 처럼 branch를 관리할 수 있다. 이렇게되면 나중에 이전 commit에서 문제가 발생한 경우 쉽게 추적할 수 있어서 git을 관리하는데 좀 더 수월하게 할 수 있다!

rebase가 뭔지 알았고, 왜쓰는지도 알았으니 이제 하기만 하면 된다. 나는 위의 저 버튼을 클릭해서 rebase 후 merge를 진행했고, 별 문제없이 넘어가는 것 같았다.
문제 발생
PR한 branch가 합쳐지고, 내 local dev에 remote dev를 pull 해서 최신화 한 후, 새로운 branch를 만들어서 다른 작업을 하고 commit을 올렸다. 그런데 여기서 문제가 발생했다.
이전에 rebase후 merge 한 commit들이 PR에 딸려들어와서 같이 request가 되는 것이었다!
PR을 지웠다가 다시 올렸다가, 브랜치를 지우고 다시올리고 그래도 안되서 브랜치를 새로 만들어서 커밋을 복붙해서 다시 올렸는데도 똑같은 현상을 발견했다.
한참동안 끙끙대면서 구글링 해보고 이거저거 해보면서 결국 어떤게 문제였는지 알게되었다.
원인파악
결론적으로 문제는 local dev가 이상한 형태로 만들어진 것이었다.
Rebase에서 대해서 알아보면서 이것저것 해보다가 local dev에 commit들을 한 번 rebase를 진행했었는데, 이후에 이것과는 별개로 Github 에서 직접 Rebase and Merge 버튼을 사용하여 다시 rebase를 진행했다.
그런데 rebase같은 경우 commit을 직접 합치는것이 아니라 새로운 commit id를 복제해서 합치기 때문에 local dev에서 rebase한 commit과 remote에서 rebase한 commit이 생긴것은 똑같지만 id가 다른 commit으로 합쳐지게 되었다.

결국 내 입장에서는 똑같아 보이지만 위의 그림처럼 local dev와 remote dev가 약같 다른 commit history를 가지게 되었는데, 이 상태에서 local dev를 최신화 하기위해 git fetch, git pull을 진행하니

위와 같은 형태로 local dev가 최신화되게 되었고, 이상태에서 새로운 branch를 만들어서 코드를 작성하고 새로운 PR을 올리니 remote dev 입장에선는 자신에게 없는 모든 commit을 받아야 하기 때문에 이전에 내가했던 commit history인 A', B', C' commit 까지 딸려들어오는 상태가 된 것이었다!
문제 해결
원인을 파악하고 나니 문제해결은 쉽게 되었다.
내 local dev에 remote에는 없는, 이미 merge가 된 commit들이 id 만 다른 것이기 때문에 내 local dev를 지우고 remote dev로 강제로 최신화 시킨 후 branch를 만들어서 commit을 하고, 다시 PR을 올리니 문제가 해결이 되었다.
Rebase를 잘못하여 생긴 문제라고 생각을 하고 다음부터는 local에서 rebase를 하고 PR을 올려야겠다는 생각을 했었는데,
조금 더 생각해보니 그냥 위의 flow들을 잘 이해하고 있으면 remote에서 바로 rebase를 해도 local dev 관리만 잘 하면 되겠다는 생각이 들었다.
중요한 건 rebase를 잘 이해하고 여러 방법으로 rebase를 할 때 그에 맞는 후속처리를 잘 해주면 되는 것 같다.
'내맘대로 개념정리' 카테고리의 다른 글
Javascript Class로 배열 만들어보기 (0) | 2023.10.13 |
---|---|
객체지향 프로그래밍과 함수형 프로그래밍 (0) | 2023.01.13 |
XML 과 JSON (1) | 2023.01.03 |
콜백 함수(Callback Function) (0) | 2022.12.31 |
계산기 CSS 정리 (0) | 2022.12.29 |
댓글