Post

Git Rebase 사용 목적 및 대체 기능

Rebase를 대체할 기능이 있음에도 사용하는 이유가 궁금하다.

Git Rebase 사용 목적 및 대체 기능

📌개요

merge 기능이 있지만 rebase를 사용하는 목적? 사용에 주의가 필요한 기능이라면, 협업에선 어떤 상황에 사용되는지?

📌내용

Rebase 사용 목적

rebase는 개인적으로 작업하는 브랜치나 깔끔한 히스토리를 유지해야 하는 경우에 유용하게 사용된다. 하지만 공유 브랜치에서는 협업 시 혼란을 야기할 수 있으므로 사용에 신중해야 한다.

rebase는 브랜치 변경 사항을 다른 브랜치에 통합하는 강력한 도구로, 특히 다음과 같은 목적을 위해 사용된다.

  • merge와 달리 불필요한 병합 커밋을 생성하지 않고 히스토리를 재작성하여 이해하기 쉽고 추적하기 용이한 선형적인 히스토리를 유지한다.
  • 선형적인 히스토리는 코드 변경 사항을 순차적으로 검토할 수 있도록 도와 코드 리뷰 효율성을 높인다.
  • git bisect와 같은 도구를 사용하여 문제 발생 커밋을 빠르게 찾고 해결하는 데 유용하다.
  • interactive rebase를 통해 커밋 순서 변경, 병합, 삭제 등 다양한 방법으로 커밋 히스토리를 정리하고 관리할 수 있다.

Rebase 대체 기능 및 비교

rebase와 유사한 기능을 수행하는 merge가 있으며, 두 기능의 차이점은 다음과 같다.

기능특징장점단점
merge브랜치 병합 시 병합 커밋 생성히스토리 변경 없이 브랜치 병합 가능
안정적인 협업환경 유지
복잡한 커밋 히스토리 생성
코드 리뷰 및 문제 해결 어려움
rebase커밋 히스토리 재작성깔끔하고 선형적인 커밋 히스토리 유지
코드 리뷰 및 문제 해결 용이
커밋 정리 및 관리 용이
커밋 히스토리 변경으로 인한 잠재적 문제 발생 가능성
숙련되지 않은 사용자에게는 복잡할 수 있음
  • merge는 히스토리 변경 없이 브랜치를 병합하고 안정적인 협업 환경을 유지하는데 적합하다.
  • rebase는 깔끔하고 선형적인 히스토리를 유지하고 코드 리뷰 및 문제 해결 효율성을 높이는 데 적합하다.

Rebase 사용 사례

기능 브랜치 정리, 코드 리뷰 효율성 향상, release 브랜치 관리, 옾느 소스 프로젝트 기여 등에 사용할 수 있다.

main 브랜치 병합 전 Rebase를 통한 커밋 정리

여러 개발자가 feature-A라는 브랜치에서 동시에 작업한다고 생각해보자. 각 개발자는 자신의 작업을 커밋하고 원격 저장소에 푸시할 것이다. feature-A 브랜치를 main 브랜치에 병합하기 전에, 각 개발자는 자신의 커밋을 정리하고 main 브랜치의 최신 변경 사항을 반영하기 위해 rebase를 사용한다.

개발자 A의 작업

  • 개발자 A는 feature-A 브랜치에서 작업을 수행하고 다음과 같은 커밋을 생성한다.
    • 커맷 1: 기능 A의 기본 구조 구현
    • 커밋 2: 기능 A의 UI 개선
    • 커밋 3: 기능 A의 버그 수정
  • 개발자 A는 자신의 커밋을 원격 저장소에 푸시한다.

개발자 B의 작업

  • 개발자 B도 feature-A 브랜치에서 작업을 수행하고 다음과 같은 커밋을 생성한다.
    • 커밋 4: 기능 A의 데이터 처리 로직 구현
    • 커밋 5: 기능 A의 성능 개선
  • 개발자 B는 자신의 커밋을 원격 저장소에 푸시한다.

작업 후 merge 이전의 rebase

브랜치의 작업자가 본인만 있는 경우가 아니라면, 강제 푸시 이전 꼭 협업자와의 소통이 필수.

개발자 B 역시 동일하게 본인의 커밋을 수정할 수 있다.

두서 없이 작업했던 본인의 커밋 내역을 main 브랜치에 합치기 위해 작업 내역을 정리하는 목적으로 사용할 수 있다.

  • git pull origin main 명령으로 main 브랜치의 최신 변경 사항을 로컬 feature-A 브랜치에 가져온다.
  • rebase를 시작한다.
    • git rebase origin/main 명령으로 로컬 feature-A 브랜치의 커밋들을 main 브랜치의 최신 커밋 위에 재배치한다.
  • 충돌 발생 시 해결
    • 충돌이 발생하면 충돌 파일을 수정하고 git add {충돌난 파일} 명령어를 실행한다.
    • git rebase --continue 명령으로 rebase를 계속 진행한다.
  • interactive rebase (선택 사항)
    • git rebase -i origin/main 명령으로 커밋 히스토리를 정리한다.
      • commit을 수정하거나
      • 커밋을 합치거나
      • 불필요한 커밋을 삭제하는 등
  • 원격 저장소에 강제 푸시
    • git push --force-with-lease origin feature-A 명령으로 정리된 커밋 히스토리를 원격 저장소에 강제 푸시한다.
  • 이로 인해 협업 규격에 맞는 커밋으로 수정한 뒤 main 브랜치에 합칠 수 있게 된다.

🎯결론

rebase는 개인 작업의 유연성과 협업 시 커밋 규격 준수를 가능하게 하는 강력한 도구이지만, 히스토리 변경으로 인한 위험성을 항상 염두에 두어야 한다. 따라서, rebase를 사용할 때는 팀원들과 충분히 소통하고 프로젝트의 특성을 고려해서 신중하게 결정해야 한다.

This post is licensed under CC BY 4.0 by the author.