본문 바로가기
Git

Git pull / fetch/ stash 사용법 (error: 병합하기 전에 변경 사항을 커밋하거나 스태시하십시오 해결)

by 홍띠 2022. 5. 12.

다른 팀원들과 작업하다보면, 내가 작업하는 와중에 다른사람이 먼저 수정 후 Commit하는 경우가 있다.

 

이럴 경우에 바로 Commit and Push 하면 충돌이 일어나게 되는데 이를 방지하기 위해,

먼저 pull 이나 fetch를 사용하여 최신 커밋상태로 업데이트 한 후 commit을 진행한다.


git pull? git fetch?

pull과 fetch 모두 원격저장소의 커밋 사항을 로컬저장소로 가져오는 기능이다.

두가지 중에 본인에게 맞는 명령어를 사용하면 된다.

 

차이점은?

  • pull: 원격저장소의 커밋사항들을 모두 가져와 로컬저장소에 병합까지 수행한다.
             한번에 두가지 작업을 수행하기 때문에 편리하지만 변경사항을 확인하기 어렵다는 단점이 있다.
  • fetch: 원격저장소의 커밋사항들을 가져오기만 한다. 병합은 따로 해주어야 한다.
                이렇게 되면 변경사항을 확인 하고 로컬저장소에 변경사항을 병합 할 수 있다.

git pull 사용하기

#git pull <원격저장소> <브랜치>
$ git pull origin main

git fetch 사용하기

#원격저장소에서 커밋사항 모두 받아오기
$ git fetch —all
#변경사항 확인
$ git diff
#로컬저장소와 병합
#git mertge <원격저장소>/<브랜치>
$ git merge origin/main

그런데, pull 혹은 fetch로 변경사항을 받아와 병합하는 과정에서도, 내가 수정한 파일에 변경사항이 있는 경우(다른 팀원과 하나의 파일을 동시에 작업한 경우)에는 충돌이 발생하여 아래와 같은 에러가 발생한다.

->  error: 다음 파일의 로컬 변경 사항을 병합 때문에 덮어 쓰게 됩니다. 병합하기 전에 변경 사항을 커밋하거나 스태시하십시오


위의 문제를 해결하기 위해 git stash를 사용해보자.

 

git stash 란?

stash 저장소는 임시저장소의 개념이다. 내 경우와 같이 병합 시 충돌이 발생하거나 갑작스러운 branch 전환 등의 경우 commit을 사용하지 않고 임시저장소에 변경사항을 잠시 백업하는 용도록 사용할 수 있다.

 

git stash 사용하여 위의 병합 문제 해결하기

 

1. 현재 상태 확인하기: 현재 충돌이 일어나는 파일이 스테이지에 있는것을 확인 할 수 있다.

$ git status

2. stash 명령어를 사용하여 스테이지의 변경사항들을 임시저장소로 옮겨놓기

$ git stash
Saved working directory and index state WIP on main: ~~

3. 다시 현재 상태 확인하기: 이제 스테이지에 아무것도 없는것을 확인 할 수 있다.

$ git status

추적하지 않는 파일은 스테이지에 없기 때문에 대상이 되지 않는다.

4. 다시 pull 혹은 fetch 시도하기 : 이번에는 github에서 변경사항을 확인 하고 pull명령어로 처리 했다.

    ✅ 문제없이 pull 완료 될 것이다!

$ git pull origin main

5. pull이 완료 되었으면 최신화 된 git 저장소에 stash 해둔 임시저장소 내용 병합

    : pop 명령어를 활용하면 병합 후 stash 자동 삭제 됨: apply 후 drop 을 하는것과 동일

$ git stash pop

6. 임시저장소로 옮겨놓은 스테이지 변경사항 다시 잘 복원되었는지 확인 : 1번과 동일하게 스테이지 복구됨

$ git status

7. 이제 최종적으로 commit 진행한다!!

$ git commit -m “commit after stash”

+ stash 목록 확인하고 싶으면?

$ git stash list

+ stash 내용을 확인하고 싶으면?

# git stash show -p <stash 지정>
$ git stash show -p stash@{0}

'Git' 카테고리의 다른 글

Github - Code Owner 설정  (0) 2025.03.15
로컬에 남아있는 불필요한 branch 삭제  (0) 2023.12.24
git push 되돌리기  (0) 2022.05.22