Git Pull 시 로컬 변경사항 보존하기 — git stash 활용법
운영 서버에서 설정 파일 등을 로컬 수정한 상태에서, 원격 저장소의 변경사항을 충돌 없이 받는 방법을 정리한다.
[01] 문제 상황
운영 서버에서 Docker 설정 등을 직접 수정해서 사용하고 있다. 이 상태에서 git pull을 하면 merge 충돌이 발생할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
user@server:~/project$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: docker-compose.dev.yml
modified: package-lock.json
Untracked files:
(use "git add <file>..." to include in what will be committed)
docs/2025/project-alpha/
docs/2025/project-beta/
docs/2026/project-gamma/
이때 원격에서는 config.ts 같은 다른 파일이 변경되었다. 로컬에서 수정한 docker-compose.dev.yml, package-lock.json은 그대로 유지하면서, 원격 변경사항만 받고 싶다.
1
2
3
원격: config.ts 변경됨
로컬: docker-compose.dev.yml, package-lock.json 변경됨
→ 서로 다른 파일이므로 충돌 없이 가능해야 함
그런데 git pull을 바로 실행하면:
1
2
3
4
user@server:~/project$ git pull
error: Your local changes to the following files would be overwritten by merge:
package-lock.json
Please commit your changes or stash them before you can merge.
Git은 커밋되지 않은 변경사항이 있으면 pull을 거부한다.
[02] 해결: git stash
2-1. 한 줄 명령어
1
git stash && git pull && git stash pop
이 한 줄로 끝난다. 각 단계가 하는 일:
| 단계 | 명령 | 동작 |
|---|---|---|
| 1 | git stash |
로컬 변경사항을 임시 저장소에 보관 |
| 2 | git pull |
원격 변경사항 다운로드 및 반영 |
| 3 | git stash pop |
임시 저장한 로컬 변경사항 복원 |
2-2. 실행 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 로컬 변경사항 임시 저장
user@server:~/project$ git stash
Saved working directory and index state WIP on main: abc1234 latest commit message
# 2. 원격 변경사항 받기 (이제 로컬이 깨끗하므로 정상 동작)
user@server:~/project$ git pull
Updating abc1234..def5678
Fast-forward
config.ts | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
# 3. 로컬 변경사항 복원
user@server:~/project$ git stash pop
On branch main
Changes not staged for commit:
modified: docker-compose.dev.yml
modified: package-lock.json
Dropped refs/stash@{0} (a1b2c3d4...)
원격의 config.ts 변경이 반영되고, 로컬의 docker-compose.dev.yml, package-lock.json 수정사항도 그대로 유지된다.
[03] git stash 상세
3-1. 동작 원리
1
2
3
4
5
6
7
8
작업 디렉토리 (수정된 파일들)
↓ git stash
임시 저장소 (stash stack) ← 변경사항 보관
작업 디렉토리 (깨끗한 상태) ← git pull 가능
↓ git pull
원격 변경사항 반영
↓ git stash pop
임시 저장소에서 복원 ← 로컬 변경사항 + 원격 변경사항 공존
3-2. 주요 명령어
| 명령어 | 설명 |
|---|---|
git stash |
변경사항 임시 저장 (tracked 파일만) |
git stash -u |
untracked 파일도 포함하여 저장 |
git stash list |
저장된 stash 목록 확인 |
git stash show |
가장 최근 stash의 변경 내용 요약 |
git stash show -p |
가장 최근 stash의 diff 확인 |
git stash pop |
가장 최근 stash 복원 후 삭제 |
git stash apply |
가장 최근 stash 복원 (삭제하지 않음) |
git stash drop |
가장 최근 stash 삭제 |
git stash clear |
모든 stash 삭제 |
3-3. pop vs apply
| 명령 | 복원 | stash 삭제 | 용도 |
|---|---|---|---|
git stash pop |
O | O | 일반적 사용 (1회성) |
git stash apply |
O | X | 여러 브랜치에 같은 변경 적용 시 |
[04] stash pop 시 충돌이 발생하면
로컬과 원격이 같은 파일의 같은 부분을 수정했다면, stash pop 시 충돌이 발생한다.
1
2
3
user@server:~/project$ git stash pop
Auto-merging docker-compose.dev.yml
CONFLICT (content): Merge conflict in docker-compose.dev.yml
이 경우:
1
2
3
4
5
6
7
8
# 1. 충돌 파일 확인
git status
# 2. 충돌 부분 수동 해결 (에디터로 열어서 <<<< ==== >>>> 부분 정리)
vi docker-compose.dev.yml
# 3. 해결 후 stash 정리
git stash drop
stash pop에서 충돌이 발생하면 stash가 자동 삭제되지 않는다. 충돌 해결 후 git stash drop으로 직접 삭제해야 한다.
[05] 다른 방법들
5-1. 특정 파일만 stash
모든 변경사항이 아닌, 특정 파일만 stash하고 싶을 때:
1
2
3
4
5
6
# 특정 파일만 stash
git stash push docker-compose.dev.yml package-lock.json
# pull 후 복원
git pull
git stash pop
5-2. git pull –rebase –autostash
Git 2.9 이상에서는 stash를 자동으로 처리하는 옵션이 있다.
1
git pull --rebase --autostash
이 명령 하나로 stash → pull → rebase → stash pop을 자동 수행한다.
영구 설정:
1
git config --global rebase.autoStash true
이후 git pull --rebase만 하면 자동으로 stash/pop이 적용된다.
[06] 정리
| 상황 | 명령어 |
|---|---|
| 로컬 변경 보존 + pull | git stash && git pull && git stash pop |
| 자동 stash + rebase | git pull --rebase --autostash |
| 특정 파일만 stash | git stash push <파일1> <파일2> |
| stash 충돌 시 | 수동 해결 후 git stash drop
|
운영 서버처럼 로컬 설정 파일을 수정해서 사용하는 환경에서는, git stash && git pull && git stash pop 패턴을 습관화하면 충돌 걱정 없이 원격 변경사항을 받을 수 있다.