Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까

  1. 홈
  2. 블로그
  3. 소프트웨어 개발
소프트웨어 개발

Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까

Git merge와 rebase 중 무엇을 고르느냐에 따라 프로젝트 히스토리의 모습이 달라집니다. 같은 예제와 실제 로그 출력으로 둘을 비교하고, 사고를 막아 주는 규칙 하나를 배우고, 안전한 팀 워크플로를 그대로 가져가세요.

읽는 시간 7분
Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까
핵심 요약
  • Merge는 새 머지 커밋으로 두 브랜치를 잇고 히스토리를 일어난 그대로 보존합니다.
  • Rebase는 내 커밋을 다른 브랜치 위에 다시 적용해 직선 히스토리를 만들지만 커밋 해시가 바뀝니다.
  • 다른 사람이 이미 가져간 커밋은 절대 rebase하지 마세요.
  • 풀 리퀘스트를 열기 전에 내 기능 브랜치를 rebase하고, 메인 브랜치에 합칠 때는 merge를 쓰세요.

기능 브랜치가 main보다 뒤처져 있고 새 작업이 필요합니다. Git merge vs rebase는 그것을 가져오는 두 가지 방법 중의 선택이며 둘 다 올바릅니다. 차이는 이후 히스토리가 어떻게 보이느냐입니다.

아주 작은 저장소를 만들어 두 명령을 모두 실행하고 실제 출력을 아래에 붙였습니다. 상상 대신 결과를 직접 비교해 보세요. Git이 처음이라면 초보자를 위한 Git 튜토리얼(영문)부터 시작하세요.

git merge와 git rebase가 하는 일

git merge는 두 브랜치의 끝을 가져와 합칩니다. 양쪽 모두 새 커밋이 있으면 Git은 부모가 둘인 머지 커밋을 만듭니다. 이미 존재하는 것은 아무것도 바뀌지 않습니다.

git rebase는 내 브랜치에만 있는 커밋을 따로 빼 두고, 브랜치를 상대 브랜치의 끝으로 옮긴 뒤, 내 커밋을 하나씩 다시 적용합니다. 다시 적용된 커밋은 변경 내용이 같아도 새 해시를 가진 새 커밋입니다.

git merge 실습

출발점은 이렇습니다. main에 커밋 A, feature에 커밋 두 개(F1, F2)가 있고, 이후 main에 커밋 하나(M1)가 더 추가되었습니다. 이제 main을 feature에 merge합니다.

git switch feature
git merge main
git log --oneline --graph

*   f507aab Merge main into feature
|\
| * 8842fb5 M1
* | 082cc6a F2
* | 5a71e3c F1
|/
* 8766865 A

그래프는 실제 과정을 보여 줍니다. 두 작업 흐름이 합쳐졌습니다. 원래 커밋 F1과 F2는 해시를 유지합니다. 대가는 머지 커밋이 하나 늘어나는 것이며, 바쁜 프로젝트에서는 그래프가 거미줄처럼 됩니다.

git rebase 실습

출발점은 같지만 이번에는 feature를 main 위로 rebase합니다.

git switch feature
git rebase main
git log --oneline --graph

* 1ff474b F2
* bf9149e F1
* 8842fb5 M1
* 8766865 A

히스토리는 M1 이후에 작업을 시작한 것처럼 한 줄의 직선입니다. 해시를 보세요. F1은 5a71e3c에서 bf9149e로, F2는 082cc6a에서 1ff474b로 바뀌었습니다. Git이 다시 쓴 것이고, 그래서 rebase는 주의가 필요합니다.

merge와 rebase 나란히 비교

항목MergeRebase
히스토리 모양머지 커밋이 있는 갈래 그래프한 줄의 직선
기존 커밋변경되지 않음새 해시로 다시 쓰임
충돌머지 커밋에서 한 번에 해결다시 적용되는 각 커밋마다 해결해야 할 수 있음
공유 브랜치에서의 안전성안전함안전하지 않음
가장 적합한 용도완성된 작업을 main에 통합리뷰 전에 내 브랜치 업데이트

팁: 결정하기 어렵다면 내 브랜치를 가진 사람이 또 있는지 물어보세요. 없다면 rebase는 안전합니다. 동료가 가져갔다면 merge를 쓰세요.

rebase의 황금률

내 저장소 밖에 존재하는 커밋은 rebase하지 마세요. rebase 후에는 내 브랜치가 서버의 사본과 달라지므로 푸시에 강제 옵션이 필요합니다. 동료가 옛 커밋 위에 작업을 쌓았다면 그들의 히스토리가 내 것과 어긋나고, 이를 정리하는 일은 고통스럽습니다.

내 개인 기능 브랜치를 rebase하는 것은 괜찮습니다. main이나 다른 사람들이 쓰는 브랜치를 rebase하는 것은 안 됩니다.

안전한 팀 워크플로

이 절차는 누구도 놀라게 하지 않으면서 히스토리를 깔끔하게 유지합니다. 대부분의 팀이 CI 파이프라인 앞에서 쓰는 방식이기도 하며, GitHub Actions CI/CD 가이드(영문)의 파이프라인이 그 예입니다.

git switch feature
git fetch origin
git rebase origin/main        # or: git pull --rebase
# fix conflicts, then: git add <file> && git rebase --continue
git push --force-with-lease   # only on your own branch

--force-with-lease는 마지막 fetch 이후 누군가 서버 브랜치에 푸시했다면 덮어쓰기를 거부합니다. 일반 --force는 이를 조용히 없애 버립니다. 풀 리퀘스트가 승인되면 main에 merge하세요.

잘못된 rebase를 되돌리는 방법

rebase는 파괴적으로 보이지만 옛 커밋은 한동안 Git의 reflog에 남아 있으므로 되돌릴 수 있습니다.

git reflog                    # find the commit before the rebase
git reset --hard HEAD@{5}     # example position, check reflog first

위험한 rebase 전에 git branch backup으로 백업 브랜치를 만들어 두면 복구는 명령 한 줄입니다. 컨테이너에서 데이터베이스나 도구를 함께 돌리나요? 초보자를 위한 Docker 튜토리얼(영문)을 확인해 보세요.

마무리

Merge는 사실을 보존하고, rebase는 그것을 깔끔하게 유지합니다. 내 브랜치를 최신으로 만들 때는 rebase를, 결과를 전달할 때는 merge를 쓰고, 다른 사람이 의존하는 히스토리는 절대 다시 쓰지 마세요.

자주 묻는 질문

git merge와 git rebase의 차이는 무엇인가요?

Merge는 머지 커밋으로 두 브랜치를 합치며 기존 커밋을 모두 보존합니다. Rebase는 내 커밋을 다른 브랜치 위로 옮기고 다시 써서 선형 히스토리를 만듭니다.

merge와 rebase 중 무엇을 써야 하나요?

내 기능 브랜치를 최신으로 유지할 때는 rebase를, main 같은 공유 브랜치에 전달할 때는 merge를 쓰세요. 다른 사람이 브랜치를 공유한다면 항상 merge를 쓰세요.

git rebase는 위험한가요?

개인 브랜치에서는 안전하지만 공유 브랜치에서는 커밋 해시를 다시 쓰기 때문에 위험합니다. 문제가 생기면 백업 브랜치와 reflog로 복구하세요.

force-with-lease는 무엇을 하나요?

원격 브랜치가 마지막으로 본 위치에 그대로 있을 때만 강제 푸시하므로, 동료의 새 커밋을 실수로 덮어쓰지 않습니다.

rebase하면 내 커밋이 삭제되나요?

아니요. 같은 변경을 가진 새 커밋이 만들어지고, 옛 커밋은 Git이 정리할 때까지 reflog에 남습니다.

더 배우기 (영문 글)

Stack Quora와 함께하세요

테스트, WordPress, SEO에 도움이 필요하신가요?

저희는 팀이 더 나은 소프트웨어를 출시하고 사이트를 성장시키도록 돕습니다. 어떤 작업을 하고 계신지 알려 주시면 명확한 다음 단계를 제안해 드립니다.

계속 읽으세요

추가 가이드 테스트, AI 및 최신 개발

이 기사가 마음에 드셨나요? 주제를 선택하고 최신 튜토리얼로 바로 이동하세요.

인공지능

AI 환각 설명: 언어 모델이 사물을 구성하는 이유와 이를 줄이는 방법

AI 환각은 그것이 무엇인지, 언어 모델이 환각을 생성하는 이유, 일반적인 유형, 접지 및 프롬프트를 통해 환각을 줄이는 방법, 그리고 우리가 실행한 간단한 점검에 대해 설명했습니다.

기사 읽기 →
DevOps

환경 변수 설명: .env 파일, 비밀 및 구성이 올바르게 완료되었습니다.

우리가 실행한 Python 예제를 통해 설명된 환경 변수: 읽기 및 설정, 모든 값이 문자열인 이유, .env 파일, 프로세스 상속, 비밀 및 유효성 검사.

기사 읽기 →
소프트웨어 개발

API 속도 제한 설명: 알고리즘, 헤더 및 429 오류 처리

우리가 실행한 시뮬레이션을 통해 설명된 API 속도 제한: 토큰 버킷, 고정 창, 슬라이딩 창, 429 응답, 속도 제한 헤더, 백오프를 사용한 재시도 및 테스트 제한.

기사 읽기 →
테스트 자동화

Python에서 조롱: unittest.mock, 패치 및 테스트를 거짓말로 만드는 실수

Unittest.mock을 사용하여 Python에서 모의, 테스트됨: 모의 및 return_value, 부작용, 이름이 사용되는 패치, 사양 및 자동 사양, 모의 날짜 및 일반적인 실수.

기사 읽기 →
소프트웨어 테스트

코드 커버리지 설명: 회선 커버리지와 분기 커버리지 및 100%의 실제 의미

실제 Coverage.py 실행을 통해 설명되는 코드 적용 범위: 라인, 분기 및 조건 적용 범위, 보고서 읽기, 100% 적용 범위가 여전히 버그를 놓칠 수 있는 이유 및 합리적인 대상.

기사 읽기 →
데이터베이스 및 SQL

SQL의 DELETE vs TRUNCATE vs DROP: 차이점, 롤백 및 사용 시기

테스트된 SQL을 통해 DELETE 대 TRUNCATE 대 DROP에 대해 설명합니다. 각각의 제거, 롤백, 트리거, ID 재설정, 속도 및 PostgreSQL, MySQL, SQL Server 및 SQLite의 차이점.

기사 읽기 →
데이터베이스 및 SQL

SQL 뷰 설명: 예제를 통해 함정 생성, 사용 및 방지

우리가 실행한 쿼리로 설명된 SQL 뷰: 뷰 생성, 실시간 결과, 열 숨기기, 성능, 업데이트 가능하고 구체화된 뷰, 손상된 종속성 및 모범 사례.

기사 읽기 →
소프트웨어 개발

TypeScript 인터페이스와 유형: 실제 차이점, 컴파일러로 테스트

TypeScript 인터페이스 대 유형, 실제 컴파일러로 확인: 둘 다 할 수 있는 것, 하나만 할 수 있는 것, 선언 병합, 확장 대 교차점 및 따라야 할 간단한 규칙.

기사 읽기 →
소프트웨어 개발

Python *args 및 **kwargs 설명: 명확한 예가 포함된 유연한 함수

Python *args 및 **kwargs는 우리가 실행한 코드(패킹 및 언패킹, 매개변수 순서, 키워드 전용 및 위치 전용 인수, 데코레이터 및 일반적인 오류)를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Python Lambda 함수: 구문, 실제 사용 및 사용하지 말아야 할 경우

Python 람다 함수는 구문, 키를 사용한 정렬, 맵 및 필터, 클로저, 후기 바인딩 트랩, 일반 def가 더 나은 선택인 경우 등 우리가 실행한 코드로 설명되었습니다.

기사 읽기 →
인공지능

AI 에이전트란 ​​무엇입니까? 작동 방식, 간단한 에이전트 루프를 사용하여 실행할 수 있음

AI 에이전트란 무엇입니까? 우리가 실행한 작은 Python 루프, 실제 위험 및 간단한 챗봇이 더 나은 선택일 때 에이전트 루프, 도구, 메모리 및 가드레일에 대한 일반 가이드입니다.

기사 읽기 →
DevOps

모니터링과 관찰 가능성: 로그, 지표, 추적을 통한 실제 차이점

모니터링과 관찰 가능성 설명: 알려진 오류와 알려지지 않은 오류, 로그, 지표 및 추적, 결제 사건 안내, 골든 신호, OpenTelemetry 및 유용한 경고.

기사 읽기 →
DevOps

Docker 볼륨과 바인딩 마운트: 컨테이너 데이터를 올바른 방식으로 유지

Docker 볼륨과 바인드 마운트 설명: 컨테이너 데이터가 사라지는 이유, 명명된 볼륨, 바인드 마운트, tmpfs, Compose 예제, 백업, 권한 및 각 사용 시기.

기사 읽기 →
테스트 자동화

TDD와 BDD: 주요 차이점, 두 가지 방식으로 구축된 하나의 기능 및 각 사용 시기

TDD와 BDD는 두 가지 방식으로 구축된 하나의 할인 기능, 즉 우리가 실행한 코드를 사용한 적록 리팩토링, 주어진 시점 시나리오, 도구, 장단점 및 각 사용 시기를 설명합니다.

기사 읽기 →
소프트웨어 개발

Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까

Git merge vs rebase를 실제 로그 출력, 비교표, rebase의 황금률, 안전한 팀 워크플로로 설명합니다.

기사 읽기 →
소프트웨어 개발

파이썬 리스트 컴프리헨션: 문법, 예제, 피해야 할 때

파이썬 리스트 컴프리헨션 설명: 문법, 필터링, if-else, 중첩 반복문, 실제 측정 시간, 그리고 일반 for 반복문이 더 나은 경우.

기사 읽기 →
데이터베이스 및 SQL

예제로 쉽게 배우는 SQL JOIN (Inner, Left, Right, Full)

샘플 테이블과 쿼리로 SQL JOIN을 단계별로 이해하세요. INNER, LEFT, RIGHT, FULL, CROSS, SELF와 흔한 실수, 성능 팁까지 정리했습니다.

기사 읽기 →