# git branch

> 브랜치 목록을 보고 이름을 바꾸거나 병합이 끝난 브랜치를 지운다.

## 용도

브랜치를 나열하고 정리한다. 현재 브랜치에는 `*`가 붙는다. 새 브랜치를 만들어 이동하는 일은 `git switch -c`가 맡고, `git branch`는 이름 변경과 병합이 끝난 브랜치 삭제에 쓴다.

## 자주 쓰는 옵션

| 옵션 | 의미 | 기본 동작 |
| --- | --- | --- |
| (없음) | 로컬 브랜치 목록 출력 | 현재 브랜치에 `*` |
| `-m main` | 현재 브랜치 이름 변경 | 같은 이름이 있으면 거절 |
| `-M main` | 현재 브랜치 이름 강제 변경 | 같은 이름이 있어도 덮어쓸 수 있음 |
| `-d 이름` | 병합이 끝난 브랜치 삭제 | 병합 전이면 `not fully merged`로 거절 |
| `-D 이름` | 병합 여부와 관계없이 강제 삭제 | 수업에서 쓰지 않는다 |

## 예시

```bash
git branch
git branch -M main
git branch -d feature/profile-design
```

세 번째 줄은 STEP 11에서 병합을 마친 뒤에만 성공한다. 병합 전에는 Git이 삭제를 거절한다.

## 주의할 점

- 이름 변경은 커밋 내용과 원격 브랜치를 바꾸지 않는다. 이미 `main`이 있는지 확인한 뒤 변경한다.
- `-d`가 거절되면 아직 병합되지 않은 커밋이 있다는 뜻이다. `-D`로 강제하지 말고 병합을 먼저 끝낸다.
- 브랜치 이름에는 `feature/`, `fix/`처럼 목적을 붙이고 공백을 쓰지 않는다.
- 원격의 같은 이름 브랜치는 로컬 삭제로 지워지지 않는다. GitHub 웹에서 Pull Request 병합 뒤 삭제한다.

- [원격 저장소와 동기화](https://echo.qus0in.dev/git/05-remote.md)
- [브랜치와 태그](https://echo.qus0in.dev/git/10-branches-tags.md)
- [병합과 충돌 해결](https://echo.qus0in.dev/git/11-merge-conflicts.md)
- [풀 리퀘스트와 협업](https://echo.qus0in.dev/git/12-pull-request.md)
- [명령과 옵션 일람](https://echo.qus0in.dev/git/appendix/02-git-options.md)
