프로덕션을 위한 Git 마스터링: 브랜칭, 머징 & 스쿼시 전략, 모든 엔지니어가 알아야 할 것

발행: (2026년 2월 19일 오후 09:23 GMT+9)
13 분 소요
원문: Dev.to

Source: Dev.to

위에 제공된 내용만으로는 번역할 텍스트가 없습니다. 번역을 원하는 본문을 알려주시면 한국어로 번역해 드리겠습니다.

현대 소프트웨어 개발 및 Git 기본

현대 소프트웨어 개발은 코드 변경을 관리하고 협업을 지원하며 안정성을 유지하기 위해 버전 관리 시스템에 크게 의존합니다. Git은 팀이 서로의 진행 상황을 덮어쓰지 않고 동시에 작업할 수 있게 해주는 업계 표준 분산 버전 관리 시스템입니다.

Git의 강력함의 핵심은 브랜칭, 병합, 스쿼시, 리베이스와 같은 브랜치와 히스토리 관리 기능입니다. 이러한 개념을 이해하는 것은 깔끔하고 추적 가능하며 프로덕션에 바로 투입할 수 있는 코드베이스를 유지하는 데 필수적입니다.

이 글을 읽고 나면 엔지니어는 다음을 수행할 수 있게 됩니다:

  1. 안전하게 작업하기 위해 브랜치를 생성
  2. 다양한 전략을 사용해 브랜치를 병합
  3. 병합 충돌을 해결
  4. 여러 커밋을 하나로 스쿼시
  5. 전체 프로젝트를 GitHub에 푸시

프로젝트 설정 – 파트 1

단계명령목적결과
1️⃣mkdir git-merge-lab프로젝트 폴더를 생성하여 기존 파일과의 충돌을 방지하고 Git‑merge 연습을 위한 제어된 환경을 제공하는 격리된 작업 공간을 마련합니다.새 디렉터리 git-merge-lab 가 생성됩니다.
2️⃣cd git-merge-lab터미널 세션을 프로젝트 디렉터리로 이동시켜 해당 폴더를 현재 작업 환경으로 설정합니다.쉘의 작업 디렉터리가 이제 git-merge-lab 가 됩니다.
3️⃣git init새 Git 저장소를 초기화합니다.숨김 .git 폴더가 생성되고, 디렉터리가 Git 저장소가 됩니다.
4️⃣echo "# Team Project" > README.mdREADME.md 파일을 생성하고 초기 내용을 채웁니다.# Team Project 를 포함하는 README 파일이 폴더에 추가됩니다.
5️⃣git add README.md다음 커밋을 위해 파일을 스테이징합니다.파일이 인덱스(스테이징 영역)에 배치됩니다.
6️⃣git commit -m "Initial commit"프로젝트 상태의 스냅샷을 저장소 기록에 기록합니다.“Initial commit” 메시지를 가진 커밋이 생성됩니다.
7️⃣git branch -M main기본 브랜치 이름을 main 으로 변경합니다.현재 브랜치 이름이 main 으로 바뀝니다.

FAST‑FORWARD MERGE – 파트 2

단계명령목적결과
8️⃣git checkout -b feature-login새로운 feature-login 브랜치를 만들고 그 브랜치로 전환합니다.main에서 새로운 feature-login 브랜치가 생성되고 체크아웃됩니다.
9️⃣echo "Login page created" > login.txt로그인 기능과 관련된 소스 파일을 추가합니다.텍스트 Login page created가 들어 있는 login.txt 파일이 생성됩니다.
🔟git add login.txt
git commit -m "Add login feature"
git add는 파일을 스테이징하고, git commit은 스테이징된 변경을 새로운 스냅샷으로 기록합니다.feature-login 브랜치에 **“Add login feature”**라는 커밋이 생성됩니다.
1️⃣1️⃣git checkout mainmain 브랜치로 다시 전환합니다.작업 디렉터리가 이제 main을 반영합니다.
1️⃣2️⃣git merge feature-loginfast‑forward 병합을 수행합니다: main 포인터가 feature-login의 커밋들을 포함하도록 앞당겨집니다.main에 로그인 기능이 포함되고, 원한다면 feature-login 브랜치를 삭제할 수 있습니다.

Source:

3‑WAY MERGE (Parallel Work) – Part 3

13️⃣ Profile 기능 만들기

git checkout -b feature-profile
echo "Profile page created" > profile.txt
git add profile.txt
git commit -m "Add profile feature"

프로필 기능을 위한 격리된 개발 컨텍스트를 생성합니다.

14️⃣ Settings 기능 만들기

git checkout main
git checkout -b feature-settings
echo "Settings page created" > settings.txt
git add settings.txt
git commit -m "Add settings feature"

이제 코드베이스가 분기되었습니다: 두 개의 독립적인 브랜치(feature‑profilefeature‑settings)가 각각 별도의 커밋을 포함합니다.

15️⃣ Profilemain에 병합

git checkout main
git merge feature-profile

히스토리에 따라 fast‑forward 또는 일반 병합이 수행되어 프로필 작업이 통합됩니다.

16️⃣ Settings(3‑Way) 를 main에 병합

git checkout main
git merge feature-settings

main에 이미 feature‑profile의 변경 사항이 포함되어 있기 때문에, Git은 두 히스토리를 조정하는 merge commit을 생성합니다.

Note: 병합 편집기(Vim 기본)가 열리면 커밋 메시지를 입력하고 Esc를 누른 뒤 :wq를 입력해 저장하고 종료합니다.

단계명령목적결과
16️⃣git merge feature-settingsfeature‑profilefeature‑settings의 분기된 히스토리를 결합하는 병합 커밋을 생성합니다.main에 두 기능이 모두 포함된 병합 커밋이 추가됩니다.

MERGE CONFLICT – Part 4

17️⃣ Bug‑Fix Branch (updates README)

git checkout -b bugfix-title
echo "# Team Project Version 2" > README.md
git add README.md
git commit -m "Update title in bugfix"

18️⃣ Feature Branch (also updates README)

git checkout main
git checkout -b feature-title-update
echo "# Awesome Team Project" > README.md
git add README.md
git commit -m "Update title in feature"

19️⃣ Trigger Conflict

git checkout main
git merge bugfix-title
git merge feature-title-update

Git은 README.md에 대한 두 개의 서로 다른 변경을 자동으로 병합할 수 없으며 작업을 중단합니다.

20️⃣ Resolve Conflict

  1. 충돌이 발생한 파일을 Vim(또는 원하는 편집기)으로 엽니다:

    vim README.md
  2. 충돌 표시(>>>>>>>, <<<<<<<, =======)를 제거하고 원하는 최종 내용을 유지합니다:

    # Awesome Team Project Version 2
  3. 저장하고 종료합니다(:wq).

  4. 해결된 파일을 스테이징하고 해결 커밋을 만듭니다:

    git add README.md
    git commit -m "Resolve merge conflict"
단계명령목적결과
20️⃣git add README.md
git commit -m "Resolve merge conflict"
수동 충돌 해결을 저장소 기록에 기록합니다.충돌이 해결되었습니다; main에 이제 병합된 README가 포함됩니다.

스쿼시 머지 – 파트 5

21️⃣ 다수 커밋으로 기능 만들기 및 스쿼시하기

git checkout -b feature-dashboard
커밋명령
Add dashboard layoutbash\n echo "Dashboard layout" > dashboard.txt\n git add dashboard.txt\n git commit -m "Add dashboard layout"\n
Add chartsbash\n echo "Add charts" >> dashboard.txt\n git add dashboard.txt\n git commit -m "Add charts"\n
Fix alignmentbash\n echo "Fix alignment" >> dashboard.txt\n git add dashboard.txt\n git commit -m "Fix alignment"\n

이제 세 개의 커밋을 하나의 깔끔한 커밋으로 스쿼시한 뒤 main에 병합합니다:

# 현재 피처 브랜치에 있는지 확인
git checkout feature-dashboard

# 마지막 세 커밋을 스쿼시하기 위한 인터랙티브 리베이스
git rebase -i HEAD~3

열린 편집기에서:

  1. 두 번째와 세 번째 줄의 picks(또는 squash)로 바꿉니다.
  2. 저장하고 종료합니다 (:wq).

Git이 세 개의 커밋을 하나로 합칩니다. 원한다면 최종 커밋 메시지를 편집하고, 다시 저장하고 종료합니다.

스쿼시된 기능을 main에 다시 병합하기

git checkout main
git merge --no-ff feature-dashboard   # fast‑forward가 가능해도 병합 커밋을 생성합니다

요약

개념일반적인 명령사용 시점
브랜치 생성git checkout -b <branch>격리된 작업을 시작할 때
Fast‑forward 병합git merge <branch> (히스토리가 분기되지 않았을 때)단순한 선형 통합
3‑way 병합git merge <branch> (히스토리가 분기되었을 때)병렬 작업을 결합할 때
충돌 해결충돌 파일 편집 → git add <file>git commitGit이 자동으로 병합하지 못할 때
커밋 스쿼시git rebase -i HEAD~Nsquash병합 전 잡다한 히스토리를 정리하고 싶을 때
원격에 푸시git push origin <branch>GitHub, GitLab 등 원격 저장소에 작업을 공유할 때

이제 브랜치를 만들고, (fast‑forward, 3‑way, 스쿼시) 병합을 수행하며, 충돌을 처리하고, 프로젝트를 원격 저장소에 푸시하기 위한 전체 단계별 가이드를 갖추었습니다. 즐거운 코딩 되세요!

22. 히스토리 보기

git log --oneline --graph --all

이 명령은 수행된 병합 유형을 시각적으로 검사하고 검증하여, 결과 커밋 히스토리가 의도된 통합 전략과 일치하도록 합니다.

GitHub에 푸시 – 파트 6

23. GitHub에 저장소 만들기

원격 저장소는 푸시 작업을 수행하기 전에 생성되고 접근 가능해야 합니다. Git은 로컬 커밋을 받아 저장할 유효한 원격 엔드포인트가 필요하기 때문입니다.

Do NOT 체크: Add README, Add .gitignore

24. 로컬을 GitHub에 연결하기

git remote add origin https://github.com/YOUR_USERNAME/git-merge-lab.git

이 명령은 원격 엔드포인트를 정의하여, 로컬 커밋과 브랜치를 전송할 대상 저장소를 Git에 알려줍니다.

25. 모든 브랜치 푸시

git push -u origin --all

마무리 메모

브랜칭, 머징, 스쿼싱은 효율적인 Git 워크플로우의 핵심을 이룹니다.

  • 브랜칭은 안전한 실험을 가능하게 합니다.
  • 머징은 작업을 통합합니다.
  • 스쿼싱은 히스토리를 읽기 쉽게 유지합니다.

각 기술을 언제, 어떻게 사용할지 숙달하면 엔지니어링 팀이 협업을 확장하면서도 안정적이고 유지보수 가능한 코드베이스를 유지할 수 있습니다. 자동화, 빠른 릴리즈, 분산 팀이 일반적인 현대 DevOps 환경에서는 이러한 실천이 고품질 소프트웨어 전달의 기반이 됩니다.

0 조회
Back to Blog

관련 글

더 보기 »

Conductor 업데이트: 자동 리뷰 도입

2026년 2월 13일 — 12월에 우리는 Conductor https://github.com/gemini-cli-extensions/conductor 를 소개했습니다. 이는 Gemini CLI용 확장으로, 컨텍스트를 제공하도록 설계되었습니다.