우리가 깃허브에서 리모트 레포지토리를 만들어서 로컬 레포지토리의 내용을 보내기위해
커맨드 3개를 실행 했던 적이 있었다.
git remote add origin https://github.com/SeopE9611/[remote repository name] .git
git branch -M main
git push -u origin main
여기서 단순 복붙해서 로컬 레포지토리를 넣었는데 " origin " 이 단어에 의미를 설명하고자 한다.
Origin
먼저 첫 번째 커맨드를 보면
git remote add origin https://github.com/SeopE9611/ [remote repository name].git
이 커맨드에서 remote는 리모트 레포지토리에 관한 작업을 할 때 쓰는 커맨드이다.
그리고 그 뒤의 add는 새로운 리모트 레포지토리를 등록하겠다는 뜻이다.
그 다음에는 origin 이 표현은 리모트 레포지토리를 origin이라는 이름으로 등록하겠다는 뜻이다.
그러니까 이 커맨드를 실행하고 나면 https://github.com/SeopE9611/ [remote repository name].git을
origin으로 간단하게 나타낼 수 있게 되는 것.
사실 origin이 아닌 본인이 원하는 다른 단어를 입력해도 큰 상관은 없다.
하지만 Git에서는 리모트 레포지토리를 최초로 추가할 때 origin이라는 이름으로 가리키는 것이 관례화되어 있다.
origin은 ‘근원’, ‘기원’이라는 뜻을 가지고있다.
아마도 다른 사람의 리모트 레포지토리를 자신의 컴퓨터로 가져와서 작업을 하는 사람의 입장에서는 리모트 레포지토리가 프로젝트의 근원이 되는 존재이기 때문에 그런 관습이 생긴 것으로 추측해볼 수있다.
origin 말고 hello나 레포지토리 별명 등 써도되지만 되도록 관례에 따라 origin을 써주는 게 좋다.
Remote Repositoy에 있는 브랜치
'git push -u origin main' 이 커맨드의 뜻은
현재 로컬 레포지토리에 있는 main (과거:master) branch의 내용(=main 브랜치와 관계된 모든 커밋들)을
origin이라는 리모트 레포지토리로 보낸다는 뜻이다.
이때 같은 이름의 브랜치로 전송하게 되는데 만약 origin이라는 리모트 레포지토리에 main 브랜치가 없으면
main 브랜치를 새로 생성하고 push 한다.
(여기서 옵션 -u는 --set-upstream이라는 옵션의 약자이다.)
이렇게 --set-upstream(-u) 옵션을 주면
로컬 레포지토리에 있는 main 브랜치가 origin에 있는 main 브랜치를 tracking(추적)하는 걸로 설정된다.
tracking이라는 건 로컬 레포지토리의 한 브랜치가 리모트 레포지토리의
한 브랜치와 연결되어 그것을 계속 바라보는 상태가 되는 것이라고 생각하면 된다.
이렇게 맺어진 연결 상태를 tracking connection이라고 한다.
만약 로컬 레포지토리에 A라는 브랜치가 있고, 리모트 레포지토리에 B라는 브랜치가 있을 때
이런 tracking connection이 서로 맺어진 경우, B 브랜치를 A 브랜치의 upstream branch라고 한다.
지금은 구별하기 위해서 A와 B라고 표현했지만 보통은 같은 이름인 경우가 대부분이다.
이렇게 tracking connection이 한번 설정되고 나면, 사용자가 현재 main 브랜치에 위치해있을 때,
'git push' 라고만 써도 자동으로 리모트 레포지토리의 main 브랜치를 대상으로 git push가 동작하고,
'git pull' 라고만 써도 리모트 레포지토리의 main 브랜치를 대상으로 git pull이 동작한다.
사실 --set-upstream(-u) 옵션을 주지 않아도 그 후에 git push와 git pull을 할 수 있긴 하지만
맨 처음에 이 옵션을 주지 않으면 tracking connection이 없기 때문에
나중에 git push를 하고 싶을 때 'git push origin:main' 이런 식으로 적어줘야 한다.
그러니까 tracking connection이 없으면 매번 git push를 해줘야 한다.
git pull도 마찬가지로 이런 식의 복잡한 표현이 필요하게 된다.
그냥 처음부터 tracking connection을 설정하고
그 이후부터는 git push, git pull이라고만 써서 편하게 하는 게 좋다.
origin/main의 의미
로컬 레포지토리의 main 브랜치와 리모트 레포지토리의 main 브랜치
같은 이름이지만, 서로 다른 2개의 브랜치가 있다는 걸 알았다.
리모트 레포지토리에 있는 main 브랜치는 깃허브 페이지에서 볼수있지만
컴퓨터에서도 확인해보기위해 커밋 히스토리를 살펴보면
전 글에서 branch 작업을 하다보니 조금 꼬였긴 했지만..
main은 로컬 레포지토리의 main 브랜치를 나타내고
origin/main가 리모트 레포지토리의 main 브랜치를 나타낸다.
이때까지 로컬 레포지토리의 main 브랜치에서 여러 커밋을 했지만 그러고나서 git push를 해준 적은 없어서
origin/main 가 main보다 이전의 커밋을 가리키고 있는 것이다.
만약 main, premium 브랜치 둘 다에서 리모트 레포지토리로 git push 하게되면
이제 origin/main도 main와 같은 커밋을 가리키게 될 것이다.
한번 시도해보자
우선 main 브랜치로 이동해서 push까지 해보자
(' git checked main ' -> ' git push ' )
그러면 이때까지 main 브랜치에서 작업했던 커밋들이 전부 리모트 레포지토리의 main 브랜치로 올라갈 것이다.
push 한 상태에서 다시 커밋 히스토리를 보면 두 브랜치가 같은 커밋에 놓여있는 것을 볼 수있다.
즉 리모트 레포지토리의 main 브랜치도 이제 최신 내용을 가지고 있는 것이다.
하지만 여기서 끝이아니다.
로컬 레포지토리에서 premium 브랜치도 만들었었는데 똑같이 리모트 레포지토리에 올려보자
그런데 'fatal: The current branch premium has no upstream branch' 라고
upstram branch를 갖고 있지 않다고 오류가 출력되었다.
그 아래에 ' git push --set-upstream origin premium '을 실행하라고 적혀있다.
위에서 적었다시피 로컬 레포지토리에 있는 브랜치를 리모트 레포지토리로 맨 처음 push 할땐
'--set-upstream' 이라는 옵션을 줘야한다고 했다.
그래야 tracking 정보가 설정 되어서 'git push'라고만 써도 된다.
premium 브랜치는 리모트 레포지토리에 처음 올리는 것이기 때문에 써줘야한다.
터미널에서 주어진 옵션을 사용해보자(' git push --set-upstream origin premium ' )
이렇게 하고 깃허브 페이지 가서 확인해보면
리모트 레포지토리에서도 premium 브랜치가 생겨있는 것을 확인 할 수있다.
터미널에서 히스토리를 보면 리모트 레포지토리의 premium 브랜치가 보이는 것을 확인 할 수있다.
'Git' 카테고리의 다른 글
(21) Git -reset / checkout [심화] (0) | 2024.09.10 |
---|---|
(20) Git - HEAD와 branch의 관계 (0) | 2024.09.09 |
(18) Git - branch marge (0) | 2024.09.06 |
(17) Git - branch (브랜치) (0) | 2024.09.06 |
Git (12)~(16) 까지 커맨드 정리 (0) | 2024.09.06 |