Git branch 변경 오류 Your local changes would be overwritten by checkout 해결 흐름

Git에서 브랜치를 바꾸려고 할 때 error: Your local changes to the following files would be overwritten by checkout:, Please commit your changes or stash them before you switch branches., Aborting 메시지가 나오면 현재 브랜치의 로컬 수정사항을 먼저 정리해야 합니다.


이 오류는 현재 작업을 commit, stash, restore, 새 브랜치 저장 중 하나로 정리하면 해결할 수 있습니다. 다만 git reset --hard부터 실행하는 방식은 안전하지 않습니다. 이 명령은 커밋하지 않은 변경사항을 잃을 수 있으므로, 먼저 git statusgit diff로 현재 작업 내용을 확인해야 합니다.


Git branch 변경 오류 메시지 원문

브랜치 이동이 막히면 터미널에 아래와 비슷한 메시지가 표시됩니다. checkout을 사용해도 나오고, switch를 사용할 때도 같은 의미의 안내가 나올 수 있습니다.


error: Your local changes to the following files would be overwritten by checkout:
        src/app.js
        package.json
Please commit your changes or stash them before you switch branches.
Aborting

이 메시지는 Git이 브랜치 변경을 실패했다는 뜻이 아니라, 사용자의 로컬 수정사항이 덮어써질 가능성이 있어 이동을 멈췄다는 뜻입니다. 즉, Git이 작업 내용을 보호하기 위해 브랜치 변경을 막은 상태입니다.


먼저 주의할 점

git reset --hard는 빠르게 보이지만 기본 해결책이 아닙니다. 현재 수정한 파일을 잃을 수 있으므로, branch 변경 오류에서는 먼저 commit, stash, restore, 새 브랜치 저장 중 어떤 방식이 맞는지 판단해야 합니다.


왜 브랜치 이동이 막힐까

이 오류는 현재 브랜치에서 수정한 파일이 있고, 이동하려는 브랜치에도 같은 파일의 다른 버전이 있을 때 자주 발생합니다. Git은 브랜치를 바꾸면서 작업 디렉터리 파일을 대상 브랜치 상태로 맞추는데, 이 과정에서 아직 저장하지 않은 변경사항이 사라질 수 있으면 이동을 중단합니다.


원인 의미 먼저 할 일
현재 브랜치에 수정한 파일이 있음 아직 commit하지 않은 작업이 남아 있음 git status 확인
이동할 브랜치에도 같은 파일이 다름 브랜치 이동 중 파일이 덮어써질 수 있음 commit 또는 stash 판단
Git이 로컬 변경사항 보호 사용자 작업 손실을 막기 위해 중단 삭제 전 백업 확인

먼저 확인할 명령어

오류가 나오면 어떤 파일이 수정됐는지 먼저 확인합니다. Windows, Mac, Linux 모두 아래 Git 명령어는 공통으로 사용할 수 있습니다.


git status

현재 어느 브랜치에 있는지도 함께 확인합니다.


git branch

수정 내용이 중요한지 판단하려면 아래 명령어로 실제 변경 내용을 확인하는 것이 좋습니다.


git diff

빠른 판단 기준

작업이 의미 있는 단위로 끝났다면 commit, 아직 임시 작업이면 stash, 필요 없는 수정이면 restore, 현재 작업을 따로 보존하고 싶다면 새 브랜치를 만드는 방식이 안전합니다.


commit, stash, restore, 새 브랜치 저장 차이

같은 오류라도 작업 상태에 따라 선택해야 할 해결 방법이 다릅니다. 아래 표를 먼저 보고 현재 상황에 맞는 방법을 고르면 됩니다.


방법 언제 쓰나 주의할 점
commit 작업이 의미 있는 단위로 완성됐을 때 커밋 메시지를 알아보기 쉽게 작성
stash 잠시 치워두고 다른 브랜치로 이동해야 할 때 나중에 stash pop으로 다시 적용 필요
restore / discard 수정사항이 필요 없을 때 커밋하지 않은 변경사항이 사라질 수 있음
새 브랜치 생성 현재 작업을 보존하면서 흐름을 분리하고 싶을 때 브랜치 이름을 작업 목적에 맞게 지정

해결 방법 1: 수정사항을 commit하고 브랜치 변경

현재 작업이 어느 정도 완성됐고 기록으로 남겨도 된다면 commit 후 브랜치를 바꾸는 방법이 가장 깔끔합니다. 팀 프로젝트에서는 작업 단위가 명확할수록 나중에 되돌리거나 리뷰하기 쉽습니다.


git add .
git commit -m "Save work before switching branch"
git switch 브랜치명

checkout을 사용하는 프로젝트라면 아래처럼 이동할 수도 있습니다.


git checkout 브랜치명

git pull 중에 나오는 local changes 오류와 헷갈릴 수 있지만, 이 글의 상황은 “원격 변경을 가져오는 중”이 아니라 “브랜치를 바꾸는 중”에 로컬 수정사항이 막는 경우입니다. 원격 변경을 가져오다 막힌 경우라면 Git pull 오류에서 local changes would be overwritten by merge가 나올 때 처리 순서를 확인하는 편이 맞습니다.


해결 방법 2: 아직 애매하면 stash 후 브랜치 변경

작업이 덜 끝났고 commit으로 남기기 애매하다면 stash가 적합합니다. stash는 현재 작업 내용을 임시로 보관하고 작업 디렉터리를 깨끗한 상태로 돌려 브랜치 이동을 쉽게 해줍니다.


git stash push -m "work before branch switch"
git switch 브랜치명

보관된 stash 목록은 아래 명령어로 확인합니다.


git stash list

다시 작업 내용을 꺼낼 때는 아래 명령어를 사용합니다.


git stash pop

git stash pop은 stash를 적용한 뒤 목록에서 제거합니다. 적용만 하고 목록에 남겨두고 싶다면 git stash apply를 사용할 수 있습니다.


해결 방법 3: 필요 없는 수정사항이면 restore

수정한 내용이 필요 없다면 되돌릴 수 있습니다. 다만 삭제나 초기화에 가까운 작업이므로, 실행 전에 git statusgit diff로 버릴 내용이 맞는지 확인해야 합니다.


특정 파일만 되돌릴 때는 아래처럼 실행합니다.


git restore 파일명

전체 수정사항 되돌리기 전 확인

아래 명령어는 커밋하지 않은 변경사항을 삭제할 수 있습니다. 실행 전 git status, git diff로 버릴 내용이 맞는지 확인하고, 필요한 파일은 따로 백업해 두는 것이 좋습니다.


git restore .

해결 방법 4: 현재 작업을 새 브랜치로 저장

현재 작업이 원래 브랜치에 들어가면 안 되지만 버리기도 아깝다면 새 브랜치를 만들어 저장하는 방법이 좋습니다. 이렇게 하면 지금 작업을 잃지 않고, 원래 이동하려던 브랜치로 돌아갈 수 있습니다.


git switch -c 새브랜치명
git add .
git commit -m "Save current work"

이후 원래 이동하려던 브랜치로 바꾸면 됩니다.


git switch 이동할브랜치명

VSCode Source Control에서 처리하는 방법

VSCode에서는 왼쪽 Source Control 패널에서 수정된 파일을 확인할 수 있습니다. 파일명을 클릭하면 변경 전후를 비교할 수 있고, 필요한 파일은 stage한 뒤 commit할 수 있습니다. 터미널 명령어가 익숙하지 않다면 먼저 VSCode 화면에서 어떤 파일이 바뀌었는지 확인하는 것이 좋습니다.


1. 왼쪽 Source Control 아이콘을 클릭합니다.
2. Changes 목록에서 수정된 파일을 확인합니다.
3. 필요한 작업이면 메시지를 입력하고 commit합니다.
4. 아직 임시 작업이면 터미널에서 stash를 사용합니다.
5. 필요 없는 수정이면 파일별로 Discard Changes를 선택합니다.
6. Discard 전에는 변경 내용을 diff 화면에서 반드시 확인합니다.


VSCode에서 커밋, 푸시, 브랜치 전환, 충돌 해결 화면이 낯설다면 VSCode Git 입문 2026에서 커밋·푸시·브랜치 흐름을 먼저 확인하면 터미널 명령어와 화면 동작을 함께 이해하기 쉽습니다.


checkout과 switch 차이

git checkout은 오래전부터 브랜치 이동과 파일 복원에 함께 쓰이던 명령어입니다. 하나의 명령어가 여러 역할을 하다 보니 초보자에게 헷갈릴 수 있습니다. git switch는 브랜치 전환 목적을 더 분명하게 나눈 명령어입니다.


명령어 주요 용도 초보자 기준
git checkout 브랜치 이동, 특정 파일 복원 등 여러 용도 기존 자료에서 자주 보임
git switch 브랜치 전환에 집중 브랜치 이동 목적이 더 명확함

새 브랜치를 만들면서 이동할 때는 아래처럼 사용할 수 있습니다.


git switch -c 새브랜치명

reset --hard는 마지막 수단으로만 생각하기

git reset --hard는 현재 작업 디렉터리와 스테이지 상태를 특정 커밋 기준으로 강하게 되돌리는 명령어입니다. 이 과정에서 커밋하지 않은 변경사항을 잃을 수 있으므로, branch 변경 오류의 기본 해결책으로 쓰지 않는 것이 좋습니다.


실행 전 확인할 것

git reset --hard를 꼭 써야 한다면 먼저 git status, git diff로 변경 내용을 확인하고, 필요한 파일은 복사해 백업합니다. 팀 저장소에서는 현재 브랜치와 작업 범위를 다시 확인한 뒤 실행해야 합니다.


Git pull 오류, merge conflict와 헷갈리지 않는 기준

비슷한 메시지처럼 보여도 상황은 다릅니다. branch 변경 오류는 브랜치를 바꾸려는 순간 로컬 수정사항이 막는 문제입니다. Git pull 오류는 원격 변경을 가져오는 과정에서 로컬 수정사항이 막는 문제입니다. merge conflict는 Git이 병합을 시도했지만 같은 부분의 변경을 자동으로 합치지 못한 상태입니다.


구분 발생 시점 핵심 처리
branch 변경 오류 git switch, git checkout commit, stash, restore, 새 브랜치 저장
Git pull 오류 git pull 원격 변경 반영 전 로컬 변경 정리
merge conflict 병합이 진행되다 멈춘 뒤 충돌 파일을 직접 수정 후 add, commit

공식 자료로 더 확인하기

Git 명령어는 작업 이력과 파일 상태에 직접 영향을 줍니다. 명령어의 역할이 헷갈릴 때는 공식 문서에서 목적과 옵션을 확인한 뒤 실행하는 것이 안전합니다.


Git 공식 문서: switch와 checkout

브랜치를 전환할 때 사용하는 switch와 checkout의 역할을 확인할 수 있습니다.

git switch 공식 문서 확인하기
git checkout 공식 문서 확인하기

Git 공식 문서: stash와 restore

임시 저장이 필요한 경우와 작업 내용을 되돌려야 하는 경우에 사용할 명령어를 확인할 수 있습니다.

git stash 공식 문서 확인하기
git restore 공식 문서 확인하기

VS Code 공식 문서: Source Control

VSCode Source Control 화면에서 변경사항 확인, stage, commit, branch, stash 흐름을 확인할 수 있습니다.

VS Code Source Control 공식 문서 확인하기

함께 보면 좋은 글

병합이 이미 멈춘 상태라면
브랜치 이동이 막힌 단계가 아니라 merge가 진행되다 멈춘 상태라면 충돌 파일을 직접 정리해야 합니다.
Git merge conflict 해결: CONFLICT (content)와 Automatic merge failed 처리 순서

commit 후 push가 거절될 때
로컬 작업을 commit한 뒤 push 단계에서 거절된다면 원격 브랜치 이력과 내 브랜치 이력이 어긋난 상황일 수 있습니다.
Git push rejected 오류 해결: non-fast-forward와 Updates were rejected 순서

자주 묻는 질문

Q1. commit하지 않고 branch를 바꿀 수 있나요?

가능합니다. 아직 commit하기 애매한 작업이라면 git stash로 임시 저장한 뒤 branch를 바꿀 수 있습니다. 다만 stash한 작업은 자동으로 새 브랜치에 적용되지 않으므로, 나중에 git stash list로 확인하고 git stash pop 또는 git stash apply로 다시 꺼내야 합니다.

Q2. stash와 commit은 무엇이 다른가요?

commit은 작업 이력에 정식으로 기록하는 방식이고, stash는 잠시 치워두는 임시 보관에 가깝습니다. 작업이 의미 있는 단위로 끝났다면 commit이 좋고, 아직 정리되지 않은 작업을 잠깐 보관한 뒤 다른 브랜치로 이동해야 한다면 stash가 더 적합합니다.

Q3. git restore와 git reset --hard는 어떻게 다른가요?

git restore는 특정 파일이나 작업 디렉터리의 변경사항을 되돌릴 때 주로 사용합니다. git reset --hard는 현재 브랜치 상태를 강하게 되돌리는 명령어라 영향 범위가 더 큽니다. 초보자는 전체 초기화보다 git status와 git diff로 파일을 확인한 뒤 필요한 범위만 restore하는 편이 안전합니다.

Q4. VSCode에서 Discard Changes를 눌러도 되나요?

해당 수정사항이 정말 필요 없을 때만 눌러야 합니다. Discard Changes는 파일의 로컬 변경을 버리는 동작이므로, 누르기 전에 파일을 클릭해 diff 화면에서 어떤 줄이 삭제되는지 확인하는 것이 좋습니다. 필요한 내용이 있다면 commit, stash, 새 브랜치 저장을 먼저 고려합니다.

Q5. checkout 대신 switch를 써도 되나요?

브랜치를 바꾸는 목적이라면 switch를 사용해도 됩니다. checkout은 브랜치 이동과 파일 복원 등 여러 역할을 함께 해왔기 때문에 초보자에게 헷갈릴 수 있습니다. 반면 switch는 브랜치 전환 목적이 더 분명하므로 새 자료에서는 git switch 브랜치명 형태가 이해하기 쉽습니다.



Git branch 변경 오류는 대부분 현재 작업을 commit, stash, restore 중 하나로 정리하면 안전하게 해결할 수 있습니다.