[번역] merge vs rebase vs squash

eunbinn·2024년 2월 15일
32

FrontEnd 번역

목록 보기
28/31
post-thumbnail

출처: https://gist.github.com/mitchellh/319019b1b8aac9110fcfb1862e0c97fb

커밋 병합(merge commits) vs 리베이스(rebasing) vs 스쿼시(squashing)에 대한 제 의견을 묻는 질문을 심심찮게 받았습니다. 이 답변은 이미 여러 번 작성했기 때문에, 다시 질문이 올 때마다 참조할 수 있도록 요점만 정리해 두었습니다.

저는 병합, 스쿼시, 리베이스를 상황에 따라 사용합니다. 모두 각각의 장점이 있고 상황에 따라 어떤 것을 사용하는 것이 좋은지 달라진다고 생각합니다. 특정 전략이 항상 100% 정답이라고 말하는 사람은 틀렸다고 생각하지만, 세 전략 모두 각자가 자유롭게 판단할 수 있다고 생각합니다. 아래 내용은 저의 실무 경험을 바탕으로 한 개인적인 의견입니다.

저는 병합과 병합 커밋을 생성하는 것이 있는 그대로의 이력을 가장 잘 보여준다고 생각하기 때문에 선호합니다. 병합 지점을 확인할 수 있고, 개발자가 어떻게 개발을 했는지 모든 개발중인(Work In Progress, WIP) 커밋을 확인할 수 있습니다. 모든 병합을 쉽게(git revert -mN) 되돌릴 수 있습니다. 저는 PR 10건 중 9건 이상은 병합 커밋을 생성합니다.

또한 모든 커밋이 정상적으로 빌드된다는 가정하에, 커밋이 많을수록 git bisect를 활용하기 더 좋아진다고 생각합니다. 프로젝트를 탐색(bisect)한 끝에 나온 결과가 +2000/-500의 diff를 갖는 하나의 PR로부터 스쿼시된 하나의 커밋일 때는 정말 정말 정말 싫습니다. 그건.. 아무런 도움이 되지 않습니다. 제가 생각한 git bisect를 실행하고 마주하는 최악의 결과는 +500/-500인 커밋입니다. 말그대로 최악의 경우를 말씀드린 겁니다. 이상적으로는 +50/-50 정도의 커밋에 도달하는 것이 좋습니다. 그러면 "아하, 여기에 버그가 있구나" 하고 바로 알 수 있죠. 스쿼시는 이 정보를 파괴합니다. 매일 하나씩 스쿼시 하기보다 저는 차라리 매일 1000개의 +50/-50 커밋을 머지하겠습니다.

이 전략은 개발자가 모든 커밋이 빌드 가능하도록 만드는 좋은 습관에 달려있습니다. 저는 99%의 경우 이 규칙을 따릅니다(가끔 실수를 하긴 하지만 실수하지 않으려고 정말 열심히 노력합니다). OSS에서는 이를 제어할 수 없기 때문에 가끔은 제가 커밋을 수정해야 할 때가 있습니다(병합 커밋을 하기 전 대화형 리베이스(interactive rebase)를 사용합니다). 제가 리더로 일하던 환경에서는 일반적으로 저와 함께 일하는 엔지니어라면 모든 커밋을 빌드 가능한 상태로 유지하기를 기대했습니다.

PR에 수많은 작은 "WIP" "WIP" "WIP" 커밋이 있지만 총 diff가 작고 모두가 하나의 목표를 향하는 경우에는 스쿼시(squash)를 사용합니다. 이것이 제가 스쿼시를 사용하는 경우입니다. 저는 스쿼시를 하며 커밋 메세지를 다시 작성할 때 메세지에 충분히 설명이 담기도록 주의합니다. Git과 GitHub에서 자동으로 생성되는 기본 스쿼시 커밋 메세지는 좋지 않습니다 (스쿼시된 모든 커밋의 메세지를 단지 연결하기만 하고, 대개는 연속적인 "WIP"입니다).

만약 diff가 크고, "WIP"가 많은 경우, 저는 (대화형으로) 리베이스하고 선택적으로 스쿼시하며 커밋들의 순서를 변경합니다. 저는 개발자들이 이렇게 작업을 수행하고 깔끔한 커밋에 신경쓰길 바라지만, 안타깝게도 많은 개발자들은 Git에 익숙하지 않습니다. OSS 세계에서는 제가 대신 이를 수행합니다. 예전에 엔지니어링 매니저로 일할 때에는 함께 일하는 엔지니어가 이런 지식을 갖추고 있기를 기대했죠.

마지막으로, 저는 대규모 대화형(interactive) 리베이스를 수행할 때에는 Git GUI 클라이언트를 사용하는 편입니다. 저는 Git CLI에 매우 익숙하지만, 변경된 줄이 많은 대규모 PR(약 50개 이상의 커밋)을 대화형으로 리베이스할 때는 GUI를 사용하는 것이 유용하다고 생각합니다. 저는 macOS를 사용하기 때문에 Tower를 사용합니다. 하지만 이 때만이 제가 GUI를 사용하는 유일한 상황입니다.

1개의 댓글

comment-user-thumbnail
2024년 4월 15일

I learned a lot from your blog. If you want to have more fun, you can learn more about old video games. It's going to be fun to play with you again! wheel spinner

답글 달기