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

Section 12.3: 대화형(interactive) rebase

이 예제에서는 git rebase 의 대화형 모드를 어떻게 활용할 수 있는지를 소개한다. 설명에 앞서 git rebase 가 무엇이고 어떤 일을 하는지에 대한 기본적인 이해가 필요함을 주지하라.

대화형 rebase 아래 명령어를 통해서 시작할 수 있다:

git rebase -i

-i 옵션은 대화형(interactive) 모드를 나타낸다. 이러한 대화형 rebase 를 이용하면, 사용자는 커밋 메시지를 변경하거나 커밋들의 순서를 재조정할 수 있을 뿐만 아니라, 커밋을 분할하고 여러 커밋을 하나의 커밋으로 합칠 수도 있다.

만약 가장 최근 세개의 커밋을 재배열하고자 한다고 하면, 우선 아래와 같은 명령어를 입력한다:

git rebase -i HEAD~3

위 명령어를 입력하고 나면, 텍스트 파일 편집기가 열리면서 커밋들을 어떻게 rebase 시킬지를 선택할 수 있게 된다.

이 예제의 목표를 달성하기 위해서는, 각 커밋들의 순서를 변경한 후 파일을 저장하고 편집기를 종료한다. 이후 편집기에서 입력한 순서대로 rebase 가 수행될 것이다. git log 를 통해 보면 원하는 대로 커밋들의 순서가 바뀌어 있음을 확인할 수 있을 것이다.

커밋 메시지들을 재작성하기

또한, 이전 커밋들의 메시지가 불분명하여 해당 메시지를 좀 더 명확하게 기술할 필요가 있을 때도 있을 것이다. 최근 세개의 커밋들을 동일한 명령어를 이용하여 살펴보도록 한다.

git rebase -i HEAD~3

이번에는 rebase 할 커밋들의 순서를 재배열하는 대신에, 커밋 메시지를 변경하고자 하는 커밋에 표시된 'pick' 이라고 되어 있는 (이것이 기본값이다) 부분을 'reword' 로 변경한다.

이제 편집기를 종료하고 나면, rebase 작업이 진행되고 커밋 메시지를 변경하고자 했던 커밋의 순서가 되었을 때 멈추게 될 것이다. 이제 사용자는 커밋 메시지를 원하는 대로 변경할 수가 있게 된다. 커밋 메시지 변경이 끝났으면, 편집기를 종료하여 나머지 rebase 작업을 재개하면 된다.

커밋의 내용 변경하기

커밋 메시지를 변경하는 것에서 나아가, 커밋에 포함된 변경 내역 자체를 수정할 수도 있다. 이를 위해서는 특정 커밋의 'pick' 부분을 이번에는 'edit' 으로 변경한다. rebase 시작 이후 해당 커밋의 순서가 되었을 때, rebase 작업이 잠시 멈추게 된다. 이제 사용자는 이 커밋에 대해 새로운 변경사항을 추가하는 등의 수정을 할 수 있다.

영역에 커밋에 포함되어야 할 모든 변경사항들이 추가되었다면, 이제 실제 커밋을 수행한다. 기본적으로는 이전 커밋 메시지가 나타날 것이지만 새로운 커밋 내용에 맞추어 메시지 내용 역시 변경할 수 있다.

하나의 커밋을 여러개의 커밋으로 분리하기

새로운 커밋을 생성하고 난 이후에, 해당 커밋을 둘이나 그 이상의 커밋으로 분리하는 것이 더 좋겠다는 생각이 드는 경우가 있다.

이전 항목에서 사용했던 명령어를 똑같이 입력하고 'pick' 부분을 'edit' 를 바꾸도록 한다. 이제, git 이 편집을 하도록 표시해 놓은 커밋의 차례가 되었을때 rebase 작업이 멈추게 된다.

이 시점에서 git reset HEAD^ 명령을 수행하여 해당 커밋의 이전 커밋 상태를 작업 디렉토리에 설정한다. 그러고 난 이후에는, stage 되지 않은 대상 커밋의 변경사항들을 원하는 순서대로 add 하고 커밋하면 된다 - 결과적으로 대상 커밋을 여러개의 커밋으로 나누게 된 것이다.

복수개의 커밋을 하나의 커밋으로 합치기 (squash)

어떤 작업을 여러개의 커밋으로 나누어서 작성 완료한 이후, 해당 커밋들을 하나의 커밋으로 합치는 것이 좋겠다는 생각이 드는 경우가 있다. 이러한 경우 git rebase -i HEAD~3 명령을 입력하면 되며, 숫자 3의 경우에는 합치고자 하는 커밋의 숫자에 따라 적절하게 입력한다.

이번에는 'pick' 부분을 'squash' 로 변경한다. rebase 작업 중에, squash 하도록 명시한 커밋들은 이전 커밋의 내용에 합쳐지게 된다; 최종적으로 복수개의 커밋들이 모두 하나의 커밋으로 합쳐질 것이다.

역주: 원문에서는 'edit' 선택시 커밋의 내용이 staging 영역이 추가된 상태로 rebase 작업이 정지된다고 기술되어 있으나, 자체 테스트시 커밋이 유지되어 있어 해당 내용은 번역에서 제외하였습니다.

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

반응형

+ Recent posts