HOWTO · Git

Git의 특정 커밋으로 리베이스

git rebase --onto를 사용해 브랜치를 특정 커밋으로 리베이스하고 이동할 커밋을 선택하세요.

이 페이지의 내용

Git 브랜치를 특정 커밋 위로 리베이스하려면 git rebase --onto <newbase> <upstream> [<branch>]를 사용합니다. Git은 브랜치에서는 도달할 수 있지만 upstream에서는 도달할 수 없는 커밋들을 newbase 위로 옮깁니다. 아래 예시에서는 new-feature와 main을 사용합니다. 축약된 커밋 ID는 저장소의 실제 ID로 바꾸세요. 아래 명령은 기본 Git 작업을 보여 주는 예시이며 실행되지는 않았습니다.

Git에서 특정 커밋으로 리베이스하기

먼저 git status --short --branch와 git log --oneline --graph --decorate --all로 브랜치 이름, 작업 트리, 커밋 그래프를 확인합니다. 대상 커밋, 옮길 커밋을 구분하는 upstream 경계, 리베이스할 브랜치를 파악하세요. 리베이스는 커밋 기록을 다시 작성하므로 올바른 브랜치에서 작업 중인지 확인하고, 다른 사람이 사용하는 브랜치를 다시 작성하기 전에 협의하세요.

--onto 옵션에서는 새 기준 커밋을 먼저 쓰고 upstream 경계를 두 번째로 씁니다. 선택 사항인 세 번째 인수는 리베이스할 브랜치를 지정하며, 새 부모 커밋을 지정하는 인수가 아닙니다. 생략하면 Git은 현재 체크아웃된 브랜치를 리베이스합니다. 현재 브랜치는 HEAD가 가리킵니다.

예를 들어 846e2fa가 main에서 선택한 커밋이고 bd9172c가 new-feature의 커밋들 앞에 있는 upstream 경계라고 가정해 보겠습니다. 해당 기능 브랜치의 커밋들을 선택한 커밋 위로 옮기려면 git rebase --onto 846e2fa bd9172c new-feature를 실행합니다. Git은 new-feature에서는 도달할 수 있지만 bd9172c에서는 도달할 수 없는 커밋을 선택한 다음 846e2fa 위에 다시 적용합니다.

리베이스 범위에서 첫 번째 커밋 제외하기

기능 브랜치의 첫 커밋을 제외하려면 해당 커밋을 upstream 경계로 지정합니다. 제외할 첫 커밋이 e2ff2bc라면 git rebase --onto 846e2fa e2ff2bc new-feature를 실행합니다. Git은 new-feature에서는 도달할 수 있지만 e2ff2bc에서는 도달할 수 없는 커밋을 리베이스하므로, 선택한 범위에서 e2ff2bc와 그 조상 커밋이 제외됩니다. 먼저 그래프를 확인해 e2ff2bc가 의도한 경계인지, 뒤에 이어지는 커밋에 보존하려는 변경 사항이 들어 있는지 확인하세요.

리베이스 범위에서 마지막 커밋 제외하기

브랜치 인수를 지정해도 브랜치의 끝 커밋이 자동으로 제외되지는 않습니다. 끝 커밋인 d7dbeb은 제외하면서 범위를 846e2fa 위로 옮기려면 대화형 리베이스를 사용합니다. git rebase -i --onto 846e2fa bd9172c new-feature를 실행하세요. 할 일 목록에서 d7dbeb의 명령을 pick에서 drop으로 바꾸거나 해당 줄을 삭제한 다음, 편집기를 저장하고 닫습니다. 나머지 커밋은 pick으로 둡니다. 이렇게 하면 bd9172c 이후의 같은 범위를 선택하고 Git이 목록을 다시 적용할 때 원치 않는 끝 커밋을 명시적으로 제외합니다.

새 기록 확인 및 충돌 처리

작업이 끝나면 git log --oneline --graph --decorate --all을 살펴보고 new-feature가 846e2fa를 기반으로 의도한 커밋만 포함한 기록을 가리키는지 확인합니다. 필요하면 git diff main...new-feature로 브랜치를 main과 비교하세요.

Git이 충돌로 멈추면 해당 파일을 확인하고 충돌을 해결한 뒤 git add <file>로 해결 결과를 스테이징합니다. git rebase --continue로 계속 진행하세요. 진행 중인 리베이스를 취소하고 브랜치를 시작 상태로 되돌리려면 git rebase --abort를 사용합니다. 기록을 공유하기 전에 다시 확인하세요. 리베이스하면 커밋 ID가 바뀌므로 공유 브랜치에 다시 푸시할 때는 협의가 필요하며, 신중히 검토한 강제 푸시가 필요할 수도 있습니다.