본문 바로가기
프로그래밍

[Git] git merge, rebase, squash

by 뽀도 2024. 11. 8.

1. Git merge (병합)

  • 목적: 두 개 이상의 브랜치를 병합하여 작업을 통합.

  • 동작 방식:
    • merge 명령은 두 브랜치를 통합할 때 **새로운 병합 커밋(merge commit)**을 생성합니다.
    • 병합 커밋은 두 브랜치의 변경사항을 결합하고, 히스토리에 브랜치가 병합된 시점을 표시합니다.
  • 장점:
    • 기존 브랜치 히스토리를 보존하고 병합 이력을 명확히 남깁니다.
    • 협업 시 브랜치 간 작업 흐름을 쉽게 추적할 수 있습니다.

예시:

 
머지 트리 그림

 
1. [파란색 main] 'git 정리하게 다시' 기준으로 bgr 브랜치 생성
2. [파란색 main] 1. 기능추가 커밋 추가 후 푸시까지
3. [핑크색 bgr] 기능 추가 커밋 추가 후 푸시까지
4. [파란색 main] 브랜치에 bgr 기능추가를 병합함 
5. 맨위에 Merge branch : 새로운 병합 커밋 생성
 
 

왼 : bgr 브랜치 "main 기능 추가 없음", 오 : main 브랜치 bgr 기능 추가 1,2, 다 있음

 
 
 
 


2. Git rebase

  • 목적: 브랜치의 변경사항을 특정 브랜치 위에 **재배치(reapply)**하여 히스토리를 정리합니다.
  • 동작 방식:
    • rebase 명령은 원래 브랜치의 커밋을 새로운 커밋으로 재작성하여 지정된 브랜치 위에 올려놓습니다.
    • 브랜치 히스토리가 "직선화"되어 마치 브랜치가 그 위에서 직접 작업된 것처럼 보입니다.
  • 장점:
    • 깔끔한 히스토리를 유지하며, 브랜치 병합 시 불필요한 병합 커밋을 피할 수 있습니다.
    • 커밋 이력을 간결하게 관리할 수 있습니다.
    • 저장소를 최신 상태로 유지 : 리베이스는 마스터 브랜치나 다른 개발 브랜치에 대한 최신 수정 사항으로 기능 브랜치를 업데이트 하는 방법입니다. 이를 통해 코드 업데이트가 최신 코드 베이스버전을 기반으로 하는지 확인하기가 더 쉬워집니다. 
  • 예시:
     
    # feature 브랜치를 master 브랜치 위로 리베이스

    git checkout feature
    git rebase master
    • 이 명령은 feature 브랜치를 master의 최신 커밋 위로 재배치하여 새로운 커밋을 생성합니다.

    •  
  • 주의사항:
    • rebase는 커밋 이력을 재작성하기 때문에, 이미 공유된 브랜치에서 사용 시 동료들과의 협업에 혼란을 초래할 수 있으니 주의가 필요합니다.


      Before 

 

main으로 bgr_rebase를 rebase해서 사랑이란 유리 같은것으로 교체됨 .

 

워킹 트리가 하나로 깔끔해짐

 
 


 

3. Git squash

  • 목적: 여러 개의 커밋을 하나의 커밋으로 합쳐서 깔끔한 커밋 이력을 만들기 위해 사용됩니다.
  • 동작 방식:
    • rebase 명령의 인터렉티브 모드(git rebase -i)에서 squash를 사용하여 여러 커밋을 하나로 합칠 수 있습니다.
    • 합쳐진 커밋의 메시지를 편집할 수 있으며, 히스토리를 정리하는 데 유용합니다.
  • 장점:
    • 작업 히스토리를 정리하여 의미 있는 커밋 하나로 합칠 수 있습니다.
    • 여러 번의 작은 커밋을 하나로 합쳐 PR(Pull Request)을 깔끔하게 정리할 수 있습니다.
  • 예시:
    1. 최근 3개의 커밋을 스쿼시하려면:
       

      git rebase -i HEAD~3

    2. 에디터가 열리면 합치고 싶은 커밋을 squash 또는 s로 표시합니다:
       
      pick a1b2c3 Commit message 1
      squash d4e5f6 Commit message 2
      squash g7h8i9 Commit message 3
       
    3. 커밋 메시지를 편집하여 저장하면 세 개의 커밋이 하나로 합쳐집니다.

기능별 비교 요약

  1. merge:
    • 병합 커밋을 생성하여 브랜치와 병합 이력을 유지.
    • 히스토리를 보존하며 병합 과정을 명확하게 보여줌.
  2. rebase:
    • 브랜치의 변경사항을 지정된 브랜치 위로 재배치.
    • 히스토리가 직선화되며 깔끔하고 간결하게 관리 가능.
  3. squash:
    • 여러 개의 커밋을 하나로 합쳐서 의미 있는 단일 커밋으로 정리.
    • 주로 rebase -i와 함께 사용하여 히스토리를 정리.

언제 사용해야 할까?

  • **merge**는 브랜치를 명확히 병합하고 병합 기록을 유지하고자 할 때.
  • **rebase**는 히스토리를 직선화하고 깔끔하게 유지하고자 할 때.
  • **squash**는 여러 커밋을 하나의 단일 커밋으로 합쳐 커밋 내역을 정리하고자 할 때.

이 세 가지 기능을 목적에 맞게 사용하면 Git 히스토d리를 관리하고 협업하는 데 있어 큰 도움이 됩니다.
 
 

1. Git에서 rebase와 merge의 차이점은 무엇인가요?

답변: 

두 개의 서로 다른 브랜치를 병합하려면 git merge를 사용하고, 한 브랜치의 변경 사항을 다른 브랜치에 통합하려면 git rebase를 사용합니다.

2. git cherry-pick과 rebase의 차이점은 무엇인가요?

답변: 

Cherry-pick은 주어진 커밋의 변경 사항을 현재 브랜치에 적용합니다. git rebase를 사용하면 한 브랜치의 변경 사항을 다른 브랜치에 통합할 수 있습니다.

 
 
작성중! 

반응형

댓글