CLI 환경에서 브랜치 생성 및 조작

김우진·2026년 2월 28일

Git & GitHub

목록 보기
2/3
post-thumbnail

CLI 환경에서 브랜치 생성 및 조작


브랜치를 사용하는 경우

  • 새로운 기능 추가 (브랜치를 생성해서 기능 추가 후 main 브랜치로 병합)
  • 버그 수정 (브랜치를 생성해서 버그 수정 후 main 브랜치로 병합)
  • 병합과 리베이스 테스트
  • 이전 코드 개선
  • 특정 커밋으로 돌아가고 싶을 때

💡 현재 연결된 원격 저장소 확인: git remote -v


브랜치 만들기

git branch                        # 현재 브랜치 확인
git branch <생성할 브랜치 이름>     # 새로운 브랜치 생성
git log --oneline --graph --all --decorate  # 변경된 브랜치 확인

💡 HEAD는 현재 작업 중인 브랜치를 가리킨다.


switch : 브랜치 변경하기

[main] 브랜치에서 [mybranch1] 브랜치로 변경하고 새로운 커밋 생성 후 결과 확인

git switch <브랜치 이름>           # 브랜치 변경
git branch                        # 현재 브랜치 확인
git log --oneline --graph --all --decorate  # HEAD 변경 확인

# 파일 수정 후
git status                        # 스테이지 상태 확인
git add .                         # 스테이지에 변경 사항 추가
git commit -m "<message>"         # 커밋
git log --oneline --graph --all --decorate  # 변경된 브랜치 확인

fast-forward merge : 빨리 감기 병합

mainmybranch1 병합하기

git switch main          # main 브랜치로 변경
git merge mybranch1      # 빨리 감기 병합
git log --oneline --graph --all --decorate  # 확인

reset --hard : 브랜치 되돌리기

현재 브랜치를 지정한 커밋으로 옮긴다. 작업 폴더의 내용도 함께 변경된다.

git reset --hard <이동할 커밋 체크섬>

체크섬 대신 아래 약칭 사용 가능:

약칭의미
HEAD~HEAD의 부모 커밋
HEAD~2HEAD의 할아버지 커밋
HEAD^HEAD의 부모 커밋
HEAD^2HEAD의 두 번째 부모 커밋 (부모가 둘 이상일 때 사용)
git reset --hard HEAD~2                     # 두 단계 이전으로 되돌리기
git log --oneline --graph --all --decorate  # 로그 확인

rebase : 리베이스

구분설명
merge병합 (줄기를 그대로 유지)
rebase재배치 (내 브랜치의 시작점을 대상 브랜치의 최신 커밋에 옮겨 붙임 → 일직선 히스토리)

리베이스 원리:
1. HEAD와 대상 브랜치의 공통 조상을 찾는다.
2. 공통 조상 이후에 생성한 커밋들을 대상 브랜치 뒤로 재배치한다.

⚠️ 주의: 이미 원격 저장소(GitHub)에 푸시한 브랜치는 절대 Rebase 하지 말 것!


tag : 배포 버전에 태그 달기

git tag -a -m "첫 번째 태그 생성" v0.1        # 주석 있는 태그 작성
git log --oneline --graph --all --decorate    # 태그 생성 확인
git push origin v0.1                          # 태그 푸시

3-way 병합

긴급 버그 처리 시나리오

  1. (옵션) 오류가 없는 버전(주로 Tag가 있는 커밋)으로 롤백
  2. [main] 브랜치로부터 [hotfix] 브랜치 생성
  3. 빠르게 소스코드 수정 및 테스트 완료
  4. [main] 브랜치로 빨리 감기 병합 및 배포
  5. 개발 중인 브랜치에도 병합 (단, 충돌 발생 가능성 높음)

새로운 브랜치 및 커밋 생성 (기능 개발)

git switch main                  # main 브랜치로 변경
git switch -c feature1           # feature1 브랜치 생성 및 변경

# 파일 수정 후
git add .
git commit -m "<message>"
git log --oneline --graph --all --decorate

hotfix 브랜치 생성 및 main에 병합

git switch -c hotfix main        # main에서 hotfix 브랜치 생성 후 변경

# 버그 파일 수정 후
git add .
git commit -m "<message>"
git log --oneline --graph --all --decorate
* db531ae (HEAD -> hotfix) test3 버그수정
| * dc53cc3 (feature1) test3
|/
* 3ab375f (tag: v0.1, origin/main, origin/HEAD, main) test2
* 96abff0 test
* 73850bd 코딩테스트 기록 시작
git switch main
git merge hotfix     # 빨리 감기 병합
* db531ae (HEAD -> main, hotfix) test3 버그수정
| * dc53cc3 (feature1) test3
|/
* 3ab375f (tag: v0.1, origin/main, origin/HEAD) test2
* 96abff0 test
* 73850bd 코딩테스트 기록 시작

hotfix 커밋(버그 수정)은 현재 개발 중인 [feature1] 브랜치에도 반영해야 한다.
[feature1][main]은 서로 다른 분기이므로 3-way 병합을 수행한다.

병합 및 충돌 해결

git switch feature1    # feature1 브랜치로 변경
git merge main         # main 브랜치와 병합 시도 → 충돌 발생
Auto-merging src/programmers/test3.java
CONFLICT (add/add): Merge conflict in src/programmers/test3.java
Automatic merge failed; fix conflicts and then commit the result.
git status             # 충돌 파일 확인 (both added: ...)

충돌 파일을 직접 열어 수동으로 수정한 뒤:

cat <파일>             # 최종 변경 내용 확인
git add .
git status             # modified: src/programmers/test3.java
git commit             # 병합 커밋 생성
git log --oneline --graph --all --decorate
*   997db09 (HEAD -> feature1) 병합
|\
| * db531ae (origin/main, origin/HEAD, main, hotfix) test3 버그수정
* | dc53cc3 test3
|/
* 3ab375f (tag: v0.1) test2
* 96abff0 test
* 73850bd 코딩테스트 기록 시작

3-way 병합은 병합 커밋이 생성되어 트리가 복잡해진다. 히스토리를 깔끔하게 유지하고 싶다면 리베이스를 사용한다.

0개의 댓글