3-6. Git의 interactive rebase: 커밋 수정

1. Interactive Rebase란 무엇인가?

Git의 interactive rebase는 커밋 히스토리를 대화형으로 수정할 수 있는 강력한 기능입니다. 이는 마치 타임머신을 타고 과거로 돌아가서 커밋들을 편집하고, 순서를 변경하며, 불필요한 커밋을 삭제하는 것과 같습니다. 이러한 기능을 통해 깔끔하고 정돈된 커밋 히스토리를 유지하여 프로젝트의 가독성을 높이고, 팀 협업을 원활하게 할 수 있습니다.

Git은 기본적으로 커밋을 생성된 순서대로 기록합니다. 그러나 개발 과정에서 커밋 메시지를 수정하거나, 실수로 잘못된 내용을 커밋했을 경우, 또는 여러 개의 작은 커밋을 하나의 의미 있는 커밋으로 묶고 싶을 때가 있습니다. 이러한 상황에서 interactive rebase는 매우 유용하게 활용될 수 있습니다.

2. Interactive Rebase의 기본 사용법

interactive rebase를 사용하기 위해서는 먼저 git rebase -i <commit> 명령어를 사용해야 합니다. 여기서 <commit>은 수정하려는 커밋의 조상 커밋(base commit)을 의미합니다. 예를 들어, 최근 3개의 커밋을 수정하고 싶다면, HEAD~3<commit>으로 지정할 수 있습니다.

git rebase -i HEAD~3

위 명령어를 실행하면 텍스트 에디터가 열리고, 선택한 범위의 커밋 목록이 표시됩니다. 각 커밋 앞에는 pick이라는 명령어가 붙어 있습니다. 이 명령어는 해당 커밋을 그대로 유지하겠다는 의미입니다.

pick a1b2c3d 커밋 메시지 1
pick e4f5g6h 커밋 메시지 2
pick i7j8k9l 커밋 메시지 3

이 텍스트 에디터에서 각 커밋에 대한 명령어를 수정하여 커밋을 수정할 수 있습니다. 주요 명령어는 다음과 같습니다.

  • pick: 커밋을 그대로 유지합니다. (기본값)
  • reword (r): 커밋 메시지를 수정합니다.
  • edit (e): 커밋을 수정합니다. (커밋 내용을 변경하고 싶을 때)
  • squash (s): 이전 커밋과 병합합니다. (커밋 메시지는 유지)
  • fixup (f): 이전 커밋과 병합합니다. (커밋 메시지는 버림)
  • exec (x): 셸 명령을 실행합니다.
  • drop (d): 커밋을 삭제합니다.

예를 들어, 두 번째 커밋의 메시지를 수정하고 싶다면, pickreword로 변경합니다.

pick a1b2c3d 커밋 메시지 1
reword e4f5g6h 커밋 메시지 2
pick i7j8k9l 커밋 메시지 3

저장하고 텍스트 에디터를 닫으면, Git은 지정된 명령어에 따라 rebase 작업을 수행합니다. reword로 지정된 커밋의 경우, 다시 텍스트 에디터가 열리고 새로운 커밋 메시지를 입력할 수 있습니다.

3. Interactive Rebase를 활용한 커밋 수정

1) 커밋 메시지 수정

reword 명령어를 사용하여 커밋 메시지를 수정할 수 있습니다. 이는 오타를 수정하거나, 좀 더 명확한 메시지를 작성하고자 할 때 유용합니다.

git rebase -i HEAD~2
pick a1b2c3d 잘못된 커밋 메시지
reword e4f5g6h 올바른 커밋 메시지

저장 후 에디터가 열리면, 새로운 커밋 메시지를 입력합니다.

2) 커밋 내용 수정

edit 명령어를 사용하면 특정 커밋을 수정할 수 있습니다. 이 명령어를 사용하면, 해당 커밋 시점으로 되돌아가서 변경 사항을 수정하고, 다시 커밋할 수 있습니다.

git rebase -i HEAD~2
pick a1b2c3d 기능 추가
edit e4f5g6h 오타 수정

저장 후, Git은 e4f5g6h 커밋 시점으로 이동합니다. 수정 후, 변경 사항을 스테이징하고, git commit --amend 명령어를 사용하여 커밋을 수정합니다. 수정이 완료되면 git rebase --continue 명령어를 실행하여 rebase 작업을 계속 진행합니다.

3) 커밋 병합 (Squash & Fixup)

여러 개의 작은 커밋을 하나의 큰 커밋으로 묶고 싶을 때 squash 또는 fixup 명령어를 사용합니다. squash는 커밋 메시지를 수정할 수 있도록 에디터를 열지만, fixup은 커밋 메시지를 버리고 이전 커밋에 병합합니다.

git rebase -i HEAD~3
pick a1b2c3d 기능 1 구현
squash e4f5g6h 기능 1 버그 수정
squash i7j8k9l 기능 1 리팩토링

저장하면 Git은 e4f5g6hi7j8k9l 커밋을 a1b2c3d 커밋에 병합합니다. squash를 사용했으므로, 새로운 커밋 메시지를 입력할 수 있는 에디터가 열립니다. fixup을 사용했다면, 커밋 메시지 수정 없이 병합됩니다.

4) 커밋 삭제

불필요한 커밋을 삭제하려면 drop 명령어를 사용합니다.

git rebase -i HEAD~3
pick a1b2c3d 불필요한 내용 추가
pick e4f5g6h 기능 1 구현
drop i7j8k9l 테스트 코드 삭제

저장하면 i7j8k9l 커밋이 삭제됩니다.

Interactive Rebase의 전반적인 과정을 설명한 후

4. Interactive Rebase의 주의사항 및 트러블슈팅

1) 이미 원격 저장소에 Push된 커밋 수정

interactive rebase는 이미 원격 저장소에 push된 커밋을 수정하는 데 사용하면 안 됩니다. 커밋 히스토리가 변경되면, 다른 개발자들이 해당 커밋을 기반으로 작업한 브랜치에 문제가 발생할 수 있습니다. 즉, 히스토리가 달라지면서 충돌이 발생하고, 동기화가 어려워집니다. 만약, 이미 공유된 커밋을 수정해야 한다면, 수정된 내용을 새로운 커밋으로 추가하고, 기존 커밋을 revert하는 방식을 사용하는 것이 좋습니다.

2) 충돌 해결

interactive rebase 과정에서 충돌이 발생할 수 있습니다. 충돌이 발생하면, 충돌을 해결하고 git add 명령어로 스테이징한 후, git rebase --continue 명령어를 실행하여 rebase 작업을 계속 진행해야 합니다. 만약, rebase 작업을 중단하고 싶다면, git rebase --abort 명령어를 사용하면 됩니다.

3) 안전한 사용

interactive rebase는 강력한 기능이지만, 잘못 사용하면 히스토리가 꼬일 수 있습니다. 따라서, 중요한 작업을 수행하기 전에, 현재 브랜치를 백업하기 위해 새로운 브랜치를 생성하는 것이 좋습니다. 예를 들어, git branch backup_branch 명령어를 사용하여 현재 브랜치의 백업을 생성할 수 있습니다.

4) Rebase 작업 중단

만약, rebase 작업이 예상대로 진행되지 않거나, 작업을 중단하고 싶다면 git rebase --abort 명령어를 사용하여 rebase 작업을 취소하고 원래 상태로 되돌릴 수 있습니다. 이 명령어는 rebase 작업으로 인해 발생한 모든 변경 사항을 되돌리고, 브랜치를 원래 위치로 복원합니다.

5) Rebase 작업 재개

rebase 작업 중 충돌을 해결한 후, 작업을 다시 진행하려면 git rebase --continue 명령어를 사용합니다. 이 명령어는 충돌 해결 후, 다음 커밋으로 rebase 작업을 계속 진행합니다.

5. Interactive Rebase의 활용 사례

1) 커밋 메시지 다듬기

개발 과정에서 오타, 부정확한 내용, 또는 불필요한 정보를 담은 커밋 메시지를 수정하여, 프로젝트의 커밋 히스토리를 더욱 깔끔하게 관리할 수 있습니다.

2) 코드 리뷰를 위한 커밋 정리

코드 리뷰 전에, 여러 개의 작은 커밋을 하나의 의미 있는 커밋으로 묶거나, 불필요한 커밋을 삭제하여, 코드 리뷰 과정을 더욱 원활하게 만들 수 있습니다. 코드 리뷰어가 변경 사항을 쉽게 이해하고, 리뷰하는 데 집중할 수 있도록 돕습니다.

3) feature branch 정리

feature branch를 main branch에 merge하기 전에, 관련 커밋들을 정리하여 깔끔한 merge를 수행할 수 있습니다. 이는 merge conflict를 최소화하고, main branch의 안정성을 유지하는 데 도움이 됩니다.

4) 실험적인 커밋 삭제

실험적인 코드를 작성하고 커밋했지만, 최종적으로 채택되지 않은 경우, 해당 커밋을 삭제하여 불필요한 히스토리를 제거할 수 있습니다.

6. 결론

interactive rebase는 Git의 강력한 기능으로, 커밋 히스토리를 효과적으로 관리하고, 프로젝트의 가독성과 유지보수성을 향상시키는 데 기여합니다. 다양한 명령어를 적절히 활용하여, 개발 효율성을 높이고, 팀 협업을 원활하게 할 수 있습니다. 하지만, 이미 공유된 커밋을 수정하는 경우에는 주의해야 하며, 백업 브랜치를 생성하고, 충돌 해결 방법을 숙지하는 등 안전하게 사용하는 것이 중요합니다. interactive rebase를 통해, 보다 효율적이고, 깔끔한 개발 환경을 구축할 수 있습니다.

비슷한 글 추천

Comments (0)

No comments yet. Be the first to comment!