다른 팀원들과 작업하다보면, 내가 작업하는 와중에 다른사람이 먼저 수정 후 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 |