※그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.
rebase란?
우선 rebase 명령어를 한마디로 표현하면 '지정한 커밋을 브랜치를 바꿔서 다시 만들거나 한 묶음으로 만들어서 로그를 깨끗하게 하는 명령어'이다.
더 심플하게 말하면 '지정 커밋을 다시 만들어 로그를 청소하기 위한 명령어'라고도 할 수 있을 것이다. 하지만 이렇게 말하면 이해하기 어려울 것이므로. 그 사용법과 함께 설명하고자 한다.
rebase의 두 가지 중요한 쓰임새
제목에서 알 수 있는 rebase에는 두 가지 사용법이 존재한다.
한쪽은 「각각의 브랜치로 늘어나 있던 개발 커밋을 다시 연결한다」라고 하는 사용법. 다른 하나는 「여러 개의 커밋을 1 커밋으로 정리한다」라고 하는 사용법이다. 각각 살펴보자.
개발 커밋을 다시 연결하기
먼저 각각의 브랜치로 늘어나 있던 개발 커밋을 다시 연결한다」를 살펴보도록 하자.

이 상태에서「브랜치 A」를 「브랜치 B」에 머지할 필요가 생겼다고 하자. 그냥 머지한다면 아래와 같이 될 것이다.

브랜치 A의 끝에서 브랜치 B의 갱신 내용을 신규 커밋으로서 다시 생성할 수 있는 것이다.
머지와의차이를그림으로살펴보도록하겠다.

rebase 쪽이 갱신 로그가 일직선으로 보기 쉽다는 것을 알 수 있다. 과거의 갱신 이력을 쫓을 때도 보기 편해진다.
이처럼 브랜치마다 진행되고 있는 개발을 다시 연결하고 청소하는 것이 'rebase 명령어'의 기능 중 하나이다.
커맨드
커맨드 설명을 위해 브랜치 B를 사용하고 있는 것으로 가정하겠다. 그 상태에서 이하의 명령을 실행하면 된다.
git rebase [연결 대상 브랜치명]
rebase 명령어 뒤에 연결할 브랜치 이름을 붙이기만 하면 된다.
참고로 커밋 ID 를 지정할 수도 있다.
예로 위에서 봤던 이미지를 구현한다고 하자.

(브랜치 B에 체크아웃한 상태) 그럼 커맨드는 다음과 같다.
git rebase 브랜치A
여러 개의 커밋을 1개의 커밋으로 정리하기
또 하나 다름 사용법인 여러 개의 커밋을 하나로 정리하는 방법에 대해서 알아보도록 하자.
이번에는 브랜치A를 사용하고 있다고 가정하다. 그리고 아래와 같은 개발이 진행되고 있다고 하자.

그리고 이 4개의 커밋 ABCD가 존재하고 각 수정은 매우 미비한 수정으로 「한 묶음으로 하고 싶다…」라고 하는 생각이 머리를 스쳤을 때는…rebase 명령어가 사용하면 된다. rebase 명령의 "-i" 옵션을 이용하면 복수 커밋을 1 커밋으로 정리할 수 있다.

이런 식으로 「신규 커밋 E」로서 지정한 복수의 커밋을 하나로 다시 만들 수 있다.
커맨드
여러 개의 커밋을 하나의 커밋으로 정리하려면 , 「-i 옵션」을 사용한 이하의 커맨드를 실행할 필요가 있다.
git rebase - i [묶음으로 하는 지점 중 하나 앞의 커밋 ID] [묶음으로 하는 지점 중 하나 앞의 커밋 ID]
커맨드만으로는 알기 어렵다. 그러므로 예시를 바탕으로 어떻게 커맨드를 작성하면 좋을지 설명하도록 하겠다.

위의 이미지를 구현하는 것이라면 「개시 지점 커밋의 커밋 ID」를 지정할 필요가 있다. 그것을 지정함으로써 '개시지점 커밋 ~ 현재 위치'까지의 '커밋 ABCD'를 하나로 묶을 수 있게 된다.
또 해당 커맨드를 친 직후, 어느 커밋을 한 묶음으로 할지의 지정 화면이 표시된다. 딱 아래와 같은 화면이다.
pick d9a1f0e 커밋A
pick 400f340 커밋B
pick f35185d 커밋C
pick 8dfc486 커밋D
이 화면에서 어떤 커밋을 하나로 묶을지 지정하자.
통합할 커밋의 'pick(아무것도 하지 않음)' 부분을 'squash(통합함)'로 변경하고 저장 후 종료하면 통합이 실행되게 된다. 다만 이 때, 선두의 커밋은 통합 시작될 부분이 되기 때문에 pick인 채로 해야한다. 그 점을 주의하자.
pick d9a1f0e 커밋A
squash 400f340 커밋B
squash f35185d 커밋C
squash 8dfc486 커밋B
전부 통합하고자한다면 이렇게 설정하면 된다.
merge와 rebase의 차이점
두 명령어의 가장 큰 차이점은 '기존 커밋에 영향을 주는가, 주지 않는가'이다.
처음에 설명한 대로 rebase 명령어는 처리를 다시 만들어 버리는 반면 "merge 명령어"는 기존 커밋에 영향을 주지 않고 머지 커밋을 작성해 준다. 이 점이 이 두 가지의 가장 큰 차이점이다. 그리고 이 차이로 인해 「팀 개발」을 실시하고 있을 때 혼란을 야기하게 되는 경우가 발생할 수도 있다.
팀 개발 측면에서 봤을 때
어느 날, 자신이 올렸던 커밋이 없어져 버렸다! 그렇게 되면, 매우 곤란해진다. 따라서 공동 개발을 하고 있는 이상 'rebase 명령어'를 안이하게 사용하면 누군가의 커밋을 마음대로 다시 만들게 되어 팀에 혼란을 초래하게 되므로 주의가 필요하다.
참고자료
'IT > 기초 지식' 카테고리의 다른 글
| git revert (0) | 2026.01.06 |
|---|---|
| 웹 서비스를 공개하기 전 체크 리스트 (엔지니어용) (0) | 2024.07.09 |
| 가상 DOM (Vritual DOM)이란? (0) | 2024.03.28 |
| JWT(JSON Web Token)란? (0) | 2024.03.10 |
| 2024년 2월부터 바뀌는 Gmail의 이메일 발신자 가이드 라인과 필요한 대응 정리 (0) | 2023.12.11 |