Basic/Git

[Git]Rebase vs Merge 차이

코딩공대 2023. 1. 2. 12:05
728x90

1. Git

 프로젝트 하면서 깃을 진짜 많이 사용해 본 것 같다.
이에 크고 작은 오류들, 모르는것들이 많이 있었는데 그 중 Rebase와 Merge에 대해 정리해 보려고 한다.

2. Rebase, Merge

Rebase :  Fork 해온 프로젝트를 Upstream에 맞게 동기화 하고 싶을  사용한다.
정보를 Fetch Upstream을 통해 가져오고 Rebase를 통해 병합한다.
Merge : 얘는 Upstream이 없고 Origin만 있는 상태에서 Git을 관리할  사용했었던 방법이다.

 3. Rebase와 Merge의 동작원리

흰색이 Main Branch, 노란색이 Sub Branch입니다.

 Merge

 : Main브랜치에서 Sub브랜치로 $git merge로 병합을 실행한다.

master에서 merge를 실행하면 master브랜치의 HEAD에 새홉게 커밋이력이 생성된다.

이처럼 merge는 실행한 브랜치로 병합을 실행하고 새로운 커밋이력을 생성하는 것을 확인할 수 있다.

 

이 때, main브랜치와 sub브랜치가 같은 부분을 건드리면 conflict가 발생하는데 이 때에는 충돌난 부분을 직접 고쳐주고 다시 add -> commit을 실행시켜주면 된다.

 

Rebase

 : 새롭게 둥지를 튼다는 느낌으로 이해하면 쉽다.

main브랜치에서 sub브랜치를 $git rebase를 실행하면

main브랜치에서 sub브랜치를 기준으로 rebase를 시켰기 때문에 sub브랜치를 베이스로 커밋 이력이 정렬된다.

rebase는 특정 브랜치를 base로 커밋 이력을 재정렬하겠다는 명령어이다.

※ 주의할 점은 재정렬된 커밋이력에 (-1)이 추가되면서 해쉬 ID가 바뀐다. 재정렬되는 commit이력이기 때문에, 이전의 이력과는 다른 새로운 해쉬ID가 부여된다.

4. 간단한 커밋이력 관리법

: main브랜치에서 다른브랜치로 rebase는 지양하는 것이 좋다.

  1. main브랜치로 부터 sub브랜치를 생성하고 작업한다.
     : main브랜치로부터 그냥 브랜치를 생성하고 작업을 하면 된다.
  2. $git checkout sub을 실행한다.
     : main을 기준으로 rebase를 실행하기 위해 작업단위를 이동한다.
  3. $git rebase main을 실행한다.
     : main을 기준으로 rebase를 실행하면  main을 기준으로 sbu브랜치의 이력들이 정리된다.
  4. $git checkout main을 실행한다.
     : 중요한점이 왜 rebase만 실행하면 되는데 다시 main으로 이동할까?
        - > 현재 작업은 sub브랜치 위에서의 이력을 정리하기 위한 작업이다. main을 기준으로 정렬된 이력을 main에 반영해야 한다.
  5. $git merge sub으로 최종내역을 master브랜치에 반영한다.
     : 지금까지 작업한 내용을 main브랜치에 반영하여야 마지막 작업이 완료된다.
       이러면, sub브랜치와 main브랜치의 작업들이 같은 작업 트리로 동기화가 완료된다.

 

대표적인 3가지 merge전략

: merge, rebase and merge, squash and merge 3가지 이다.

 

커밋 히스토리(Commit History)

 : 팀과 일 하는 개발자의 입장에서 코딩, 깃, 커밋등의 약속을 정해서 작업을 한다.

이때 약속을 정해서 규칙을 잘 정해놓으면 커밋 메세지를 보고 어떤 내용이 변경되었는지 한 눈에 파악하기 위함이다.

커밋 히스토리를 잘 관리해야 버그등의 수정 내역이나 변경사항을 찾는 시간이 줄어듭니다.

'Basic > Git' 카테고리의 다른 글

[GitHub] Github 코드리뷰 알람 문제  (1) 2023.08.09