본문 바로가기
기타/Git

[Git] remote tracking branch

by 코딩하는 랄로 2024. 1. 11.
728x90

remote tracking branch

협업에 있어서 리모트 저장소는 중요한 부분을 차지하기 때문에 git은 remote 저장소와 관련된 정보를 저장하고 있다. 이 정보는 .git directory에 refs directory에 저장되어 있다.

 

여기에 저장되어 있는 정보를 토대로 리모트에 대한 정보를 조회할 수 있다. git ls-remote [ remote이름 ] 을 사용하면 모든 리모트의 refs를 조회할 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/git_practice (main)
$ git ls-remote origin
b68334cc810e16c0713ec8de1e03117c1409f29a        HEAD
b68334cc810e16c0713ec8de1e03117c1409f29a        refs/heads/main

 

현재 remote 의 HEAD 와 main branch가 있고 가리키는 커밋 개체가 무엇인지 보여준다. 이외에도 git remote show [ remote 이름 ] 명령을 사용하면 모든 리모트 브랜치와 그 정보를 위의 명렁어보다 디테일하게 보여준다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/git_practice (main)
$ git remote show origin
* remote origin
  Fetch URL: https://github.com/YuSangGon/git_practice.git
  Push  URL: https://github.com/YuSangGon/git_practice.git
  HEAD branch: main
  Remote branch:
    main tracked
  Local branch configured for 'git pull':
    main merges with remote main
  Local ref configured for 'git push':
    main pushes to main (fast-forwardable)

 

이렇게 refs 에 저장되어 있는 정보들을 통해 git은 리모트에 대한 정보를 조회할 수 있는 여러 명렁어를 제공하고 있지만 대게 위의 명렁어보다는 git이 제공하는 리모트 트래킹 브랜치를 사용한다.

 

리모트 트래킹 브랜치는 이름 그대로 리모트 브랜치를 추적하는 레퍼런스인 동시에 브랜치이다. 해당 브랜치는 로컬에 존재하지만 임의로 움직일 수 없는 브랜치이다. ( 리모트의 브랜치를 추적하는 브랜치이니까!! ) 리모트 서버에 연결(fetch or pull, push)될 때마다 그 결과에 따라 자동으로 갱신이 된다.

 

리모트 트래킹 브랜치의 이름은 [리모트이름]/[브랜치이름] 의 형식을 가진다. 예를 들어 origin 리모트의 main 브랜치는 origin/main 이라는 이름을 가지는 것이다. 이 정보를 토대로 아래의 로그를 살펴보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/git_practice (main)
$ git log
commit bab52ea2a9231d0a582e4cefa9fdd979f76bf89a (HEAD -> main)
Author: yusanggon <yusang5159@naver.com>
Date:   Thu Jan 11 22:22:05 2024 +0900

    add file

commit b68334cc810e16c0713ec8de1e03117c1409f29a (origin/main, origin/HEAD)
Author: YuSangGon <61350460+YuSangGon@users.noreply.github.com>
Date:   Sun Dec 31 11:31:40 2023 +0900

    Initial commit

 

현재 로컬의 작업 브랜치는 main이고 commit 개체 bab52e 를 가리키고 있고, origin 리모트의 main 브랜치는 그 이전 커밋인 b68334 를 가리키고 있는 것을 볼 수 있다. 이를 간단하게 그림으로 나타내면 다음과 같다.

이런 상황에서 팀원 한명이 리모트 저장소에 push를 여러번 하게 되면 다음과 같은 상황이 만들어진다.

 

리모트의 main 브랜치는 로컬의 트래킹 브랜치인 origin/main이 싱크가 안 맞게 되어버렸다. 그렇기 때문에 만약 해당 상황에서 local에서 remote로 push를 진행하려고 하면 에러를 띄우면서 pull을 먼저 진행하라는 메세지를 볼 수 있을 것이다.

 

여기서 pull 또는 fetch를 먼저 진행하는 이유가 바로 리모트 저장소의 브랜치와 로컬 저장소의 트래킹 브랜치를 동기화하기 위해서 이다. fetch 명렁어를 실행시키면 현재 로컬에 없는 데이터를 모두 저장소에서 내려받고 리모트 트래킹 브랜치인 origin/master의 위치를 최신 커밋으로 이동시킨다.

 

여기서 local의 main 브랜치에 origin/main 브랜치를 merge하게 되면 merge commit 개체가 생성되고 이를 push하게 되면 정상적으로 push가 진행이 되는 것이다.

 

git push에 대해서는 다음 글에서 조금 더 디테일하게 다루겠다. 이번시간에는 git이 remote branch에 대한 정보를 보여주는 여러 명렁어를 제공하고 있고 리모트 트래킹 브랜치를 통해서 가장 최근에 리모트와 연결되었을 때의 리모트 브랜치의 커밋 위치 등을 알려주는 유용한 도구가 있다는 것만 알면 된다.

 

 

 

 

reference : pro git

728x90

'기타 > Git' 카테고리의 다른 글

[Git] Push  (0) 2024.01.17
[Git] branch workflow  (0) 2024.01.09
[Git] branch 관리  (1) 2024.01.09
[Git] Conflict 기초  (2) 2024.01.08
[Git] Merge 기초  (0) 2024.01.04