✅ 리모트 브랜치
리모트 Refs는 리모트 저장소에 있는 포인터인 레퍼런스입니다. 리모트 저장소에 있는 브랜치, 태그 등을 의미합니다. git ls-remote [remote]
명령으로 모든 리모트 Refs를 조회할 수 있습니다. git remote show [remote]
명령은 모든 리모트 브랜치와 그 정보를 보여줍니다. 리모트 Refs가 있지만 일반적으로는 리모트 트래킹 브랜치를 사용합니다.
리모트 트래킹 브랜치는 리모트 브랜치를 추적하는 레퍼런스로, 로컬에 있지만 임의로 움직일 수 없습니다. 리모트 서버에 연결할 때마다 리모트 브랜치의 업데이트 내용에 따라 자동으로 갱신됩니다. 리모트 트래킹 브랜치는 일종의 북마크라고 볼 수 있습니다. 리모트 저장소에 마지막으로 연결했을 때 해당 브랜치가 가리키고 있던 커밋을 나타냅니다.
리모트 트래킹 브랜치의 이름은 <remote>/<branch>
형식으로 구성됩니다. 예를 들어, 리모트 저장소 origin의 master 브랜치를 확인하고 싶다면 origin/master
라는 이름의 브랜치를 확인하면 됩니다. 다른 팀원과 함께 어떤 이슈를 구현할 때, 그 팀원이 iss53
브랜치를 서버로 Push했고 당신도 로컬에 iss53
브랜치가 있다고 가정해봅시다. 이때, 서버의 iss53
브랜치가 가리키는 커밋은 로컬에서 origin/iss53
이 가리키는 커밋입니다.
🔹 리모트 트래킹 브랜치란?
- 리모트 트래킹 브랜치의 예시
main 브런치 : origin의 main 브런치를 가리킨다.
team2 브런치 : origin의 team2 브런치를 가리킨다.
teamoneMain 브런치 : teamone의 main 브런치를 가리킨다.
remote로 등록된 origin과 teamone의 URL은 다릅니다.
- 자신(A)의 원격 저장소를 Clone한 상태에서 다른 사람(B)의 원격 저장소 추가하기
- A는 원격 저장소에 main 브런치를 가지고 있다.
- A는 로컬 저장소에 A 원격 저장소를 Clone했기 때문에 origin 리모트와 main 브런치를 로컬에 가지고 있다.
- B는 원격 저장소를 가지고 있고, main 브런치가 있다.
A의 로컬 저장소에 이미
origin
리모트가 연결되어 있고, main 브랜치가 A 원격 저장소의 내용을 가지고 있는 상태라고 가정합니다. 이때 B가 가지고 있는 원격 저장소에 있는 main 브랜치를 A의 로컬 저장소에 리모트 트래킹 브랜치로 추가하기 위한 과정은 다음과 같습니다.- A의 로컬 저장소로 이동합니다. (만약 이미 로컬 저장소 디렉토리에 있으면 이 단계는 무시합니다.)
- B의 원격 저장소를 A의 로컬 저장소에 추가합니다. 이를 원격 저장소를 등록하는 과정이라고 합니다. 원격 저장소의 URL은 B가 제공하는 것을 사용합니다.
git remote add b-origin <B의 원격 저장소 URL>
이때,
b-origin
은 B의 원격 저장소를 나타내는 이름으로, 원하는 다른 이름을 사용할 수 있습니다. 그러나 origin은 이미 A의 원격 저장소로 등록되어 있기 때문에 사용할 수 없습니다.
- 원격 저장소를 등록한 후에는
git fetch
명령을 사용하여 B의 원격 저장소 정보를 가져옵니다.git fetch b-origin
- 이제 A의 로컬 저장소에 B의 main 브랜치를 리모트 트래킹 브랜치로 추가할 준비가 되었습니다.
git branch
명령을 사용하여 main 브랜치를 확인합니다.git branch -r
위 명령을 실행하면 B의 원격 저장소에 있는 모든 브랜치들이 나열됩니다. 여기서
b-origin/main
또는b-origin/master
와 같이 B의 main 브랜치를 확인할 수 있습니다.
- B의 main 브랜치를 로컬에 리모트 트래킹 브랜치로 추가합니다.
git branch
명령을 사용하여 브랜치를 생성하고 해당 브랜치를 리모트 트래킹 브랜치로 설정합니다.git branch --track b-main b-origin/main #이 명령어는 b-main 브런치까지 checkout도 한다. 즉 해당 브런치로 작업공간이 이동한다. git checkout -b b-main b-origin/main
위 명령을 실행하면 A의 로컬 저장소에
b-main
이라는 브랜치가 생성되고, B의 main 브랜치를 리모트 트래킹 브랜치로 연결합니다. 이때 이름을 main으로 줄 수 없습니다. A 원격 저장소의 main 브런치를 Clone해서 이미 로컬에도 main 브런치가 있기 때문입니다.
- 만약 기존에 브런치와 원격 저장소의 브런치를 연결하고 싶다면 아래와 같은 명령어를 사용하면 됩니다.
git branch -u <원격 저장소의 Alias> / <원격 저장소의 브랜치명>
이때도 원격 저장소의 URL이 remote add 명령어를 통해서 등록되어 있어야 가능합니다.
이제 조금 더 구체적인 예제를 살펴보겠습니다. git.ourcompany.com
이라는 Git 서버가 있고, 이 서버의 저장소(=리모트 저장소)를 Clone하면 Git은 자동으로 origin
이라는 이름을 사용합니다. origin
으로부터 저장소 데이터를 내려받고, origin/master
라는 이름의 포인터를 만듭니다. 이 포인터는 origin/master
로 불리며 직접 조작할 수 없습니다. 그리고 Git은 로컬의 master 브랜치가 origin/master
를 가리키도록 합니다. 이제 로컬의 master 브랜치에서 작업을 시작할 수 있습니다.
👉 Clone 명령어는 자동으로 리모트 트래킹 브런치를 생성합니다.
현재는 리모트 저장소(=github)가 가리키는 커밋 객체와 로컬 저장소(=my computer)에서 가리키는 커밋 객체가 f4365로 동일합니다. 이때 git.ourcompany.com 주소를 My computer(=로컬 저장소)에 클론 하고 commit을 해보겠습니다.
git.ourcompany.com에 push 하지 않았기 때문에, 리모트 저장소의 HEAD는 그대로 f4265 커밋 객체를 가리키고 있습니다. My computer(=로컬 저장소)에는 2번의 Commit이 이루어졌기 때문에 893cf 커밋 객체를 가리키게 됩니다. 리모트 저장소와 로컬 저장소의 HEAD가 차이가 나게됩니다.
이때 git.ourcompany.com에서 2번의 Commit이 이루어지면(=리모트 저장소에서 commit이 이루어짐, 혹은 다른 누군가가 push해서 origin/master의 HEAD가 제일 최신 커밋으로 옮겨감, 이는 로컬 저장소에서 commit한 것과 다름) 리모트 저장소의 HEAD가 아래와 같이 옮겨 갑니다. 아래 그림과 같이 로컬 저장소에서 확인하기 위해서는 git fetch origin
명령어를 사용해서 해당 데이터를 받아와야 합니다.
만약 리모트 저장소를 여러 개 운영을 해서, 팀원 한 명이 독립적인 리모트 저장소를 가지고 있고, 이를 기존의 리모트 저장소인 git.ourcompany.com을 clone해서 가져갔을 경우 로컬 컴퓨터에서 해당 리모트 저장소를 추가해서 확인할 수 있습니다. 이때 git.ourcompany.com 리모트 저장소에서 commit이 한 번 이루어지면 아래와 같은 그림이 됩니다.
- 31b8e 커밋 객체를 teamone/master이 clone함
- origin/master에서 새로 커밋해서 190a3 커밋 객체가 생성됨, HEAD 포인터도 이동함
git remote add teamone git.team1.ourcompany.com
git fetch teamone
👉 위의 그림과 똑같이 log를 만들려면 아래와 같은 작업을 해야합니다.
- A 리모트 저장소 생성
- A 로컬 저장소에 clone → commit 2번 → push origin main
- A 로컬 저장소에서 commit 2번 ➡️ 현재 master 위치가 됨
- A 리모트 저장소에서 commit 1번 (github 주소 들어가서 직접 수행)
- B 리모트 저장소 생성
- B 로컬 저장소에서 A 리모트 저장소 clone
- B 로컬 저장소에서 B 리모트 저장소를 추가하고 A 리모트 저장소의 내용을 push
- A 리모트 저장소에서 commit 1번 (github 주소 들어가서 직접 수행)
- A 로컬 저장소에서 B 리모트 저장소를 추가하고, A 리모트 저장소와 B 리모트 저장소를 git fetch 하면 된다.
✅ git push
git push는 로컬 저장소의 커밋 내역을 리모트 저장소로 옮기는 작업입니다. 이때 리모트 저장소에 대한 쓰기 권한이 있을 경우에만 push가 가능합니다.
git push <원격 저장소 이름> <로컬 브랜치 이름>
git push origin main
위와 같이 실행하면 로컬 저장소에 main 브런치에 있는 커밋 내역들이 origin(= 이는 리모트 저장소의 URL을 Alias를 주어 쉽게 사용하도록 만든 것이다. 만약 자신의 github repository의 주소가 https://jhcode.github.com 이라면 이를 git remote add origin https://jhcode.github.com
명령어로 remote를 추가한 것이다. 혹은 git clone <원격 저장소 URL>을 하면 자동으로 origin Alias로 만들어진다.) 이라는 Alias로 지정한 URL에 main 브런치로 커밋 내역이 올라가게 됩니다. 만약 push가 되지 않는다면 아래와 같이 몇가지 경우가 있을 수 있습니다.
- 로컬에서 remote가 연결되지 않았을 경우 → git remote add 명령어로 추가하면 됩니다.
- push 권한이 없을 경우 → 원격 저장소에서 해당 사용자에게 쓰기 권한을 주어야 합니다.
- 원격 저장소와 로컬 저장소의 커밋 내용이 다를 경우 → pull을 통해 커밋 내역을 업데이트합니다.
이 외에도 많은 경우가 있을 수 있습니다.
✅ git pull
git fetch 명령을 실행하면 서버에는 존재하지만, 로컬에는 아직 없는 데이터를 받아와서 저장합니다. 이 때 워킹 디렉토리의 파일 내용은 변경되지 않고 그대로 남아 있습니다. 서버로부터 데이터를 가져와서 저장해두고 사용자가 Merge 하도록 준비만 해둡니다.
git pull 명령은 대부분 git fetch 명령을 실행하고 나서 자동으로 git merge 명령을 수행하는 것입니다. 바로 앞 절에서 살펴본 대로 clone 이나 checkout 명령을 실행하여 추적 브랜치가 설정되면 git pull 명령은 서버로부터 데이터를 가져와서 현재 로컬 브랜치와 서버의 추적 브랜치를 Merge합니다.
#원격 저장소와 로컬 저장소를 일치시키는 과정
#fetch merge 사용
git fetch origin
git merge main
#pull 사용
git pull origin main
🏷️이미지 출처 및 참고한 사이트
Uploaded by N2T