GitNotes.12-7.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 12.7: 코드 리뷰를 위한 rebase 수행하기

요약

이 섹션에서는 좀 더 쉬운 코드 리뷰를 위하여 여러 커밋에 나뉘어 적용된 특정 목적의 변경 사항들을 의미있는 단일 커밋들로 재구성하는 방법에 대하여 설명한다. 만약 여러 계층에 걸친 수정사항들이 다수의 파일들에 하나의 커밋으로 뭉쳐져 있다면, 이 역시 코드 리뷰를 수행하기 어려울 것이다. 만약 시간상의 순서에 따라서만 작성된 커밋들을 주제별로 재구성 할 수 있다면, 코드 리뷰를 더욱 손쉽게 할 수 있을 것이다 (또한 이로 인해 코드 리뷰에서 발견되지 못하는 버그들도 최소화할 수 있을 것이다.

여기에서 소개하고있는 간략화된 예제는 git 을 통해 더 좋은 코드 리뷰를 할 수 있게 만드는 유일한 전략은 아니다. 이 방법은 저자가 사용하는 방법일 뿐이며, 독자로 하여금 더 나은 코드 리뷰를 할 수 있게하는 방법과 더 쉽고 훌륭한 git history 를 유지하기 위한 방법에 대해 더 고민할 수 있는 매개체로 사용하고자 한다.

또한 이 예제는 일반적인 rebase 작업에 대한 학습을 위해 실 사용 방법을 설명한다.

이 예제는 독자가 대화형 rebase 에 대한 기본적인 지식은 가지고 있다고 가정한다.

가정:

  • 사용자는 현재 master 브랜치에서 갈라져 나온 feature 브랜치에서 작업중이다
  • 작업중인 feature 는 크게 세가지 주요 계층을 가지고 있다: front-end, back-end, DB
  • 해당 feature 브랜치에서 작업하는 동안 다수의 커밋을 작성한 상태이며, 매 커밋은 여러 레이어에 걸친 변경사항을 가지고 있다
  • (최종적으로) 아래와 같은 세개의 커밋만을 브랜치에 남기기를 원한다
    • front end 상의 모든 변경사항을 가지고 있는 커밋 하나
    • back end 상의 모든 변경사항을 가지고 있는 커밋 하나
    • DB 상의 모든 변경사항을 가지고 있는 커밋 하나

전략:

  • 시간 순서에 따른 커밋들을 "주제별" 커밋으로 변경한다.
  • 우선적으로, 모든 커밋들을 복수개의 더 작은 커밋들로 나눈다 -- 매 커밋이 하나의 주제에 대한 변경사항만을 가지고 있도록 한다 (이 예제에서, 주제위 단위는 각각 front end, back end, DB 변경사항이 된다)
  • 이후 커밋들을 주제별로 재정렬한 후 각 단위별로 정렬된 커밋들을 'squash' 로 묶어 주제별 단일 커밋을 생성한다

예제:

$ git log --oneline master.. 975430b db adding works: db.sql logic.rb 3702650 trying to allow adding todo items: page.html logic.rb 43b075a first draft: page.html and db.sql $ git rebase -i master

위 명령어 실행 시, 텍스트 편집기가 열리며 아래와 같은 내용이 나타나게 된다:

pick 43b075a first draft: page.html and db.sql pick 3702650 trying to allow adding todo items: page.html logic.rb pick 975430b db adding works: db.sql logic.rb

위 내용을 아래와 같이 변경한다 ('pick' -> 'e'):

e 43b075a first draft: page.html and db.sql e 3702650 trying to allow adding todo items: page.html logic.rb e 975430b db adding works: db.sql logic.rb

저장 후 편집기를 종료하고 나면, git 이 한번에 하나의 커밋을 적용할 것이다. 매 커밋 적용시마다 명령어 프롬프트가 나타날 것이며, 해당 프롬프트에서 다음에 설명할 작업들을 수행할 수 있다:

Stopped at 43b075a92a952faf999e76c4e4d7fa0f44576579... first draft: page.html and db.sql

위와같은 프롬프트 상태에서, 커밋을 amend 시킬 수 있다

git commit --amend

해당 커밋에 대해 원하는 변경사항을 모두 적용한 이후에는, 아래와 같이 수행한다

git rebase --continue
$ git status rebase in progress; onto 4975ae9 You are currently editing a commit while rebasing branch 'feature' on '4975ae9'. (use "git commit --amend" to amend the current commit) (use "git rebase --continue" once you are satisfied with your changes) nothing to commit, working directory clean $ git reset HEAD^ # 이 명령어는 해당 작업 커밋 내의 모든 변경사항들을 'uncommit' 시킨다 (unstage 된 변경사항으로 만든다). $ git status -s M db.sql M page.html $ git add db.sql # 이제 좀 더 작은 주제별 커밋들을 추가 생성할 것이다 $ git commit -m "first draft: db.sql" $ git add page.htm $ git commit -m "first draft: page.html" $ git rebase --continue

위와 같은 작업을 매 커밋마다 수행한다. 최종적으로, 아래와 같은 커밋들이 생성되었을 것이다:

$ git log --oneline 0309336 db adding works: logic.rb 06f81c9 db adding works: db.sql 3264de2 adding todo items: page.html 675a02b adding todo items: logic.rb 272c674 first draft: page.html 08c275d first draft: db.sql

이제 rebase 를 한번 더 실행하여 커밋들 재배열 및 합치기(squash) 를 수행한다:

$ git rebase -i master

아래 내용이 텍스트 편집기에 나타날 것이다:

pick 08c275d first draft: db.sql pick 272c674 first draft: page.html pick 675a02b adding todo items: logic.rb pick 3264de2 adding todo items: page.html pick 06f81c9 db adding works: db.sql pick 0309336 db adding works: logic.rb

위 내용을 아래와 같이 수정한다:

pick 08c275d first draft: db.sql s 06f81c9 db adding works: db.sql pick 675a02b adding todo items: logic.rb s 0309336 db adding works: logic.rb pick 272c674 first draft: page.html s 3264de2 adding todo items: page.html

주의: git rebase 수행시 작은 주제별 커밋들을 작성된 순서에 맞추어 적용 및 합칠 수 있도록 유의하라. 그렇지 않으면, 불필요한 merge conflict 들을 해결해야 하는 상황에 처할 수 있다.

이제 모든 대화형 rebase 작업이 완표되었다면, 최종 결과는 아래와 같을 것이다:

$ git log --oneline master.. 74bdd5f adding todos: GUI layer e8d8f7e adding todos: business logic layer 121c578 adding todos: DB layer

정리

위 예제에서는 시간상의 순서대로 작성된 커밋들을 주제별로 묶어 rebase 하였다. 실제 개발시에, 이러한 작업을 매번 할 필요는 없으나, 이러한 작업이 필요하거나 바람직할 때에는 이제 문제없이 수행할 수 있게 되었을 것이다. 또한, 이 예제로 인해 git rebase 에 대해서도 더 잘 알게 되었을 것으로 기대한다.

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형

+ Recent posts