공공부하자개발 · 영어 학습 노트
협업·배포
Git버전 관리와 협업0/8 완료
  • 01저장소와 커밋
  • 02브랜치와 병합
  • 03되돌리기
  • 04원격 저장소
  • 05히스토리 정리
  • 06태그와 버전
  • 07협업 규칙
  • 08문제 해결
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › Git › 02 / 8

브랜치와 병합

섹션 7진행 0 / 8
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

2. 핵심 원리

2.1 브랜치는 커밋을 가리키는 포인터

text
HEAD --> main --> C2(README 추가) --> C1(app.txt 추가)

브랜치는 커밋 하나를 가리키는 이름표일 뿐입니다. 새 커밋을 만들면 지금 브랜치의 포인터만 그 커밋으로 옮겨갑니다. 커밋 자체는 그대로 있고 화살표만 움직인다고 생각하면 됩니다.

2.2 HEAD 의 역할

HEAD 는 지금 작업 중인 브랜치를 가리키는 포인터입니다. git switch feature 를 하면 HEAD 가 main 대신 feature 를 가리키도록 바뀝니다. 작업 트리(working tree)의 파일 내용도 그 브랜치가 가리키는 커밋 상태로 바뀝니다.

2.3 git branch 로 브랜치 보기

명령 뜻
git branch 로컬 브랜치 목록, * 가 현재 위치
git branch -v 목록과 각 브랜치의 마지막 커밋
git branch -a 로컬과 원격(remote) 브랜치 전부
git branch -r 원격 브랜치만

원격이 없는 저장소에서는 -a 결과가 git branch 와 같습니다. 원격 저장소를 등록한 뒤에야 remotes/origin/main 같은 항목이 추가로 보입니다.

2.4 git branch 로 만들고 정리하기

명령 뜻
git branch 이름 새 브랜치 생성, 이동은 안 함
git branch -m 옛이름 새이름 브랜치 이름 변경
git branch -d 이름 병합된 브랜치만 삭제
git branch -D 이름 병합 여부 상관없이 강제 삭제

-d 는 브랜치의 커밋이 지금 브랜치에 이미 들어가 있는지 확인합니다. 안 들어가 있으면 거부하고 -D 로 다시 하라는 안내를 보여줍니다. 실수로 작업을 날리는 것을 막는 안전장치입니다.

2.5 git switch 로 브랜치 이동하기

git switch feature/login 은 있는 브랜치로 이동하고, git switch -c feature/login 은 새로 만들면서 바로 이동합니다. git switch 는 2.23 버전부터 생긴 명령으로 브랜치 전환만 맡습니다.

옛날에는 git checkout -b feature/login 을 썼는데, checkout 은 브랜치 전환과 파일 복원(restore)을 한 명령에 섞어 실수가 잦았습니다. 지금은 전환은 switch, 파일 복원은 restore 로 역할이 나뉩니다.

2.6 fast-forward 병합

text
병합 전: main --> C1 --> C2
              feature --> C1 --> C2 --> C3
병합 후: main --> C1 --> C2 --> C3

feature 가 main 에서 갈라진 뒤 main 에 새 커밋이 없으면, 병합은 그냥 main 포인터를 feature 의 마지막 커밋으로 옮기는 것으로 끝납니다. 새 커밋이 생기지 않아 히스토리가 한 줄 그대로입니다.

2.7 3-way 병합과 병합 커밋

text
main    --> C1 --> C2 --------> M(병합 커밋)
                     \          /
feature              --> C3 --

main 에도 feature 에도 각자 새 커밋이 있으면 fast-forward 가 안 됩니다. git 은 두 브랜치의 공통 조상(common ancestor)과 두 끝점, 셋을 비교해 병합 커밋을 만듭니다. 이 병합 커밋은 부모가 둘입니다.

2.8 --no-ff 로 병합 기록 남기기

fast-forward 가 가능한 상황이라도 git merge --no-ff -m "메시지" feature/report 처럼 --no-ff 를 주면 강제로 병합 커밋을 만듭니다. "이 기능이 언제 어떤 브랜치에서 들어왔는지" 가 로그에 남아, 나중에 기능 단위로 되돌리거나 추적하기 쉽습니다.

2.9 --ff-only 로 실수 막기

git merge --ff-only feature/login 은 fast-forward 가 불가능하면 병합을 아예 거부합니다. 자동화 스크립트에서 뜻하지 않은 병합 커밋이 생기는 것을 막을 때 씁니다. 조건이 안 맞으면 오류만 내고 아무 일도 하지 않습니다.

2.10 충돌이 나는 조건과 표시 읽기

두 브랜치가 같은 파일의 같은 줄을 각자 다르게 고쳤을 때만 충돌이 납니다. 서로 다른 파일이나 같은 파일의 다른 줄이면 git 이 알아서 합칩니다.

text
<<<<<<< HEAD
version: 2.0
=======
version: 3.0
>>>>>>> fix/version-b

<<<<<<< HEAD 부터 ======= 까지가 지금 브랜치(HEAD)의 내용이고, ======= 부터 >>>>>>> 브랜치이름 까지가 합치려는 브랜치의 내용입니다. 둘 중 하나를 고르거나 둘을 합쳐 새로 씁니다.

2.11 충돌 해결 순서

  1. git status 나 git diff --name-only --diff-filter=U 로 충돌 파일을 찾습니다.
  2. 파일을 열어 <<<<<<<·=======·>>>>>>> 마커를 지우고 원하는 내용으로 정리합니다.
  3. git add 파일 로 스테이징(index)에 올립니다.
  4. git commit 으로 병합을 마칩니다. 메시지는 git 이 기본값을 만들어 둡니다.

마음이 바뀌면 커밋 전에는 언제든 git merge --abort 로 병합 시작 전 상태로 되돌릴 수 있습니다. add 나 commit 을 이미 했다면 abort 대신 되돌리기 명령이 필요한데, 이는 다음 레슨에서 다룹니다.

2.12 병합 후 정리와 이름 규칙

명령 뜻
git branch --merged 지금 브랜치에 이미 들어간 브랜치
git branch --no-merged 아직 안 들어간 브랜치
git log --oneline --graph --all 전체 브랜치 구조를 그림으로

작업 브랜치 이름은 feature/설명, fix/설명, hotfix/설명 처럼 접두사로 성격을 구분합니다. 오래 살아남는 브랜치일수록 main 과 내용이 멀어져 충돌이 커지므로, 작업이 끝나면 바로 병합하고 지웁니다. 작업 중 변경 사항이 있으면 git switch 가 막히는데, 이때 임시로 치워 두는 git stash 는 다음 레슨에서 다룹니다.

핵심 원리
  • 2.1 브랜치는 커밋을 가리키는 포인터
  • 2.2 HEAD 의 역할
  • 2.3 git branch 로 브랜치 보기
  • 2.4 git branch 로 만들고 정리하기
  • 2.5 git switch 로 브랜치 이동하기
  • 2.6 fast-forward 병합
  • 2.7 3-way 병합과 병합 커밋
  • 2.8 --no-ff 로 병합 기록 남기기
  • 2.9 --ff-only 로 실수 막기
  • 2.10 충돌이 나는 조건과 표시 읽기
  • 2.11 충돌 해결 순서
  • 2.12 병합 후 정리와 이름 규칙
이전 섹션1 왜 배우는가2 / 7다음 섹션3 코드 예제