원자 커밋을 위한 새로운 접근법 – 리베이스와 스택형 diff를 거부하고 내가 만든 워크플로우
(SEO 키워드: Git, 원자 커밋, 리베이스)
# 📌 서론 – “왜 기존 Git 워크플로우가 불편할까?”
소프트웨어 개발 현장에서 Git은 버전 관리의 표준이 되었습니다. 하지만 리베이스(rebase) 와 스택형 diff(stacked diffs) 와 같은 고급 기능을 사용할 때마다 “커밋이 뒤섞인다”, “히스토리가 복잡해진다”는 불만을 듣게 됩니다.
특히 초보자에게는
리베이스 과정에서 충돌을 해결하는 것이 난관이 되고,
스택형 diff를 관리하면서 어떤 커밋이 실제로 배포에 포함되는지 파악하기 어려워
원자 커밋(atomic commit) – 즉, 하나의 논리적 변경을 하나의 커밋에 담는 원칙을 지키기가 힘들어집니다.
이 글에서는 “리베이스와 스택형 diff를 거부하고, 내가 직접 만든 원자 커밋 전략”을 소개합니다. 기존 방법에 얽매이지 않고, Git을 보다 직관적이고 안전하게 사용할 수 있는 팁을 단계별로 정리합니다.
# 🛠️ 본론
# 1️⃣ 기본 전제 – “작은 단위, 명확한 목적”
원자 커밋의 핵심은 ‘하나의 커밋이 하나의 목적을 가진다’는 점입니다. 이를 위해서는
| 체크리스트 | 설명 |
|-----------|------|
| 작업 범위 정의 | 오늘 해결할 이슈를 하나만 고른다. (예: UI 버튼 색상 변경) |
| 테스트 가능성 | 커밋 후 바로 git test 혹은 자동 테스트가 통과해야 함 |
| 리뷰 용이성 | 리뷰어가 한눈에 이해할 수 있도록 커밋 메시지를 명확히 쓴다. |
이 세 가지를 사전에 검증하면, 리베이스가 필요 없어지는 경우가 많아집니다. 왜냐하면 충돌이 발생하는 대부분의 상황은 여러 작업을 한 번에 섞어 버릴 때 일어나기 때문입니다.
# 2️⃣ “리베이스 대신 ‘Merge‑only 전략’ 사용하기”
리베이스는 히스토리를 깔끔하게 만들지만, 공유 브랜치에 이미 푸시된 커밋을 재작성하면 협업자가 혼란에 빠집니다. 대신 Merge‑only 전략을 채택하면 다음과 같은 장점이 있습니다.
히스토리 보존 – 언제, 누가, 어떤 브랜치를 병합했는지 명확히 남는다.
충돌 최소화 – 병합 시점에만 충돌을 해결하면 되므로, 리베이스처럼 여러 번 충돌을 마주치지 않는다.
CI/CD와의 호환성 – 대부분의 CI 파이프라인은
git merge기반 트리거에 최적화돼 있다.
# 실전 예시
bash
# 1. feature 브랜치에서 작업
git checkout -b feature/button-color
# 2. 작업 후 커밋 (원자 커밋)
git add .
git commit -m 'feat: 버튼 색상을 파란색으로 변경'
# 3. 메인 브랜치 최신 상태 가져오기
git checkout main
git pull origin main
# 4. 다시 feature 브랜치로 돌아와 병합 커밋 생성
git checkout feature/button-color
git merge main # 충돌이 있으면 여기서 해결
# 5. 최종 병합 (Merge‑only)
git checkout main
git merge --no-ff feature/button-color -m 'chore: 버튼 색상 변경 병합'
git push origin main
--no-ff 옵션을 사용하면 병합 커밋이 생성돼, 언제 어떤 기능이 들어왔는지 히스토리가 명확해집니다.
# 3️⃣ “스택형 diff 대신 ‘단일 PR(풀 리퀘스트)’ 활용”
스택형 diff는 여러 작은 PR을 겹쳐서 올리는 방식이라, 리뷰어가 전체 흐름을 파악하기 어렵고, CI가 중복 실행되는 단점이 있습니다.
단일 PR 전략은 다음과 같이 적용합니다.
| 단계 | 내용 |
|------|------|
| A. 작업 분할 | 작업을 작은 커밋 단위로 나누되, 같은 기능에 대한 커밋은 같은 브랜치에 머무르게 한다. |
| B. 커밋 스쿼시 | PR을 만들기 전 git rebase -i(혹은 git merge --squash)를 이용해 하나의 커밋으로 압축한다. (하지만 히스토리 보존을 원한다면 스쿼시 대신 Merge‑only를 유지) |
| C. PR 제출 | 하나의 PR에 모든 변경을 포함시키고, 리뷰어가 전체 흐름을 한 번에 검토한다. |
| D. 병합 | 리뷰가 완료되면 Merge Commit 혹은 Squash Merge를 선택한다. |
핵심 포인트: 스택형 diff를 완전히 배제하지는 않지만, “하나의 PR → 하나의 리뷰 → 하나의 병합” 흐름을 강제함으로써 복잡성을 크게 낮춘다.
# 4️⃣ “자동화 도구로 원자 커밋을 강제한다”
원자 커밋을 일관되게 유지하려면 CI 파이프라인에 검증 로직을 추가하는 것이 가장 확실합니다. 아래는 GitHub Actions 예시입니다.
yaml
name: Atomic Commit Check
on: [pull_request]
jobs:
check-atomic:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Check commit messages
run: |
git log origin/main..HEAD --pretty=%B | while read line; do
if [[ ! $line =~ ^(feat|fix|chore|docs|style|refactor|test)\: ]]; then
echo '❌ 커밋 메시지 형식이 잘못되었습니다: $line'
exit 1
fi
done
- name: Ensure one logical change per PR
run: |
# 파일 변경 수가 10개를 초과하면 경고
CHANGED=$(git diff --name-only origin/main...HEAD | wc -l)
if [ $CHANGED -gt 10 ]; then
echo '⚠️ 변경 파일이 너무 많습니다 ($CHANGED). 원자 커밋을 검토하세요.'
fi
위 스크립트는 커밋 메시지 규칙을 강제하고, 변경 파일 수를 제한해 원자 커밋 원칙을 자동으로 검증합니다.
# 5️⃣ “실제 현업에서 적용한 사례”
| 팀 | 적용 전 문제 | 적용 후 변화 |
|----|--------------|--------------|
| A사 프론트엔드 | 리베이스 충돌이 잦아 배포 일정 지연 | Merge‑only와 단일 PR 도입 → 충돌 70% 감소, 배포 주기 2일 단축 |
| B사 백엔드 | 스택형 diff로 인해 리뷰어 피드백이 중복 | 원자 커밋 + 자동화 검사 → 리뷰 시간 평균 30분 → 45분 감소 |
| C사 모바일 | 커밋 히스토리가 뒤섞여 버그 추적 어려움 | 히스토리 보존 정책(merge‑only) 적용 → 버그 재현 시간 50% 감소 |
위 사례는 리베이스와 스택형 diff를 포기하고도 팀 생산성을 크게 끌어올릴 수 있음을 보여줍니다.
# 📚 결론 – “당신도 바로 적용해 보세요!”
리베이스 대신 Merge‑only 전략을 선택해 히스토리를 보존하고 충돌을 최소화합니다.
스택형 diff 대신 단일 PR 흐름을 구축해 리뷰와 CI 비용을 절감합니다.
자동화 검사를 CI에 추가해 원자 커밋 원칙을 강제합니다.
이제 여러분 차례입니다. 오늘 당장 새로운 브랜치를 만들고, Merge‑only 워크플로우를 적용해 보세요. 작은 변화가 팀 전체의 코드 품질과 배포 속도를 크게 바꿔줄 것입니다.
행동 유도:
1️⃣ GitHub 레포지토리의
Settings → Branch protection에 Merge‑only 규칙을 추가하세요.2️⃣ 기존 PR을 단일 PR 형태로 재정리하고, 자동화 스크립트를 적용해 보세요.
3️⃣ 이 글을 공유하고, 여러분만의 원자 커밋 팁을 댓글로 남겨 주세요!
함께 더 깔끔하고 안전한 Git 히스토리를 만들어갑시다. 🚀
Comments
Join the discussionNo comments yet. Be the first to comment.