Critical

  • 원격 추적 브랜치
  • git fetch/pull

 

협업을 하지 않고 로컬 저장소만 사용할 거라면 fetch, pull은 필요없다. 하지만 협업할 계획이라면 매우 중요하다.

 

 

* 원격 추적 브랜치

로컬에서의 브랜치는 앞서 다뤄봤으므로 익숙할 것이다. 하지만 clone이나 remote를 통해 원격 저장소와 동기화를 이루고 나면 "origin/main"과 같은 새로운 브랜치가 생성된다. 이 브랜치가 원격 추적 브랜치이다.

마지막으로 원격 저장소와 통신한 시점을 기억하는 포인터라고 생각하면 된다.

 

# 원격 브랜치 목록 확인
$ git branch -r
> origin/HEAD -> origin/main
> origin/main

 

추가로 커밋 후 git status 실행 시, 로컬에서만 작업했을 때와는 다른 메시지가 출력된다.

 

$ git status
> On branch main
> Your branch is ahead of 'origin/main' by 1 commit.

 

"origin/main" 브랜치에 비해서 커밋 1개가 앞서있다는 얘기이다.

앞서 말했듯이 원격 저장소와 로컬 저장소는 자동으로 동기화되지 않기 때문에 한쪽에서 커밋하는 순간 어긋나기 때문에 그것을 알려주는 것이다.

 

로컬에는 없지만 원격에는 존재하는 브랜치에 접근하려면 어떻게 해야할까?

매우 간단하다. switch 명령어를 사용하면 된다.

로컬에는 없지만 원격에 존재하는 경우
로컬과 원격 모두 없는 경우

기본적으로 로컬 브랜치와 원격 브랜치의 이름이 같으면 서로 묶인다.

 

# 브랜치 추적 설정
$ git branch -u <remote-branch>
# 브랜치 추적 해제
$ git branch --unset-upstream <remote-branch>

 

만약 자동으로 브랜치를 추적하지 않는다면 수동으로 설정해주면 된다. 추적할 필요가 없다면 해제 할 수도 있다.

두 명령어 모두 대상 브랜치로 이동해서 실행해야 한다.

 

로컬과 원격의 워크 플로우

 

* Fetching

내가 로컬에서 작업하는 동안 다른 인원들이 작업한 것들이 원격 저장소에 올라간 경우가 있을 수 있다. 협업 과정에서는 매우 흔한 일일 것이다.

이 때, 내 작업 영역을 망치지 않으면서 변경 사항에 접근할 수 있도록 하는 명령어가 fetch이다.

 

origin/master가 업데이트 됐다. master와 별개의 브랜치이다

원격 저장소에서 변경 사항을 가져오지만 작업 파일에 통합하지는 않는다.

 

origin/food가 변경되었을 뿐 로컬에는 영향이 없다

 

 

* Pulling

Fetching과 다르게 HEAD 브랜치를 업데이트 한다. 작업 영역이 업데이트 된다는 얘기이다.

간단하게 정리하자면 fetch+merge 이다.

매우 중요한 점이 있는데, 현재 HEAD가 위치한 브랜치에 풀링이 적용 된다.

 

$ git pull origin movies

 

원격 저장소의 movies 브랜치를 풀링한다는 의미이다. 의도하는 것은 로컬 저장소의 movies 브랜치에 풀링하는 것인데 만약 HEAD가 main이라면 main 브랜치에 풀링이 되어버리므로 조심해야한다.

 

fetch와 다르게 origin/movies와 movies브랜치가 병합되었다. 위와 같은 경우는 충돌이 발생하지 않았으므로 빨리 감기 병합이 이뤄졌다.

 

로컬 브랜치와 원격 브랜치가 추적되도록 설정되었다면 명령어를 간소화 시킬 수 있다.

 

$ git pull

 

main 브랜치에서 실행했다면 원격의 main 브랜치를 풀링한다.

 

추가로 원격 저장소에 푸시하기 전에 풀다운 하여 변경 사항을 확인하는 습관을 들이는것이 좋다.

+ Recent posts