Git Rebase란?
Git Rebase는 브랜치 간의 커밋 히스토리를 깔끔하게 정리하고 병합할 때 사용하는 명령어입니다. Git Merge와 비교하여 히스토리를 더욱 선형적으로 만들어 가독성을 높이고 추적이 용이해지는 장점이 있습니다.
Git Rebase를 사용하면 메인 브랜치에서 커밋을 쉽게 추적할 수 있습니다. 이를 통해 선형적인 커밋 히스토리를 얻게 되며, 변경 사항이 순차적으로 적용되기 때문에 시간이 지남에 따른 코드 변화를 쉽게 이해할 수 있습니다.
또한, 선형적인 히스토리는 특정 변경 사항이 언제 도입되었는지 파악하거나 버그를 추적하기 쉽게 해줍니다. 변경 사항을 되돌리기도 쉬워지며, 단일 커밋만 되돌리면 되기 때문에 브랜치를 병합하는 복잡한 과정을 거칠 필요가 없습니다.
다만, Git Rebase를 사용하면 충돌을 해결하는 과정에서 주의를 기울여야 하며, 작업 중인 브랜치의 변경 사항을 잃어버릴 위험이 있으므로 유의해야 합니다.
Git Rebase 실습
다음 예제를 통해 Git Rebase의 과정을 살펴보겠습니다.
먼저, 터미널에서 다음과 같이 테스트 폴더를 생성하고, Git 저장소를 초기화합니다.
mkdir test-rebase
cd test-rebase
git init
그 다음, test.txt
파일을 생성하고 초기 내용을 추가한 후 커밋합니다.
echo "init" > test.txt
git add test.txt
git commit -m "init"
이제 새로운 브랜치를 만들고 해당 브랜치에서 작업을 수행한 후 커밋합니다.
git checkout -b side
echo "side 1" >> test.txt
git commit -a -m "side 1"
메인 브랜치로 돌아가서 다른 작업을 수행한 후 커밋합니다.
git checkout main
echo "main 1" >> test.txt
git commit -a -m "main 1"
이제 side 브랜치에서 rebase를 실행합니다.
git checkout side
git rebase main
다음과 같이 충돌이 발생하게 됩니다.
test.txt 파일의 내용을 다음과 같이 수정해줍니다.
충돌을 해결하고, rebase 를 계속 진행합니다.
git add test.txt
git rebase --continue
이 예제에서는 커밋 메시지 수정하지 않겠습니다. Vim
에서 :wq
명령으로 저장 및 종료해주세요.
해결해야 할 커밋이 하나이기 때문에 한번의 충돌만 해결하였습니다. 만약 하나 이상의 커밋이라면 해당 커밋마다 git rebase --continue
명령을 여러번 사용해서 충돌에 대응해줘야 합니다.
rebase가 완료되면, 메인 브랜치로 이동하여 side 브랜치를 병합합니다.
git checkout main
git merge side
로그를 통해 rebase가 완료된것을 확인합니다.
git log --oneline --graph
이제 rebase를 취소하는 방법을 알아보겠습니다. 먼저 git reflog
를 사용하여 현재 브랜치의 모든 작업 기록을 확인합니다.
git reflog
출력 예시:
0a2e359 HEAD@{0}: rebase finished: returning to refs/heads/side
6ebd0e2 HEAD@{1}: rebase: side 1
9182da2 HEAD@{2}: rebase: checkout main
1f6d5a5 HEAD@{3}: commit: main 1
8c55575 HEAD@{4}: commit: init
위 출력에서 rebase되기 전 상태를 확인하려면 HEAD@{4}
를 사용하면 됩니다.
git reset --hard HEAD@{4}
주의: reset --hard
명령어는 변경 사항이 모두 삭제되므로 사용할 때 주의해야 합니다.
결론
Git Rebase는 브랜치 간 커밋 히스토리를 선형적으로 정리하고 병합할 때 사용합니다. 이로 인해 코드 변화를 이해하기 쉽고 추적이 용이해집니다. 그러나 충돌 해결 과정에서 주의가 필요하며, 작업 중인 브랜치의 변경 사항을 잃어버릴 위험이 있습니다. 공개 브랜치에서는 사용을 지양하고, 개인 브랜치에서만 사용하는 것이 좋습니다.
댓글