Repository navigation
Merge와 Rebase #39
Replies: 6 comments
1. Merge와 Rebase는 각각 어떻게 동작하며, 커밋 히스토리에는 어떤 차이를 남기나요?Git에서 Merge와 Rebase는 서로 다른 브랜치의 변경 사항을 통합하는 방법이다. 차이는 기존 커밋의 분기 구조를 보존하느냐, 커밋을 새 기준 위에 다시 쌓느냐에 있다. 다음처럼 [ Merge ] : 분기와 통합 기록을 보존
두 브랜치의 변경 사항을 합치는 병합 커밋 M이 만들어진다.
[ Rebase ] : 새 기준 위에 커밋을 다시 생성
Git은
2. 이미 원격 저장소에 push된 브랜치를 rebase하면 어떤 문제가 발생할 수 있으며, 그 이유는 무엇인가요?이미 원격에 push한 브랜치를 Rebase하면 다른 사람이 가진 커밋 히스토리와 어긋날 수 있다. Rebase가 기존 커밋을 이동하는 대신, 새로운 ID를 가진 커밋으로 다시 만들기 때문이다. 예를 들어 원격의 원격 및 동료: A─B─D─E 이때 발생할 수 있는 문제는 다음과 같다.
따라서 다른 사람이 사용하는 브랜치는 Rebase 전에 조율해야 한다. 강제 push가 필요하면 3. 팀 프로젝트에서 merge와 rebase 중 어떤 방식을 선택해야 하며, GitHub의 Merge commit·Squash and merge·Rebase and merge는 각각 어떤 상황에 적합한가요?팀 프로젝트에서는 공유 브랜치의 안정성과, 어떤 단위로 기록을 남길지를 기준으로 선택하면 된다. 개발 중 브랜치를 최신화 하는 방식과 GitHub에서 PR을 병합하는 방식은 별도로 정할 수 있다.
예를 들어 개인 브랜치는 Rebase로 정리하고, PR은 Squash and merge로 통합하는 정책도 가능하다.
일반적인 작은 기능별 PR 중심의 팀이라면 다음을 기본안으로 추천한다.
참고로 GitHub의 Rebase and merge는 대상 브랜치에 새 커밋을 추가하는 동작이다. 로컬에서 공유 브랜치를 Rebase한 뒤 강제 push하여 원격 기록을 덮어쓰는 경우와는 다르다. GitHub는 이 방식에서 커밋 SHA를 새로 생성한다. 핵심은 작업 과정 보존은 Merge commit, PR 단위 기록은 Squash, 개별 커밋을 유지한 선형 기록은 Rebase and merge이다. |
기본 질문1. Merge와 Rebase는 각각 어떻게 동작하며, 커밋 히스토리에는 어떤 차이를 남기나요?Merge와 Rebase는 모두 한 브랜치의 변경 사항을 다른 브랜치에 통합할 때 사용됩니다. 먼저 통합은 A에서 B로 통합한다면 A를 주로 source / feature / topic 브랜치라 하고 B를 target / base 브랜치라고 합니다. Merge는 통합 때, feature 브랜치의 변경사항이 base 브랜치에 통합되었다는 표시인 Merge Commit을 남겨 두 브랜치의 통합을 표시합니다. Rebase는 feature 브랜치가 시작된 위치를 base 브랜치의 끝 지점으로 옮겨 통합합니다. 이때 옮기는 행위를 기존 커밋들을 복사해 새로운 커밋으로 base 브랜치로 커밋합니다. Merge는 분기 가지를 유지한채 feature 브랜치에서의 변경사항을 통합한다는 표시 커밋만 base 브랜치에 남기기 때문에 히스토리에서 분기 가지가 보입니다. 반면에 Rebase는 feature 브랜치의 시작 지점을 base 브랜치로 옮겼기 때문에 분기 가지가 보이지 않습니다. 2. 이미 원격 저장소에 push된 브랜치를 rebase하면 어떤 문제가 발생할 수 있으며, 그 이유는 무엇인가요?push된 브랜치를 Rebase하면 원격과 로컬의 브랜치 충돌이 일어날 수 있습니다. 이미 원격 저장소에 push된 브랜치를 Rebase하면 문제가 발생하는 이유는 Rebase가 기존의 커밋을 복사해 새로운 커밋을 만들어 기준 브랜치 끝에 새로 커밋한다는 특성 때문입니다. 이를 구체적인 예시를 들어 설명하겠습니다. 먼저 본인이 feature 브랜치를 push 하고 동료가 그 브랜치를 pull 했다면 나, 원격, 동료가 모두 feature 브랜치의 커밋 A, B를 모두 함께 가집니다. 그런데 여기서 feature 브랜치를 특정 브랜치로 Rebase 한다면 A, B 커밋이 A’, B’으로 완전히 다른 커밋으로 base 브랜치 줄기 끝에 만들어집니다. 이렇게 되면 원격에선 feature 브랜치는 A, B를 가지고 내 로컬의 feature는 A’, B’을 가집니다. 이때 또 원격으로 feature를 push를 한다면 원격에선 A, B가 없는 push를 거절합니다. 3. 팀 프로젝트에서 merge와 rebase 중 어떤 방식을 선택해야 하며, GitHub의 Merge commit·Squash and merge·Rebase and merge는 각각 어떤 상황에 적합한가요?merge, rebase는 둘 중 하나가 정답이다로 정해져 있지 않고 취향의 영역으로 많이 갈립니다. 두 통합 방식의 차이는 분기를 남기느냐 남기지 않느냐이고 분기를 남겨서 우리의 작업 히스토리를 시각적으로 남기고 싶다면 merge, 분기를 남기지 않고 현재 최신 상태를 일직선으로 깔끔하게 관리하고 싶다면 rebase를 선택해서 사용합니다. Github의 Merge Commit, Squash and Merge, Rebase and Merge가 어떤 상황에 적합한지 말하기전 새로운 개념인 Squash에 대해 설명하면 이는 여러 커밋을 하나로 압축해 기록하는 것입니다. 그래서 Merge Commit과 Rebase and Merge는 앞서 말했듯이 취향의 영역이라면 Squash and Merge는 주로 자질구레한 커밋이 많이 섞여 커밋 기록이 지저분 하다면 압축해서 하나의 커밋으로 기록하는 상황에 유용합니다. |
1. Merge와 Rebase는 각각 어떻게 동작하며, 커밋 히스토리에는 어떤 차이를 남기나요?Merge는 두 브랜치의 변경사항을 합치면서 새로운 병합 커밋을 만든다. 기존 커밋들은 그대로 유지된 채, 새로운 커밋이 하나 추가되는 방식이다. 히스토리를 보면 브랜치가 갈라졌다가 다시 합쳐지는 분기가 그대로 남아서, 실제 작업 흐름과 시점을 정확히 알 수 있다. 그치만 브랜치가 많아지면 히스토리가 복잡해질 수도 있다. Rebase는 이름 처럼 base를 다시 설정한다라고 생각하면 편하다. 내가 작업하고 있던 브랜치를 떼어내서 대상 브랜치의 최신 커밋 뒤에 하나씩 다시 적용하는 방식이다. 브랜치가 애초에 최신 main에서 시작한 것처럼 커밋들을 재작성한다. 이렇게 하면 히스토리가 갈라짐 없이 일직선으로 깔끔하게 정리되지만, 커밋들이 새로 생성되는 것이므로 커밋 해시가 전부 바뀌게 된다. 2. 이미 원격 저장소에 push된 브랜치를 rebase하면 어떤 문제가 발생할 수 있으며, 그 이유는 무엇인가요?Rebase는 커밋을 재작성하는 작업이라 커밋 해시가 모두 바뀐다. 문제는 원격 저장소에는 이미 이전 커밋 히스토리가 올라가 있다. 내가 로컬에서 rebase를 하면 내용은 같더라도 로컬 히스토리와 원격 히스토리가 서로 다른 커밋으로 갈라지게 된다. 이 상태에서 그냥 push를 하면 원격과 로컬 히스토리가 안 맞아서 거부되고, 강제로 올리려면 3. 팀 프로젝트에서 merge와 rebase 중 어떤 방식을 선택해야 하며, GitHub의 Merge commit·Squash and merge·Rebase and merge는 각각 어떤 상황에 적합한가요?main브랜치나 develop브랜치 같은 공유 브랜치에 다른 사람의 작업을 반영할 떄는 merge를 사용하는 것이 안전하다. 이미 여러 사람이 보고 있는 히스토리를 재작성하면 안되기 떄문이다. 내 개인의 아직 아무도 안 본, push도 안한 feature브랜치를 최신 main과 동기화하고 싶을 때는 rebase로 깔끔하게정리한 뒤 PR을 올리는 방식이 권장된다. 깃허브에서 PR병합 방식은 3가지가 있다.
|
1. Merge와 Rebase는 각각 어떻게 동작하며, 커밋 히스토리에는 어떤 차이를 남기나요?merge와 rebase는 모두 서로 다른 브랜치의 작업을 합치는 방법이지만, 커밋 기록을 처리하는 방식이 다릅니다. merge는 두 브랜치의 기존 커밋을 그대로 유지하면서 하나로 합칩니다. 필요한 경우 두 작업을 합쳤다는 새로운 merge commit이 생성됩니다. 실제 브랜치 작업 흐름이 남는다는 특징이 있습니다. rebase는 현재 브랜치의 시작점을 다른 브랜치의 최신 커밋 뒤로 옮깁니다. 기존 D, E를 그대로 이동하는 것이 아니라, 변경 내용을 다시 적용하여 D', E'라는 새로운 커밋을 만듭니다. 커밋 기록이 한 줄로 정리되며, 잘못 사용하면 다른 팀원의 작업에 영향을 줄 수 있다는 특징을 가집니다. 2. 이미 원격 저장소에 push된 브랜치를 rebase하면 어떤 문제가 발생할 수 있으며, 그 이유는 무엇인가요?Git 커밋의 해시는 변경 내용만으로 결정되지 않습니다. 작성자, 시간, 커밋 메시지, 이전 커밋인 부모 커밋 등의 정보도 영향을 줍니다. 따라서 rebase로 부모 커밋이 달라지면 코드 내용이 같더라도 새로운 해시를 가진 커밋이 생성됩니다. 따라서 원격저장소에 이를 올리려면 강제 push가 필요할 수 있습니다. 그런데 만약 다른 팀원이 기존 커밋을 내려받아 작업하고 있었다면, 원격 히스토리가 변경되면서 커밋 중복이나 충돌이 발생하고 팀원의 작업을 덮어쓸 위험도 있습니다. 따라서 여러 사람이 공유하는 main이나 develop 브랜치는 rebase하지 않는 것이 안전합니다. Rebase는 아직 공유하지 않은 개인 브랜치에서 사용하는 것이 좋습니다. 3. 팀 프로젝트에서 merge와 rebase 중 어떤 방식을 선택해야 하며, GitHub의 Merge commit·Squash and merge·Rebase and merge는 각각 어떤 상황에 적합한가요?팀의 협업 방식과 원하는 히스토리에 따라 선택해야 합니다. 일반적인 선택 기준
팀 프로젝트에서는 다음과 같은 규칙을 사용할 수 있습니다.
GitHub의 세 가지 병합 방법
요약Merge는 기존 커밋을 유지하면서 브랜치를 합치고, rebase는 커밋을 최신 브랜치 뒤에 다시 적용합니다. 따라서 merge는 실제 작업 흐름이 남고, rebase는 한 줄로 된 깔끔한 히스토리를 만들지만 커밋 해시가 변경됩니다. 이미 push한 브랜치를 rebase하면 기존 커밋의 해시가 변경되어 원격 저장소와 기록이 달라집니다. 강제 push 과정에서 다른 팀원의 커밋을 덮어쓰거나 충돌을 만들 수 있으므로 공유 브랜치는 rebase하지 않는 것이 안전합니다. Merge commit은 작업 흐름 보존, Squash and merge는 여러 커밋을 하나의 기능 단위로 정리, Rebase and merge는 개별 커밋을 유지하면서 선형 히스토리를 만들 때 적합합니다. 팀 프로젝트에서는 팀원들과 병합 규칙을 미리 통일하는 것이 가장 중요합니다. |
1. Merge와 Rebase는 각각 어떻게 동작하며, 커밋 히스토리에는 어떤 차이를 남기나요?→ merge는 두 브랜치를 합치는 새 브랜치를 만듭니다. 원본의 커밋들이 그대로 보존되고 히스토리가 갈라졌다 합쳐지는 그래프 형태로 남아있습니다. 2. 이미 원격 저장소에 push된 브랜치를 rebase하면 어떤 문제가 발생할 수 있으며, 그 이유는 무엇인가요?→ 이미 원격 저장소에 push 된 브랜치를 pull하고 rebase하게 되면 로컬 히스토리와 원격의 히스토리가 갈라지기에 문제가 발생합니다 그 이유는 rebase는커밋 해시를 바꾸기 때문입니다 3. 팀 프로젝트에서 merge와 rebase 중 어떤 방식을 선택해야 하며, GitHub의 Merge commit·Squash and merge·Rebase and merge는 각각 어떤 상황에 적합한가요?→ 보통 혼자만 보는 로컬 브랜치는 rebase로 정리하고 이미 팀원이 같이 쓰는 공유 브랜치는 merge를 씁니다. |
|
Uh oh!
There was an error while loading. Please reload this page.
📆 일자: 26년 9월 14일(금)
여러 명이 함께 개발할 때는 각자의 브랜치에서 작업한 내용을 하나로 합치는 과정이 필수적입니다. Git에서는 이를 위한 방법으로 merge와 rebase 두 가지를 제공하는데, 두 방식은 단순히 명령어만 다른 것이 아니라 결과로 남는 커밋 히스토리의 모양과 협업 시 발생할 수 있는 문제까지 다르게 만듭니다. 상황을 고려하지 않고 아무 방식이나 사용하면 히스토리가 지저분해지거나, 팀원 간 커밋 충돌 같은 예상치 못한 문제가 생길 수 있습니다. 이에 따라 이번 스터디에서는 merge와 rebase가 각각 어떻게 동작하는지 이해하고, 실제 협업 상황에서 어떤 기준으로 선택해야 하는지 알아보고자 합니다.
🤔오늘의 질문
All reactions