[Codeit]/Spring 백엔드 10기 위클리페이퍼

[01] Git | merge vs rebase, 그리고 fetch vs full

uzlru 2026. 1. 5. 10:12

01. 히스토리 통합 | merge vs rebase

우선 rebase와 merge 모두 다른 브랜치의 변경 내용을 현재 브랜치에 합치기 위해 사용하는 명령어지만, 그 결과인 '커밋 히스토리' 모양에서 극명한 차이를 보인다.

 

1. merge

merge는 두 브랜치의 뿌리를 그대로 유지한 채, 새로운 merge commit을 생성하여 통합하는 전략적인 히스토리 통합 명령어다. 즉, 두 브랜치의 독립적인 기록을 유지한 채 합쳐진 시점을 기록한다. 그렇기에 언제 브랜치가 나뉘었고 합쳐졌는지에 대한 히스토리 기록이 명확하게 있는 그대로 보존되는 장점을 갖지만, 여러 명이 도시에 작업할 경우 커밋 그래프가 복잡하게 얽혀 가독성이 떨어진다는 단점이 있다. 이러한 merge는 기능 개발이 완료된 브랜치를 main이나 develop 같은 공용 브랜치에 최종 통합할 때 사용한다.

 

2. rebase

rebase는 브랜치의 기점을 대상 브랜치의 최신 커밋으로 옮겨, 마치 대상 브랜치의 최신 상태에서 처음부터 작업한 것처럼 히스토리를 조작하는 명령어다. 즉, 현재 브랜치에 있던 커밋들을 대상 브랜치의 최신 커밋에 강제로 이동 시켜 두 개의 브랜치에 있던 커밋들을 순차적으로 쌓아 올리는 것으로, 처음부터 하나의 브랜치에서 작업한 것처럼 보이도록 히스토리를 조작한다. merge에 비해 커밋 히스토리가 평탄한 일직선이 되어 가독성이 뛰어나다는 장점을 갖지만, 이미 원격 저장소에 push된 커밋을 rebase 할 수 없다는 단점이 있다.

 

rebase가 이러한 단점을 갖는 이유는 커밋 해시값의 변화에 있다. git에서 커밋은 고유한 해시 값(id 카드)을 가지는데, 이는 내용 + 날짜 + 이전 커밋의 해시 값 등을 조합해서 만들어지는 값이다. 이 때, rebase 명령어를 사용하면 브랜치의 기점을 변경하는 과정에서 커밋의 이전 커밋 값이 바뀌기 때문에 기존 브랜치에서 사용하던 해시 값과 완전히 다른 해시 값이 새로 발급된다. 그렇기에 이미 원격 저장소에 올라간 내용을 rebase 하게 되면 기존의 작업 내용과 새로운 해시 값을 부여 받은 같은 작업 내용 사이에 충돌이 발생한다. 따라서 이러한 rebase는 로컬에서 작업 중인 기능 브랜치를 최신 상태로 업데이트하거나, pull 요청을 보내기 전 지저분한 커밋들을 하나로 깔끔하게 정리하고 싶을 때 사용한다.

 

03. 비교표

  Git merge Git rebase
핵심 개념 두 브랜치의 뿌리를 유지하며 새로운 합병 커밋 생성 브랜치의 기점을 옮겨 히스토리를 일직선으로 재배치
히스토리 형태 브랜치 분기와 합병 흔적이 그대로 남음 처음부터 한 줄이었던 것처럼 조작
장점 히스토리가 그대로 보존되어 추적 용이 히스토리가 깔끔하여 전체 흐름 파악 용이
단점 병합이 잦을 경우 그래프가 복잡해져 가독성 저하 이미 공유된 커밋에 사용 시 충돌 위험 존재
커밋 해시 기존 커밋 해시값 변화 없음 새로운 부모 커밋을 기반으로 새로운 해시값 생성
주요 사용 상황 기능 개발 완료 후 공용 브랜치(main, dev) 통합 로컬 작업을 정리하거나 PR 전 히스토리 정렬

 

[그림 1] merge vs rebase


2. 원격 변경 사항 가져오기 | fetch vs pull

우선 fetch와 pull 두 명령어 모두 원격 저장소의 내용을 로컬로 가져오는 명령어지만, 안정성 검토 유무에 있어서 차이를 보인다. 

 

1. fetch

fetch는 원격 저장소의 최신 변경 이력 정보만 로컬로 가져오는 명령어다. 실제 내 로컬 작업 파일에는 아무런 변화를 주지 않으며, orgin이나 main 같은 원격 추적 브랜치의 포인터만 업데이트된다. 그렇기에 원격에 어떤 변경 사항이 있는지 코드를 미리 검토하거나, 병합 시 발생할 중돌을 미리 대비하고 싶을 때 사용한다.

 

2. pull

pull은 git fetch와 git merge를 연속해서 실행하는 단축 명령어다. 원격의 데이터를 가져오는 즉시 현재 내 로컬 브랜치에 통합한다. 즉, 내 로컬 작업 파일들이 즉시 원격의 최신 상태로 갱신된다. 이러한 pull은 협업 중인 팀원의 코드를 신속하게 반영해야 하거나, 특별히 충돌 가능성이 없는 단순 작업 시 편리하게 사용한다.

 

3. 비교표

  Git fetch Git pull
핵심 기능 원격 저장소의 최신 이력을 확인만 함 원격 저장소의 내용을 가져와 즉시 병합
로컬 파일 영향 변화 없음 현재 작업 중인 파일들이 즉시 업데이트됨
내부 동작 git fetch git fetch + git merge
안전성 높음, 검토 후 수동 병합 가능 보통, 예기치 못한 충돌 발생 가능
장점 변경 내역을 미리 확인하여 충돌 대비 가능 한 번의 명령으로 최신 상태 유지 가능
주요 사용 상황 신중한 코드 검토가 필요할 때 단순 업데이트나 빠른 동기화가 필요할 때

 


 

[사진 참고]

https://k9want.tistory.com/entry/Git-Merge-vs-Rebase