본문 바로가기

형상관리 Git

로컬에 대응하는 원격 브랜치, HEADER에 대하여

https://www.youtube.com/watch?v=6WDDeSDZcwM   (Header, Branch, commit간의 관계를 설명한 영상)

https://yohda.tistory.com/entry/GIT-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%9E%91%EC%84%B1%EC%A4%91  (정말 유익한 글)

 

 

요약: A라는 브랜치에 checkout한 상태에서 새로운 B라는 브랜치를 만들었다. 이렇게 되면 B브랜치에는 A브랜치가 가지고 있는 파일상태가 그대로 전달된다.

A라는 브랜치에 checkout한 상태에서 새로운 B라는 브랜치를 만들었다. 이렇게 되면 B브랜치에는 A브랜치가 가지고 있는 파일상태가 그대로 전달된다. 그것을 증명하는 내용이 위 비디오에도 나오지만 아래의 내용에서 확인할 수 있다.

나는 developlocalbranch에 checkout한 상태에서 git branch develop 이라는 명령어로 develop이라는 로컬 브랜치를 만들었다. 그리하여 아래와 같은 develop브랜치를 새로 얻었다. 그리고 develop 브랜치로 checkout하여 무턱대고 git push origin develop을 하였더니 아래와 같은 결과가 나온것이다. 즉, 이전 브랜치의 파일, 폴더 상태가 그대로 따라오는 것이다.
resued, Total, pack-reused가 모두 0임을 확인할 수 있다.

 

==========================================================================================

나는 예전에 이런 생각을 하고 혼동을 한적이 있다. 내가 로컬에서 새로운 새로운 브랜치를 만든후에 git push origin (새로만든 브랜치이름) 이라는 명령어를 날리면 나는 원격에 로컬에 내가 만든 브랜치와 이름이 같은 새로운 브랜치를 만들어 주지도 않았는데 어떻게 원격은 이 내용을 알고 이를 성공적으로 반영하는 걸까?

이러한 의문은 상단의 링크로 올려둔 글을 읽으며 모두 풀렸다.

 

" git push 원격저장소 별칭 + 로컬에 내가 생성한 브랜치 이름 "

 

이었던 것이다. 즉 만약에 원격에는 처음에 내가 로컬에 생성한 브랜치가 당연히 없을것이다. 그러나 위와 같은 명령어를 입력해주면 원격에는 내가 입력해준 로컬브랜치의 이름과 같은 브랜치가 새로 생기고 거기에 push한 내용이 적용되는 적용되는 것이다.

 

내가 이전에 햇갈려하던 중에 아래와 같은 상황이 있다(전제로 해야 할것이 나는 내가 현재 어떠한 브랜치에 checkout한 상태인지를 모르는 수준이었다). 아래 코드에는 나와있지는 않지만 git status를 한 상황에서 다수의 파일이 변경되어 git add . 시 엄청나게 많은 파일이 staging상태에 올라와 있었고 그것이 모두 git commit -m "~~~" 로 commit되어 있는 상태였다. 이런 상황에서 나는 아래와 같이 git push origin main을 입력하였는데 내 예상과는 다르게 단순히 그 답변으로 Everything up-to-date라는 황당한 응답을 받은 것이다. 나는 분명 엄청나게 많은 파일을 commit 했고 push 했는데 모든게 최신상태라고? 이해가 안됐다. 하지만 위의 설명을 이해하면 다 이해가 가는 내용이었던 것이다. 나는 지금 developlocalbranch(HEAD -> developlocalbranch)브랜치에 checkout된 상태인데 git push origin developlocalbranch를 하지않고 git push origin main을 하니 이와같은 예상치 못한 답변을 받은 것이다. (참고로 내가 어떤 브랜치에 checkout되어있는가에 따라 내 로컬에 있는 파일구조 자체가 달라진다. 즉 내가 어떤 브랜치에 checkout되있는가에 따라 git add ., git commit -m "~~" 가 그 브랜치에 적용되는 것이다)

내가 지금 main브랜치에 checkout한 상태도 아닌데 git push origin main이라고 명령어를 입력하니 아무것도 commit 되어있지 않은 상태인 main브랜치가 정상적으로 Everything up-to-date라는 반응을 뱉은 것이다.

(복습. 그리고 위의 초록색으로 HEAD-> developlocalbranch라고 볼수 있는데 이것은 내 HEAD포인터가 developlocalbranch 브랜치를 가리키고 있다는 것이다)

그렇다면 예를들어 내가 main브랜치에 checkout하여 여러 내용을 수정한후 commit 한 후에 다른 브랜치로 checkout한 후 main브랜치를 git push origin main 라는 명령어로 원격저장소의 main브랜치에 push 하면 어떻게 될까? 그때는 정상적으로 push가 이루어진다.