본문 바로가기
BackEnd

Git Rebase란? Git Merge와 Git Rebase의 차이점

by SoriKim 2023. 11. 14.
반응형

📌 Git Flow에 대해서

Git Flow는 Vincent Driessen이 제안한 Git 브랜칭 모델 중 하나로, 큰 규모의 프로젝트에서 협업을 보다 효율적으로 관리하기 위한 전략입니다. Git Flow는 다양한 브랜치를 사용해 코드의 품질을 유지하고 안정성을 확보하며 기능을 효과적으로 개발하는 데 도움을 줍니다. 

 

Git Flow의 주요 브랜치 

1. Master 브랜치: 제품으로 출시될 수 있는 안정된 코드가 있는 브랜치입니다. 

2. Develop 브랜치: 다음 릴리스를 위한 개발이 진행되는 브랜치로 새로운 기능, 버그 수정과 같은 작업이 해당 브랜치에서 파생됩니다. 

 

Git Flow의 다양한 보조 브랜치 

1. feature 브랜치: 새로운 기능을 개발하기 위한 브랜치로 develop 브랜치에서 생성되며, 개발이 완료되면 다시 develop으로 병합됩니다. 

2. release 브랜치: 다음 버전 출시를 준비하기 위한 브랜치로 develop에서 생성되며 QA 및 버그 수정이 이루어진 후 master로 병합되어 실제 출시됩니다. 

3. hotfix 브랜치: 실제 서비스에 발생한 긴급한 버그를 수정하기 위한 브랜치로 master에서 생성되며 수정 후 master와 develop으로 병합됩니다. 

 

Git flow를 사용 시 여러 명의 개발자가 동시에 작업하더라도 안전하게 협업이 가능하며, 각 브랜치의 목적이 명확하게 정의되어 있어 혼란을 최소화할 수 있습니다. 

 

1. Git Merge & Git Rebase란? 

먼저 Git Merge와 Rebase에 대해 설명 드리겠습니다. 

 

🔵 Git Merge

Merge는 두 개의 다른 브랜치를 합치는 기본적인 방법으로 두 브랜치의 변경 내용을 새로운 커밋으로 합칩니다. 

새로운 병합 커밋이 생성되어 기존 브랜치의 커밋 히스토리에 추가됩니다. merge를 통해 브랜치를 통합 시 기존 커밋 히스토리가 유지되어 브랜치 간의 관계가 명확합니다. 

# 예시: develop 브랜치에서 feature 브랜치를 병합
git checkout develop
git merge feature

 

📍 Merge 히스토리 쌓이는 구조 예시(feature1과 feature2 브랜치가 main에 분기되어 작업 예시)

1️⃣ feature1 브랜치에서 main 브랜치로 병합

git checkout feature1
git merge main

 

2️⃣ feature2 브랜치에서도 main 브랜치로 병합

git checkout feature2
git merge main

 

3️⃣ 결과적으로 main 브랜치에는 두 브랜치의 변경 내용 모두 병합 커밋으로 남겨짐

o---o---o---M1---o---o---M2---o  (main)
   \         /         /
    o---o---o         /
                 o---o---o  (feature2)
                        \
                         o---o---o  (feature1)

 

 

🔵 Git rebase

Rebase는 기존 브랜치의 커밋들을 대상 브랜치 위로 옮기는 방법으로 대상 브랜치에 새로운 커밋이 하나씩 추가 및 변경 내용이 적용됩니다. 커밋 히스토리가 선형으로 유지되어 깔끔한 히스트로리를 유지할 수 있지만, 히스토리를 변경하기 때문에 주의가 필요합니다. 간단하게 설명하자면 Rebase는 내 Commit의 base를 변경해, Commit history를 일렬로 잘 정리해줍니다. 해당 브랜치의 base commit을 확인하는 방법으로는 'git merge-base main (브랜치명)'의 명령어를 통해 확인이 가능합니다. 

# 예시: develop 브랜치에서 feature 브랜치를 rebase
git checkout feature
git rebase develop

 

📍 Rebase 과정 예시 및 Commit을 하나로 합치는 경우 명령어 

[ 새로운 작업을 feature 브랜치에서 모두 마치고 push 하기 전] 

1. feature 브랜치에서 git add . 및 git commit -m  남기기 

2. main branch로 이동해 remote main을 pull 받기( git pull origin main)

3. 'git rebase -i main'을 진행 

[ rebase에서 commit을 하나로 합치는 squash를 진행할 경우 ]

4. 'git rebase -i main' 가 진행된 후 편집창이 뜨면 mac의 경우 i를 눌러 편집모드로 변경, 그리고 가장 오래된 commit을 선택(1번이 제일 오래된 commit) 

5. 다른 커밋 메시지는 가장 오래된 commit을 기준으로 squash 진행( → 오래된 commit에만 pick을 남기고 나머지 commit에는 pick을 지우고 s를 남겨 squash 진행)

6. 다른 commit 작업 내역이 없어지는 것이 아님

7. 모든 내용이 변경 되었다면 Esc를 눌러 :wq을 입력해 저장 후 빠져나옴 

 

📍Rebase 히스토리 쌓이는 구조 예시(feature1과 feature2 브랜치가 main에 분기되어 작업 예시)

1️⃣ feature1 브랜치에서 main 브랜치로 rebase 

git checkout feature1
git rebase main

 

2️⃣ feature2 브랜치에서도 main 브랜치로 rebase

git checkout feature2
git rebase main

 

3️⃣ 결과적으로 main 브랜치에는 feature1과 feature2 브랜치의 변경 내용이 순차적으로 적용 

o---o---o---o---o---o---o---o---o  (main)
                               \
                                o---o---o  (feature2)
                                           \
                                            o---o---o  (feature1)

 

 

2.  Git Merge와 Git Rebase의 차이점

1️⃣ commit 시 히스토리의 모양

Merge는 두 브랜치를 병합한 커밋이 하나 생성되기 때문에 히스토리가 복잡해질 수 있습니다. 반면 Rebase는 히스토리를 선형으로 유지하여 깔끔한 히스토리를 유지할 수 있습니다. 

# Merge 시 히스토리
o---o---o---M1---o---o---M2---o  (main)
   \         /         /
    o---o---o         /
                 o---o---o  (feature2)
                        \
                         o---o---o  (feature1)



# Rebase 시 히스토리 
o---o---o---o---o---o---o---o---o  (main)
                               \
                                o---o---o  (feature2)
                                           \
                                            o---o---o  (feature1)

 

2️⃣ commit의 내용

Merge는 각 브랜치의 변경 내용을 유지하면서 합치지만, Rebase는 변경 내용을 하나씩 적용하며 순서대로 새로운 Commit을 생성합니다. 또한, Git Merge는 브랜치 병합할 때마다 새로운 병합 커밋이 생성되지만, Git Rebase는 변경 내용을 현재 브랜치의 끝에 순차적으로 덧붙입니다. 

 

 

3️⃣ Git Rebase 사용 시 좋은 점

  • 불필요한 merge commit 제거 
  • 같은 작업을 진행한 Commit끼리 합쳐 1개의 Commit으로 생성 

 

📍 주의사항

Rebase는 히스토리를 변경하는 작업으로 이미 공개된 브랜치에는 사용을 지양해야 합니다. 

 

[Git Rebase 충돌 시 해결]

rebase 도중 충돌이 일어날 경우 마치 코드가 날아간 것 처럼 보일 수는 있지만 코드가 사라진 것이 아닌 코드를 하비던 도중 중단된 것입니다. 충돌을 해결하고 남은 과정을 끝까지 진행하면 모든 코드가 다 들어와 있게 됩니다. 잘못 리베이스를 한 경우 git rebase --abort(리베이스 도중) 또는 git reflog로 돌아갈 지점을 찾아(코드 고유번호) git reset --hard 돌아갈 지점인 고유번호(리베이스 완료) 명령어로 복구할 수 있습니다. 

  • 충돌 일어난 경우 충돌되는 코드를 수정 후 
  • git add . (git commit은 ❌)
  • git rebase --continue 진행
  • 멈춰 있던 rebase가 진행되고 충돌이 여러번 나면 그때마다 충돌을 해결하고 git add . / git continue를 반복
  • 계속 해결이 안된다면, git rebase --abort로 아예 rebase를 진행하기 전 상황으로 돌아갈 수 있습니다. 

 

반응형

댓글