[Git] git pull이 안될 때 (cannot lock ref)

네모난네모·2024년 11월 7일
post-thumbnail

팀원의 작업물이 궁금해서 원격 브랜치의 내용을 로컬 브랜치로 받기 위해 pull을 시도했는데 오류가 발생했다.

* branch            <원격 브랜치> -> FETCH_HEAD
error: cannot lock ref 'refs/remotes/origin/<원격 브랜치>': is at <4dc843..> but expected <1b73ee..>
! 1b73eeb..4dc8437  <원격 브랜치> -> origin/<원격 브랜치> (unable to update local ref)

해당 원격 브랜치 참조(ref)를 업데이트하려고 했지만, Git이 예상한 커밋 해시값과 실제 해시값이 일치하지 않아서 이를 잠그는 데 실패했다..?

해석만으로는 이해가 안가서 열심히 검색을 해봤다.

검색해보니 오류 발생 원인은 다양한데 아래의 경우들이 해당한다고 한다.

오류 발생 원인

1. 동시에 여러 Git 작업 실행

한 작업이 브랜치를 업데이트하는 동안 다른 작업이 동일한 브랜치를 참조하거나 수정하려고 할 때 충돌 발생

2. Git 참조 파일 손상

.git/refs/remotes/ 아래의 참조 파일이 손상되었거나, Git의 내부 관리 파일에 문제가 생겼을 때

3. 네트워크 문제 또는 강제 종료

Git 작업 도중 네트워크 문제나 작업이 중단되면서 참조가 제대로 업데이트되지 않았을 수도 있음

해결방법

어쨌든 커밋 이력에 문제가 있으니 다시 최신화 후 가져오면 되는거였다.

1. 최신화

git fetch origin <원격 브랜치>

2. merge

git merge origin/<원격 브랜치>

물론 여기서도 모르는 내용이 꼬리의 꼬리를 물며 나타났다.

왜 fetch와 merge를 나눠야 하는걸까?

git pullgit fetch+git merge를 한번에 수행한다.

원격 브랜치의 최신 내용을 가져오고 로컬 브랜치에 병합하는 작업을 하나로 묶어서 처리하기 때문에 충돌(conflict)이 발생하면 merge 중 오류가 나기 쉽다.

두 작업을 따로 진행하면 어디서 오류가 나는지 확인하기 쉽기 때문에 pull이 아니라 fetch와 merge를 각각 처리하는 것이다.

git pullgit merge도 원격 브랜치의 내용을 가져오는건데
왜 원격 브랜치를 표현하는 방식이 다른걸까?

  • git pull origin <원격 브랜치>
    • 원격 저장소(origin)에서 <원격 브랜치>의 최신 변경 사항을 가져오고, 이를 현재 로컬 브랜치에 병합한다.
    • Git에게 원격 저장소(origin)의 해당 브랜치에서 변경 사항을 가져오고 병합하도록 지시하는 명령인 것이다.
  • git merge origin/<원격 브랜치>
    • git merge를 하기 전에 git fetch를 먼저 진행했다. 이는 원격 저장소의 최신 변경 사항을 가져오지만 로컬 브랜치에 병합하지 않고, 로컬 원격 트래킹 브랜치에 저장한다.
    • 로컬 원격 트래킹 브랜치는 Git에서 원격 저장소의 브랜치를 로컬에 추적하고 동기화하기 위해 만든 브랜치로, origin/브랜치명 형태로 표현된다.
    • 즉 위 명령어에서 origin/<원격 브랜치>는 로컬에 저장된 원격 트래킹 브랜치인 것이다.

끝.

0개의 댓글