MMeshOps
바이브코딩을 위한 Git과 리눅스 기초
13예상 8입문

완성된 기능 메인 브랜치에 안전하게 합치기

테스트가 완료된 브랜치의 작업 내용을 메인 코드 베이스에 안전하게 합치는 git merge 명령어의 활용 방법을 설명합니다.

지난 시간의 철저한 워크플로우를 거치며 우리는 평행우주(`feature-darkmode` 브랜치) 안에서 멋진 다크모드 기능을 완성했고 커밋도 무사히 마쳤습니다. 하지만 웹사이트 방문자들은 여전히 원본 우주인 `main` 브랜치의 코드만 보고 있기 때문에 우리가 만든 다크모드 버튼을 볼 수 없습니다. 이제 격리된 병동에서 테스트를 완벽하게 끝낸 안전한 코드를, 우리의 튼튼한 기둥인 `main` 브랜치로 흡수하여 정식 서비스로 올릴 차례입니다. 이 합침의 과정을 Git에서는 '병합(Merge)'이라고 부릅니다.

하나로 합쳐지는 강물: 병합(Merge)의 개념

`main`이라는 큰 강물이 흐르고 있고, 우리는 거기서 물길을 얇게 하나 파내어 `feature-darkmode`라는 작은 시냇물을 만들었습니다. 이 시냇물에서 우리는 온갖 실험을 성공적으로 마쳤습니다. 이제 이 맑아진 시냇물을 다시 원래의 큰 강물(`main`)로 돌려보내어 강물의 수량을 불려야 합니다.

`git merge`는 이렇게 나뉘었던 두 개의 브랜치(역사의 흐름)를 하나로 묶어주는 명령어입니다. 여기서 헷갈리지 말아야 할 아주 중요한 규칙이 하나 있습니다.

"흡수 당하는 쪽에서 명령을 내리는 것이 아니라, 흡수하는 주체(주인공)의 입장에서 빨아들일 대상을 지목해야 한다"는 것입니다. 우리는 `feature` 시냇물을 `main` 강물로 가져올 것이므로, 현재 내 위치는 반드시 넓은 강물인 `main` 브랜치여야 합니다.

실전 병합의 3단계 흐름

병합을 수행하는 과정은 항상 다음의 3단계를 기계적으로 따르게 됩니다.

1. 주인공 브랜치로 이동하기 (`checkout`)

가장 먼저 내가 돌아갈 고향이자 모든 것을 흡수할 본체인 `main` 브랜치로 넘어와야 합니다. 터미널에 `git checkout main` (또는 `git switch main`)을 쳐서 포털을 탑니다. `main`에 오자마자 코드를 확인해 보면, 우리가 열심히 만들었던 다크모드 코드가 감쪽같이 사라진 것을 보고 놀라게 됩니다. 당연합니다. 다크모드는 시냇물에만 있고 여기 강물에는 아직 합쳐지지 않았기 때문입니다.

병합을 위한 준비 이동

$ git checkout main
Switched to branch 'main'

반드시 주인공인 `main` 브랜치로 무사히 넘어왔다는 터미널의 확인 메시지를 본 뒤에 다음 작업을 진행해야 합니다.

2. 대상 브랜치를 지목하여 합치기 (`merge`)

이제 주인공의 입장에서 흡수할 대상을 명령어로 부릅니다. 터미널에 `git merge feature-darkmode`라고 입력합니다. "저기 있는 `feature-darkmode` 브랜치의 모든 작업 내역을 싹 다 지금 내가 있는 이 `main` 브랜치로 끌고 와서 합쳐라!"라는 뜻입니다.

Fast-forward 병합 메시지 분석

bash
```bash
$ git merge feature-darkmode
Updating 1a2b3c4..5f6g7h8
Fast-forward
 index.html | 2 ++
 style.css  | 5 +++++
 2 files changed, 7 insertions(+)
```
  1. 1정상적으로 명령이 수행되면 터미널에 'Fast-forward'라는 반가운 단어가 뜹니다.
  2. 2이것은 main 브랜치와 feature 브랜치 사이에 아무런 걸림돌이나 모순점이 없어서, 마치 빨리 감기(Fast-forward) 비디오테이프를 윙 돌리듯이 부드럽게 앞쪽의 최신 코드로 상태가 쑥 이동했다는 완벽한 성공을 의미합니다.

성공 메시지를 본 후 `index.html` 파일을 다시 열어보면, 사라졌던 다크모드 버튼 코드가 `main` 기둥에 예쁘게 안착해 있는 것을 확인할 수 있습니다! 방문자들에게 새로운 기능을 서비스할 준비가 완료된 것입니다.

3. 다 쓴 평행우주 폭파시키기 (선택사항)

기능도 완벽히 합쳤으니, `feature-darkmode`라는 나뭇가지는 이제 그 소임을 다했습니다. 계속 놔두면 나중에 브랜치가 수십 개로 늘어나 터미널 화면이 지저분해집니다. 이미 코드는 `main`에 모두 안전하게 복사되었으므로, 과거의 껍데기만 남은 이 브랜치는 깔끔하게 지워주는 것이 프로들의 관습입니다.

브랜치를 삭제할 때는 소문자 `-d` 옵션을 씁니다. `git branch -d feature-darkmode`를 입력하면 "Deleted branch..." 메시지와 함께 평행우주가 역사 속으로 사라집니다. (소문자 `-d`는 이미 병합이 완료된 안전한 브랜치만 지워주는 똑똑한 옵션이며, 대문자 `-D`는 병합 안 된 것도 강제로 날려버리는 위험한 옵션입니다.)

Merge 전 체크리스트

  1. 1반드시 git status를 쳐서 내 현재 위치가 합쳐진 결과물을 받을 'main' 브랜치인지 확인한다.
  2. 2main 브랜치 위에 미처 commit하지 않은 지저분한 파일들이 없는지(clean) 다시 한번 확인한다.
  3. 3합치고자 하는 대상 브랜치의 이름을 정확한 스펠링으로 타이핑한다.

우리는 이제 기능마다 나뭇가지를 치고(`branch`), 안전하게 코드를 짜고 테스트한 뒤(`commit`), 다시 튼튼한 기둥으로 합치는(`merge`) 고급 기술을 익혔습니다. 바이브코딩으로 아무리 복잡한 기능을 추가하더라도 이 패턴 안에서는 절대 원본 코드가 무너질 일이 없습니다.

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

작업 중이던 'new-design' 브랜치에서의 기능 개발이 성공적으로 끝나서, 이 변경 사항을 실제 서비스 중인 메인 코드 베이스인 'main' 브랜치에 정식으로 포함(병합)시키려고 합니다. 올바른 병합 순서는 무엇인가요?

3줄 요약

  1. 1분리된 브랜치에서 안전하게 테스트와 커밋을 마친 코드를 다시 원본 기둥(main)으로 합치는 작업을 병합(Merge)이라고 합니다.
  2. 2병합을 수행할 때는 반드시 흡수하는 주체인 main 브랜치로 이동(checkout)한 상태에서 대상을 지목(git merge [대상브랜치])해야 합니다.
  3. 3main으로 병합이 완전히 끝난 작업용 브랜치는 git branch -d 명령어를 통해 삭제하여 프로젝트의 브랜치 목록을 깔끔하게 유지하는 것이 좋습니다.