브랜치 실습 예시
브랜치를 만들고 작업하고 병합하는 흐름을 시나리오로 익히는 가이드 | ← 매뉴얼로 돌아가기
my-site 폴더에서 main 브랜치에 있습니다. 새 '문의하기' 기능을 추가하려는데, main은 안정적으로 두고 따로 작업 공간을 만들고 싶습니다. 작업 대상은 이 폴더의 main 브랜치입니다.
- 지금 내가 어느 브랜치인지 확인
git branch목록에서*표시가 현재 브랜치입니다. main인지 봅니다. - 새 기능 브랜치를 만들면서 바로 이동
git switch -c는 브랜치를 생성하고 그 자리로 옮겨 줍니다. - 새 브랜치에서 작업하고 커밋
여기서 한 변경은 main에 영향을 주지 않습니다.
git branch # 현재 브랜치 확인(* 표시) git switch -c feature/contact # 브랜치 생성 + 이동을 한 번에 # ... contact.html 작성 ... git add contact.html git commit -m "문의하기 페이지 추가"
git switch -c feature/contact는 git branch feature/contact(생성만)와 git switch feature/contact(이동)를 한 번에 합친 것입니다. 이제부터의 커밋은 main이 아니라 feature/contact 위에 쌓입니다.feature/contact처럼 '용도/내용' 형태로 지으면 한눈에 무슨 작업인지 알 수 있습니다. 처음엔 git switch -c 하나만 외워도 충분합니다.feature/contact 브랜치에서 '문의하기' 작업을 끝내고 커밋까지 마쳤습니다. 그동안 main에는 다른 변경이 없었습니다. 이제 이 결과를 main에 합치려 합니다.
- 합칠 대상인 main으로 먼저 이동
병합은 '현재 브랜치'로 다른 브랜치를 끌어옵니다. main으로 가야 main에 합쳐집니다.
- feature 브랜치를 병합
main이 갈라진 뒤 변하지 않았으므로 포인터만 앞으로 이동하는 Fast-forward가 일어납니다.
- 역할이 끝난 브랜치 삭제
병합된 브랜치는
-d로 안전하게 지웁니다.
git switch main # 합칠 대상으로 이동 git merge feature/contact # main이 안 변했으면 Fast-forward git branch -d feature/contact # 병합 끝난 브랜치 정리
main에서 git switch -c feature/x → 작업·커밋 → git switch main → git merge feature/x → git branch -d feature/x. 이 한 줄 흐름만 몸에 익혀도 대부분의 작업을 처리할 수 있습니다.experiment/new-layout 브랜치에서 새 레이아웃을 시도해 봤는데 마음에 들지 않습니다. 이 실험은 main에 합치지 않고 통째로 버리려 합니다. 현재 이 실험 브랜치에 있습니다.
- 버릴 브랜치에서 빠져나오기
지금 서 있는 브랜치는 삭제할 수 없으니 먼저 main으로 옮깁니다.
- 실험 브랜치를 강제 삭제
main에 병합하지 않았으므로 안전 삭제(
-d)는 거부됩니다. 버릴 결심이 섰으면-D로 강제 삭제합니다. - 목록에서 사라졌는지 확인
git switch main # 버릴 브랜치에서 나오기 git branch -D experiment/new-layout # 병합 안 됐어도 강제 삭제 git branch # 목록에서 사라졌는지 확인
-D(대문자)는 병합되지 않은 커밋까지 함께 버립니다. 정말 필요 없는 실험일 때만 사용하세요. 합치고 싶은 마음이 조금이라도 있으면 먼저 G-2처럼 병합부터 검토합니다.feature/header에서 index.html의 제목 줄을 고쳤는데, 그동안 main에서도 같은 줄을 다르게 고쳤습니다. main으로 옮겨 병합하니 충돌이 났습니다. 현재 main 브랜치에서 git merge feature/header를 막 실행한 상태입니다.
- 어떤 파일이 충돌했는지 확인
git status가 'both modified'로 충돌 파일을 알려 줍니다. - 파일을 열어 마커를 보고 직접 수정
<<<<<<</=======/>>>>>>>사이에서 원하는 코드만 남기고 마커 줄은 모두 지웁니다. - 해결한 파일을 add 해 '해결됨' 표시
- 커밋해서 병합을 마무리
이때 만들어지는 것이 병합 커밋입니다.
git status # both modified: index.html # index.html을 열어 아래 마커를 직접 정리한다 # <<<<<<< HEAD # (main 쪽 내용) # ======= # (feature/header 쪽 내용) # >>>>>>> feature/header git add index.html # 해결됨으로 표시 git commit # 병합 커밋 작성
<<<, ===, >>>)을 모두 지운 뒤 add → commit 하면 해결됩니다.git merge --abort로 병합 전 상태로 깨끗이 되돌릴 수 있습니다. 마음을 가다듬고 다시 시도하세요.feature/login으로 만들려다 오타로 feautre/login을 만들었습니다. 아직 이 브랜치엔 아무 작업도 안 했고, main에서 갈라지기만 한 상태입니다. 깔끔하게 지우고 제대로 다시 만들려 합니다.
- 현재 브랜치 목록을 확인
오타 브랜치가 있고, 지금 어디 서 있는지 봅니다.
- 지울 브랜치가 아닌 main으로 이동
현재 서 있는 브랜치는 지울 수 없습니다.
- 오타 브랜치 삭제 후 올바른 이름으로 재생성
작업이 없어 main에 병합된 상태와 같으므로 안전 삭제
-d가 가능합니다.
git branch # feautre/login 오타 확인 git switch main # 지울 브랜치에서 나오기 git branch -d feautre/login # 작업 없으니 -d로 안전 삭제 git switch -c feature/login # 올바른 이름으로 다시 생성+이동
-d로 깔끔히 지워집니다. 만약 -d가 거부하면 그 브랜치에 합치지 않은 커밋이 있다는 신호이니, 정말 버릴지 한 번 더 확인하세요.feature/payment에서 작업하던 중, main에서 급한 사항을 잠깐 확인해야 합니다. main에 다녀온 뒤 다시 작업하던 브랜치로 돌아오려 합니다. 긴 브랜치 이름을 매번 타이핑하기 번거롭습니다.
- main으로 잠깐 이동
확인할 것을 봅니다.
- 직전 브랜치로 한 번에 복귀
git switch -는 '방금 전에 있던 브랜치'로 되돌아갑니다.
git switch main # main에서 급한 것 확인 # ... 확인 끝 ... git switch - # 직전 브랜치(feature/payment)로 복귀
git switch -의 -는 '바로 직전에 있던 브랜치'를 가리키는 약식 표기입니다. 두 브랜치 사이를 자주 왕복할 때 switch -만 반복하면 이름을 칠 필요가 없습니다.feature/search와 feature/profile 두 기능을 나란히 진행 중입니다. main에는 그사이 다른 수정도 들어갔습니다. 두 기능을 차례로 main에 합치려 합니다. 현재 main 브랜치에 있고, 두 브랜치 모두 작업·커밋이 끝났습니다.
- 합칠 대상 main에 있는지 확인
git branch로 진행 중인 브랜치들과 현재 위치를 점검합니다. - 첫 기능을 병합 커밋을 남기며 합치기
main에도 진행이 있었으니 3-way 병합이 일어납니다.
--no-ff를 쓰면 '이 지점에서 기능을 합쳤다'는 병합 커밋이 항상 남아 이력에서 기능 단위가 또렷합니다. - 두 번째 기능도 같은 방식으로 병합
- 병합 끝난 브랜치들 정리
git branch # 진행 중 브랜치/현재 위치 확인 git switch main git merge --no-ff feature/search # 병합 커밋을 남기며 합침 git merge --no-ff feature/profile git branch -d feature/search feature/profile
--no-ff는 Fast-forward로 합칠 수 있는 경우에도 일부러 병합 커밋을 남겨, 나중에 이력만 봐도 어떤 기능이 언제 합쳐졌는지 알 수 있게 합니다.feature/signup 브랜치에 "wip", "오타", "다시 수정" 같은 자잘한 커밋이 여러 개 쌓였습니다. main 이력에는 이 과정을 다 남기지 않고, '회원가입 기능 구현' 한 줄로 깔끔하게 합치고 싶습니다. 현재 main 브랜치에 있습니다.
- 합칠 대상 main으로 이동
- 변경만 모아 오기(squash)
--squash는 feature의 모든 변경을 스테이징에 모아 줄 뿐, 커밋은 자동으로 만들지 않습니다. - 하나의 메시지로 직접 커밋
여러 잔커밋이 깔끔한 한 커밋으로 main에 남습니다.
- 역할이 끝난 브랜치 삭제
--squash는 병합 이력을 남기지 않으므로-d가 거부하면-D로 지웁니다.
git switch main git merge --squash feature/signup # 변경만 스테이징에 모음(커밋은 안 함) git commit -m "회원가입 기능 구현 (폼·검증·에러 처리)" git branch -d feature/signup # 거부되면 git branch -D feature/signup
--squash는 일반 병합과 달리 병합 커밋을 만들지도, feature의 개별 커밋을 가져오지도 않습니다. 변경 내용만 작업 폴더와 스테이징에 모아 주므로, 마지막에 직접 git commit을 해야 비로소 main에 한 커밋으로 기록됩니다.--squash로 합치면 main은 feature가 병합됐다는 사실을 모릅니다. 그래서 git branch -d가 "병합 안 됨"이라며 거부할 수 있는데, 이는 정상입니다. 변경을 이미 커밋했음을 확인했다면 -D로 지워도 안전합니다.
Git 2.54.0 기준 · 2026년 6월 13일 작성
← 브랜치 매뉴얼 |
GitHub 실습 →