
1편에서 기본 워크플로우와 히스토리 확인을 다뤘습니다. 2편에서는 브랜치, 원격 저장소 연동, 그리고 git에서 가장 헷갈리는 영역인 "되돌리기" 계열 명령어들을 정리합니다.
브랜치
브랜치는 독립적인 작업 흐름을 만들기 위한 것입니다. 기능 개발이나 버그 수정을 메인 브랜치와 분리해서 진행하다가, 완료되면 합치는 패턴이 기본입니다.
브랜치 확인 및 생성
git branch # 로컬 브랜치 목록
git branch -r # 원격 브랜치 목록
git branch -a # 로컬 + 원격 전체
git branch 브랜치명 # 브랜치 생성 (이동은 안 함)
git branch -d 브랜치명 # 브랜치 삭제 (병합된 것만)
git branch -D 브랜치명 # 브랜치 강제 삭제
git branch -m 새이름 # 현재 브랜치 이름 변경
브랜치 이동
예전에는 git checkout을 이동에도 쓰고 파일 복구에도 썼는데, git 2.23부터 역할이 분리됐습니다. 이동은 switch, 파일 복구는 restore로 나뉩니다. 둘 다 쓸 수 있지만 새 명령어가 의도가 더 명확합니다.
git switch 브랜치명 # 브랜치 이동
git switch -c 브랜치명 # 브랜치 생성 + 이동
git switch -c 브랜치명 origin/브랜치명 # 원격 브랜치 기반으로 생성 + 이동
git checkout 브랜치명 # 위와 같음 (구버전 방식)
git checkout -b 브랜치명 # 생성 + 이동 (구버전)
병합 (merge)
git merge 브랜치명 # 현재 브랜치에 대상 브랜치를 병합
git merge --no-ff 브랜치명 # Fast-forward 방지, 병합 커밋 항상 생성
git merge --squash 브랜치명 # 대상 브랜치 커밋을 하나로 합쳐서 스테이징
--no-ff는 히스토리에서 브랜치 흔적을 남길 때 씁니다. Fast-forward가 되면 마치 브랜치 없이 작업한 것처럼 히스토리가 직선으로 이어지는데, --no-ff를 쓰면 병합 커밋이 생겨서 어느 시점에 브랜치가 합쳐졌는지 남습니다.
충돌 해결
merge 중 같은 파일의 같은 부분을 두 브랜치가 다르게 수정했으면 충돌(conflict)이 납니다.
<<<<<<< HEAD
현재 브랜치의 내용
=======
병합하려는 브랜치의 내용
>>>>>>> feature/branch
충돌 표시를 직접 편집해서 원하는 내용으로 만든 뒤, git add하고 git commit하면 됩니다.
git merge --abort # 충돌 상황에서 merge 취소하고 원래 상태로
원격 저장소
원격 저장소 연결
git remote add origin URL # 원격 저장소 등록 (이름은 보통 origin)
git remote -v # 등록된 원격 저장소 확인
git remote remove origin # 원격 저장소 연결 제거
git remote set-url origin URL # URL 변경
push / pull / fetch
git push origin 브랜치명 # 원격에 푸시
git push -u origin 브랜치명 # 푸시 + 추적 브랜치 설정 (-u = --set-upstream)
git push # 추적 브랜치 설정 후 이후 push
git push origin --delete 브랜치명 # 원격 브랜치 삭제
git push --force-with-lease # 안전한 강제 푸시 (타인 변경사항 덮어쓰기 방지)
git fetch origin # 원격 변경사항 가져오기 (병합은 안 함)
git fetch --all # 모든 원격 저장소 fetch
git pull origin 브랜치명 # fetch + merge
git pull --rebase # fetch + rebase (히스토리 더 깔끔)
fetch와 pull의 차이는, fetch는 원격 변경사항을 로컬에 가져오기만 하고 현재 브랜치에는 영향을 주지 않습니다. pull은 가져온 뒤 바로 병합까지 합니다. 뭐가 바뀌었는지 먼저 확인하고 싶으면 fetch 후 git diff origin/main으로 보는 게 안전합니다.
--force-with-lease는 --force보다 안전합니다. 내가 마지막으로 fetch한 이후 다른 사람이 push한 게 있으면 강제 push를 막아줍니다.
되돌리기
git에서 가장 헷갈리는 부분입니다. 되돌리는 명령어가 restore, reset, revert 세 가지가 있고, 각각 역할이 다릅니다.
restore — 파일 단위 되돌리기
git restore 파일명 # Working Directory 변경사항 버리기
git restore . # 전체 Working Directory 되돌리기
git restore --staged 파일명 # Staging Area에서 내리기 (add 취소)
git restore --staged . # 전체 unstage
git restore --source HEAD~1 파일명 # 특정 커밋 시점의 파일로 복원
git restore는 커밋 히스토리는 건드리지 않습니다. 파일의 내용을 되돌리는 것입니다.
reset — 커밋 단위 되돌리기
git reset HEAD~1 # 직전 커밋 취소, 변경사항은 Working Directory에 유지
git reset --soft HEAD~1 # 직전 커밋 취소, 변경사항은 Staging Area에 유지
git reset --hard HEAD~1 # 직전 커밋 취소, 변경사항도 삭제 (주의)
git reset --hard HEAD # 마지막 커밋 상태로 완전 초기화
세 가지 옵션의 차이를 표로 정리하면 이렇습니다.
| 옵션 | 커밋 | Staging Area | Working Directory |
|---|---|---|---|
--soft |
되돌림 | 유지 | 유지 |
(기본) |
되돌림 | 초기화 | 유지 |
--hard |
되돌림 | 초기화 | 초기화 |
--hard는 Working Directory 변경사항까지 날아가기 때문에 신중하게 써야 합니다. push하지 않은 커밋에만 씁니다. push한 커밋을 reset하면 원격과 히스토리가 달라져서 강제 push가 필요해집니다.
revert — 커밋을 되돌리는 새 커밋 만들기
git revert HEAD # 직전 커밋을 되돌리는 커밋 생성
git revert 커밋해시 # 특정 커밋을 되돌리는 커밋 생성
git revert HEAD~2..HEAD # 범위 지정 revert
git revert --no-commit HEAD # 커밋 없이 변경사항만 스테이징
reset이 히스토리를 지우는 것이라면, revert는 되돌린다는 사실을 새 커밋으로 기록합니다. 이미 push한 커밋을 되돌려야 할 때, 협업 중일 때는 revert를 씁니다.
stash
작업 중인 내용을 임시로 저장해두고, 나중에 꺼내 쓸 수 있습니다. 브랜치를 바꿔야 하는데 아직 커밋하기 애매한 상황에서 자주 씁니다.
git stash # 현재 변경사항 임시 저장
git stash push -m "설명" # 메시지와 함께 저장
git stash list # stash 목록 확인
git stash pop # 가장 최근 stash 꺼내기 + 목록에서 삭제
git stash apply # 가장 최근 stash 꺼내기 (목록에는 유지)
git stash apply stash@{2} # 특정 stash 적용
git stash drop stash@{0} # 특정 stash 삭제
git stash clear # 전체 삭제
pop은 꺼내면서 stash 목록에서도 지우고, apply는 꺼내도 목록에 남습니다.
rebase
rebase는 커밋 히스토리를 재정렬합니다. merge와 결과는 같지만 히스토리 모양이 다릅니다.
git rebase main # 현재 브랜치의 시작점을 main의 최신으로 옮김
git rebase --abort # rebase 중 문제 생기면 취소
git rebase --continue # 충돌 해결 후 이어서 진행
interactive rebase
커밋 메시지 수정, 여러 커밋 합치기(squash), 순서 변경 등을 할 수 있습니다.
git rebase -i HEAD~3 # 최근 3개 커밋을 대화형으로 편집
에디터가 열리면 각 커밋 앞의 키워드를 바꿔서 동작을 지정합니다.
pick abc1234 커밋 메시지 1 ← 그대로 유지
squash def5678 커밋 메시지 2 ← 위 커밋에 합치기
reword ghi9012 커밋 메시지 3 ← 메시지만 수정
drop jkl3456 커밋 메시지 4 ← 이 커밋 삭제
마찬가지로 push하지 않은 커밋에만 쓰는 게 원칙입니다.
cherry-pick
다른 브랜치의 특정 커밋만 현재 브랜치에 가져옵니다.
git cherry-pick 커밋해시 # 특정 커밋만 가져오기
git cherry-pick 해시1..해시2 # 범위 지정
git cherry-pick --no-commit 해시 # 커밋은 안 하고 변경사항만 적용
브랜치 전체를 merge하기는 부담스럽고, 특정 버그 수정 커밋 하나만 가져오고 싶을 때 씁니다.
태그
특정 커밋에 이름을 붙입니다. 배포 버전 표시에 자주 씁니다.
git tag # 태그 목록
git tag v1.0.0 # 현재 커밋에 태그 (lightweight)
git tag -a v1.0.0 -m "메시지" # 태그 + 메시지 (annotated)
git tag -a v1.0.0 커밋해시 # 특정 커밋에 태그
git tag -d v1.0.0 # 태그 삭제
git push origin v1.0.0 # 태그 푸시
git push origin --tags # 전체 태그 푸시
정리 표
| 분류 | 명령어 | 동작 |
|---|---|---|
| 브랜치 | git branch -a |
전체 브랜치 목록 |
| 브랜치 | git switch -c |
브랜치 생성 + 이동 |
| 브랜치 | git merge --no-ff |
병합 커밋 남기며 병합 |
| 원격 | git fetch |
가져오기만 (병합 없음) |
| 원격 | git pull --rebase |
fetch + rebase |
| 원격 | git push --force-with-lease |
안전한 강제 push |
| 되돌리기 | git restore --staged |
unstage |
| 되돌리기 | git reset --soft HEAD~1 |
커밋 취소, 변경사항 유지 |
| 되돌리기 | git reset --hard HEAD~1 |
커밋 + 변경사항 모두 취소 |
| 되돌리기 | git revert HEAD |
push된 커밋 안전하게 되돌리기 |
| stash | git stash pop |
임시 저장 후 복구 |
| rebase | git rebase -i HEAD~n |
커밋 편집/합치기 |
| cherry-pick | git cherry-pick 해시 |
특정 커밋만 가져오기 |
| 태그 | git tag -a v1.0.0 -m |
버전 태그 |
되돌리기 요약 — 언제 뭘 쓰나
| 상황 | 명령어 |
|---|---|
| 아직 add 안 한 변경사항 버리기 | git restore 파일명 |
| add는 했는데 커밋 전에 내리기 | git restore --staged 파일명 |
| 커밋했는데 push 전 취소 | git reset HEAD~1 |
| push한 커밋 되돌리기 (협업 중) | git revert HEAD |
'블로그, 컴퓨터 > Cheatsheets' 카테고리의 다른 글
| Docker 명령어 정리 (2편) — Dockerfile과 Docker Compose (0) | 2026.05.27 |
|---|---|
| Docker 명령어 정리 (1편) — 개념, 이미지, 컨테이너 (0) | 2026.05.27 |
| Git 명령어 정리 (1편) — 기본 개념, 설정, 커밋, 로그 (0) | 2026.05.26 |
| Neovim 설정 정리 (2편) — lazy.nvim, LSP, 주요 플러그인 (0) | 2026.05.25 |
| Neovim 설정 정리 (1편) — init.lua 구조와 Lua 기초 (0) | 2026.05.25 |