Menu

Git 명령어 완벽 가이드:
Merge vs Rebase부터 충돌 해결까지 🍎

깔끔한 책상 위 맥북 화면에 띄워진 Git 터미널과 미니멀한 코드 에디터 디자인 요소

git add, commit, push... 기본적인 명령어는 이제 익숙하신가요? 그렇다면 이제 "초보 딱지"를 뗄 시간입니다. 실무에서 협업하다 보면 브랜치가 복잡하게 얽히고, 끔찍한 충돌(Conflict)이 발생하며, 때로는 코드를 통째로 되돌려야 하는 위기가 찾아옵니다. 오늘은 애플 스타일의 직관적인 UI와 함께, 실무에서 반드시 쓰이는 Git 고급 기술들을 우아하게 파헤쳐 보겠습니다. 🚀

1. 실무 워크플로우: Git Flow vs GitHub Flow

코드를 어떻게 합치고 배포할 것인가? 팀의 규모와 제품의 특성에 따라 브랜치를 관리하는 전략이 달라집니다.

🏢 Git Flow (전통적, 복잡함)

대규모 엔터프라이즈 환경이나 뚜렷한 배포 주기가 있는 프로젝트에 적합합니다.

  • main: 출시 가능한 상태
  • develop: 다음 출시를 위해 개발 중인 상태
  • feature: 기능 개발 (develop에서 분기)
  • release: 배포 전 QA (버그 픽스)
  • hotfix: 운영 서버 긴급 버그 수정

🚀 GitHub Flow (현대적, 애자일)

CI/CD가 잘 구축된 스타트업이나 하루에도 여러 번 배포가 일어나는 웹 서비스에 적합합니다.

  • main: 항상 배포 가능한 상태!
  • feature: main에서 브랜치를 따서 기능 개발. 완료되면 PR(Pull Request)을 거쳐 바로 main에 병합 후 배포.
  • 복잡한 develop, release 브랜치가 없습니다.
"Rebase는 역사를 다시 쓰는 강력한 마법입니다. 하지만 남들과 공유하는 브랜치에서는 절대 이 마법을 남발해선 안 됩니다." – 시니어 데브옵스 엔지니어

2. 영원한 난제: Merge vs Rebase 비교

두 브랜치를 합치는 방법에는 두 가지가 있습니다. 결과를 만들어내는 방식이 완전히 다릅니다.

🔀 git merge : "역사를 있는 그대로 보존"

두 브랜치의 변경 이력을 합치며 새로운 'Merge Commit'을 생성합니다. 과거의 모든 분기 기록이 족보처럼 남습니다.

# main 브랜치로 이동
git switch main

# feature 브랜치를 main으로 병합 (합성 커밋 생성)
git merge feature-branch

✂️ git rebase : "역사를 일직선으로 깔끔하게"

내 브랜치의 시작점(Base)을 대상 브랜치의 최신 커밋으로 옮깁니다(Re-base). Merge Commit이 남지 않아 히스토리가 한 줄로 깔끔해집니다.

# 작업 중인 feature 브랜치에서 실행
git switch feature-branch

# 내 브랜치의 뼈대를 main의 최신 상태로 재배치
git rebase main

# 주의: 이미 Push한 브랜치에서 rebase를 하면 히스토리가 꼬입니다!

3. 패닉 금지! Merge Conflict(충돌) 해결하기

같은 파일의 같은 라인을 두 명의 개발자가 수정했을 때 발생하는 것이 충돌(Conflict)입니다. 두려워하지 마세요, 해결하는 공식이 있습니다.

🚨 충돌 해결 4단계 프로세스

# 1. 상태 확인: 빨간색으로 'both modified'라고 뜬 파일을 찾습니다.
git status

# 2. 코드 에디터(VS Code 등)를 열어 충돌 파일 수정
# <<<<<<< HEAD (현재 내 코드) 부터 ====== 를 거쳐 >>>>>>> (가져온 코드) 중
# 남길 코드만 두고 지시자(<<<, ===, >>>)를 모두 지웁니다.

# 3. 수정한 파일을 다시 스테이지에 올립니다.
git add 수정한_파일.js

# 4. 병합(Merge) 또는 Rebase를 계속 진행합니다.
git commit -m "fix: 충돌 해결" # Merge 중일 때
git rebase --continue # Rebase 중일 때

# 🔥 너무 꼬여서 포기하고 싶을 때 (병합 취소하기)
git merge --abort

4. 목숨을 구하는 마법의 고급 명령어들

코드를 날려 먹었거나, 남의 브랜치에서 커밋 하나만 훔쳐(?) 오고 싶을 때 사용하는 고급 스킬들입니다.

  • 🍒 체리픽 (Cherry-pick): 다른 브랜치에 있는 특정 커밋 하나만 내 브랜치로 가져옵니다.
    git cherry-pick <commit-hash>
  • 📦 스태시 (Stash): 하던 작업을 임시 보관소에 숨기고 빈 상태로 만듭니다. 급하게 브랜치를 변경해야 할 때 씁니다.
    git stash (보관) ➔ git stash pop (꺼내기)
  • ✏️ 어멘드 (Amend): 방금 친 커밋 메시지에 오타가 났거나, 파일을 하나 빼먹었을 때 최신 커밋을 수정합니다.
    git commit --amend
  • 🚑 리플로그 (Reflog): 궁극의 타임머신. git reset으로 날려버린 커밋조차 찾을 수 있는 Git의 모든 행동 기록부입니다.
    git reflog (기록 해시 확인) ➔ git reset --hard <hash>

마무리: 핵심 요약표

상황 / 목적 명령어 비고
히스토리 보존 병합 git merge <branch> Merge Commit 발생
일직선 깔끔한 병합 git rebase <branch> 원격 브랜치에는 사용 금지
충돌 병합 취소 git merge --abort 병합 이전 상태로 복구
작업 임시 저장 git stash Staging되지 않은 변경사항 숨김
모든 조작 기록 보기 git reflog 실수 복구의 마지막 희망
공유하기:
Home Search Share Link