remote branch 삭제 시 local에서 참조 동기화

[문제발생]

원격 저장소에서 브랜치를 생성 후 로컬 저장소에서 작업 후 원격저장소로 push하려는 과정에서 원격 저장소 브랜치 생성을 잘 못하여 깃헙에서 브랜치를 삭제하였으나, 로컬에서 git을 통해 원격저장소 브랜치 상태를 확인하는 과정에서 동기화되지 않은 문제가 발생했다. (원격저장소에 있던 브랜치가 삭제되었을 경우 로컬에서 remote 참조 동기화 문제)

[해결시도]

이러한 문제점에 대해서  원격 저장소와 로컬 저장소 사이에 동기화 문제로 생각하여 차례대로 아래 명령어를 실행하면서

$ git pull 
$ get fetch

동기화가 되는지를 확인했다. 그러나 결과적으로는 remote 브랜치를 확인하는 과정에서 변화는 없었다.(해결실패)

 

무엇이 문제인지를 인식하기 위해  "원격 저장소, 로컬저장소 브랜치 동기화"로 검색을 수행 후 아래 블로그에서 리모트 브랜치 참조와 업데이트 -> 리모트 브랜치 참조라는 키워드를 얻을 수 있었다. 

참고주소 : https://mylko72.gitbooks.io/git/content/remote/remote_sync.html

 

리모트 저장소와의 동기화 · Git, 분산버전 관리시스템

 

mylko72.gitbooks.io

 

[해결사항]

$ git remote show origin
- origin으로 등록되어 있는(참조하고 있는) 리모트 브랜치와 로컬 브랜치의 관계를 상세히 볼 수 있다.
- 기존에 remote 브랜치에 대해서 변경이 없다면 tracked 상태이다.
- 기존에 참조하던 remote 브랜치 중 제거가 일어날 경우 stale상태가 된다.
- 만약 remote에서 새로운 브랜치가 추가되었으나 로컬에서 참조하지 않았을 경우 new ~~ 상태로 표시된다.

이와 같이 로컬 저장소에서 현재 참조하고 있는 브랜치에 대해서 변경사항을 확인 후 변경된 사항에 맞춰 참조를 업데이트시켜주면 해결할 수 있다. 부가적으로 new 상태로 새로운 브랜치가 생성되었을 경우 단순 git pull / fetch를 해주면 된다.

그러나 삭제가 발생하여 더 이상 유효하지 않은 참조에 대해서는 아래와 같은 방법으로 참조를 제거해주면 된다.

해결방법 1)

# remote(원격) 저장소 브랜치의 유효하지 않은 참조를 모두 지우는 명령
$ git remote prune origin

$ git remote update --prune

해결방법 2)

# 로컬 저장소를 remote 저장소와 동기화 하면서 유효하지 않은 참조도 함께 제거
$ git fetch -p
$ git fetch --prune

 

 

 

[알게된 점]

git pull / fetch 명령에 대해서 단순하게 remote / local 사이에 변경된 사항을 동기화한다는 정도로만 생각했는데, 동기화 하는 과정에서 브랜치 관점에서 보면 동기화 한다는 것은 remote 브랜치들에 대해 참조가 발생하며, 해당 참조를 통해서 remote 저장소에 브랜치를 식별하는 것 같다. local 저장소 입장에서는 동기화하는 시점에 remote 저장소에 상태를 기억하고 있으며, remote 저장소에 대한 변경사항을 실시간으로 local에서 자동으로 알고 있지는 않다. 그렇기에 어떠한 상황이던 항시 remote에 변경이 발생할 경우 동기화하는 작업이 필요하다. 이때 브랜치 관점에서는 각 브랜치에 대해서 참조를 하고 있기에 새로운 브랜치가 만들어질 경우는 동기화를 통해서 추가된 브랜치를 참조하면 되지만 반대로 브랜치가 삭제되었을 경우에는 local에 입장에서는 remote 브랜치가 삭제되었는지는 알 수 없이 계속 해당 remote 브랜치를 참조하고 있을 뿐이다. 그렇기에 remote 브랜치에 대한 참조를 삭제해주어야한다.