한창 로컬 브랜치에서 작업중일 때, 다른 팀원이 develop 브랜치로 push하여 업데이트 된 경우!
그대로 내 작업물도 push하면 conflict가 발생할 수 있다.
그렇다면 어떻게 두 브랜치를 합칠 수 있을까?
원격 저장소에 올라와 있는 브랜치를 현재 내 로컬 브랜치와 합친다.
이때 pull이란 fetch + merge이며, 둘을 나눠서 쓰면
fetch는 둘의 차이를 보여주고, 이를 바탕으로 원하는 부분만 합치는 섬세한 작업이 가능하다.
1. $ git stash (현재 로컬의 변경 된 소스가 있으면 pull 되지 않으므로 임시 저장)
2. $ git checkout master (master branch 이동)
3. $ git pull origin develop(소스 내려받기)
4. $ git checkout [localbranch] (자신의 branch 이동)
5. $ git rebase main (master 소스를 자신의 branch와 병합)
또는 $ git merge main (이게 나을지도?)
6. $ git stash list (임시 저장소 목록)
7. $ git stash apply (임시 저장소에 있는 소스 현재 브랜치에 적용)
8. $ git branch -v (branch 버전 보기, 이때 마스터의 브랜치 버전과 내 브런치 버전이 동일 해야함)
명령어를 통해 현재 위치해있는 로컬 브랜치와 원격 저장소의 develop을 합쳐주는 것이다.
만약 develop이 아닌 다른 브랜치, 예를 들어 master과 합치고 싶다면 $ git pull origin master
를 해주면 된다.
git add를 하지 않은 파일의 경우 git pull을 하면 덮어쓰기가 될 수 있다. 이런 경우 위의 stash를 저장, 적용해주어야 작업하던 파일을 그대로 쓸 수 있다.
error: Your local changes to the following files would be overwritten by merge:
build.gradle
git pull을 하다보면 위와 같은 에러가 발생하면서 pull이되지 않을 수 있다. 이는 내가 수정한 파일을 다른 사람이 push한 경우 해당 파일이 충돌되기 때문에 merge되기 전 조치를 취하라는 뜻이다.
git stash라는 명령어를 통해 현재 작업한 것들을 스택에 잠시 저장하는 방법이 있다.
이때 stash란 아래에 해당하는 파일들을 보관해두는 장소이다.
//오류 해결 방법!
//-------------
$ git stash //변경사항 스택에 저장
$ git pull origin develop //원격 브랜치와 합치기
$ git stash apply //변경사항 적용
$ git stash pop //변경 사항을 적용하고 스택에서 제거
이때 git stash pop
을 하더라도 stash list에서는 저장한 stash가 삭제되지 않기 때문에 git stash drop
을 통해 제거해줘야 한다.
명령어 | 설명 |
---|---|
git stash, git stash save | 현재 상태를 스택에 저장 |
git stash list | stash 목록 확인 |
git stash apply | 가장 최신의 stash를 가져와 적용 |
git stash apply [stash 이름] | [stash 이름]에 해당하는 stash를 가져와 적용 |
git stash apply --index | 위 명령어와 달리Staged 상태였던 파일을 자동으로 Staged 상태로 만들어줌 |
git stash drop | 가장 최근의 stash 제거 |
git stash drop [stash 이름] | [stash 이름]에 해당하는 stash 제거 |
git stash show -p | git apply -R | 가장 최근의 stash를 사용하여 패치를 만들고 그것을 거꾸로 적용 |
참고
[Git (6)] git pull 에러 해결방법 (Your local changes to the following files would be overwritten by merge ) - git stash
[Git] git stash 명령어 사용하기
[Git] 자주 사용하는 Git 명령어 모음