본 문서는 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)
'번역 > Git Notes for Professionals' 카테고리의 다른 글
12.9: git-pull 로 하여금 자동으로 merge 대신 rebase 를 수행하도록 설정하기 (0) | 2019.11.11 |
---|---|
12.8: 대화형 (interactive) rebase 작업 취소하기 (0) | 2019.11.11 |
12.6: rebase 작업 시 모든 커밋들에 대해 테스트를 수행하기 (0) | 2019.11.07 |
12.5: rebase 시 자동 stash 설정하기 (0) | 2019.11.07 |
12.4: 최초 (initial) 커밋으로부터 rebase 하기 (0) | 2019.11.06 |