본문 바로가기

부스트캠프 AI Tech 3기/이론 : U-stage

[Day36] Github 특강 1-8 HEAD, master, branch

git log

지금까지 commit한 내역들을 보는 명령어이다

git log --oneline
git log --oneline --graph

으로 보면 좀 더 깔끔하고 그래프로 볼 수 있다.

 

상단에 메뉴에서 터미널-새터미널로 열어서 입력하면

HEAD->master

이렇게 내역들이 나온다.

 

HEAD

HEAD가 master를 가리키고, master은 최신 commit인 v2를 가리키고 있는 상태이다. 이것을 git graph로 보면

HEAD->master

이 상태이다. 노랑으로 내가 동그라미 친 저 표시가 head가 저 commit에 있다는 것을 가리킨다.

HEAD가 master를 가리키고 있다는 뜻에서 master의 테두리가 진한 것(=색이 있는 상태)이다.


 

HEAD,master

이 상태가 HEAD가 master를 가리키지 않고 이 commit을 직접 가리키는 상태이다. 

HEAD,master

git log로 살펴보면 이렇다


이 상태로 만드는 방법은

git graph에서 해당 commit에 우클릭을 해서 checkout을 누르면 되고 다시 HEAD->master 상태로 만들려면 master에 마우스를 대고 더블클릭하면 된다.

 

HEAD는 working directory가 어떤 버전과 같은지를 가리킨다.

working directory는 .git 폴더를 제외한 사람들이 작업하는 공간이다.

Working directory

정리하면 이렇게 된다.

마스터는 마지막 커밋을 가리킨다.

HEAD는 현재 커밋을 가리킨다.

 

그 이후로 새로 만든 현재 버전의 parent는 HEAD가 가리키는 버전이 된다. HEAD는 마스터를 가리키고 마스터가 가리키는 버전이 parent가 되는 것이다. 그럼 이제 새로운 버전에서의 HEAD는 새로운 commit을 가리켜야 하는데, HEAD가 master를 가리키니까 master에 새로운 commit을 가리키게 된다.

 

Checkout

각 버전은 그 버전이 만들어진 시점의 snapshot을 가지고 있다. 그래서 이전 시점의 commit으로 돌아갈 수도 있다. HEAD는 working directory가 어떤 버전과 같은지를 가리키기 때문에 HEAD를 원하는 시점으로 옮기면 된다. 이것이 checkout 이다.

v2

현재 v2의 최신 버전 상태이다.

현재는 v2에 HEAD가 있지만 v1에 대고 우클릭 후 checkout을 누르면

이렇게  경고가 뜬다. Yes, checkout을 해준다.

 

그러면 v1에서는 add2.txt가 없었기 때문에 저렇게 삭제되는 표시로 나타나고, add1의 2라는 코드는 사라진다.

 

Checkout은 HEAD를 옮긴다.

그래서 로그를 보면 HEAD가 어디있는지부터 살펴보아야한다. HEAD와 working directory가 같지 않다면 아직 commit하지 않았구나를 알 수 있다.

 

git log 나  git log -oneline 는 head를 기점으로 parent들을 따라간다. 그래서 master가 더 최신버전에 있다면 master가 보이지 않는다.

그래서

git log --oneline --all

를 쓰면 전체 commit이 다 보인다.


이제 과거는 그만 보고 다시 돌아와보자

현재는

HEAD가 v1에 있다.

 

각 command마다 다른 결과가 나온다.

  • git checkout commitID
    HEAD->master가 아닌 commit을 가리키는 상태가 된다. 이 상태를 Detached HEAD state라고 한다.
    Git graph에서 버전(commit)에 대고 우클릭한 후 chekcout하는 것과 같다.

  • git checkout master
    HEAD->master가 된다.
    master를 직접, master 브랜치를 가리킨다.
    Git graph에서는 master이라는 아이콘에 대고 우클릭 한 후 checkout branch를 누르는 것과 같다.

 

+) 참고

master를 옮기는 방법은

원하는 commit에 대고 메뉴에서 Rest current branch to this commit을 하면 된다.

Detached HEAD State

(Head,master)이나 아예 각각 다른 commit에 (HEAD) (master)이 되어 있는 상태이다.

원래 (HEAD->master)인 Attached HEAD state에서는 HEAD가 계속해서 현재 버전의 commit을 따라 움직이는데 HEAD가 master를 가리키고 있기 때문에 master가 움직인다.

하지만 Detached HEAD state에서는 HEAD가 master를 가리키지 않기 때문에 HEAD만 움직이게 되는 것이다.

 

Detach HEAD state는 잘못해서 commit이나 merge하지 않고 checkout을 하면 코드가 날아갈 수 있다
-> 실험을 해보고 코드를 버리기도 쉽다
-> branch로 발전 (master같은 역할을 하나 더 만드는 것이다)

 

방법은 아까와 같다. 굳이 다른 버전으로 옮겨서 checkout을 해서 Detach HEAD를 하지 않아도 같은 commit에서 Detach HEAD로 만들 수 있다.

이렇게 (HEAD->master) 상태에서 (HEAD,master)로 바꿀 수 있다.

 

Branch

Detached HEAD로 만들고 새 코드를 작성해서 commit을 한 후에 그 내용을 담는 branch를 만들려고 한다

그러면 새 commit(exp)에 마우스 우클릭 - Create Branch를 눌러준다.

새 브랜치 이름을 적고 Create Branch를 해주면

master와 같은 모양의 로고를 가진 exp branch가 만들어진다. exp에는 origin이 있지 않는데 그 이유는 아직 원격에서 공유되고 있지 않기 때문이다.

이 상태에서 HEAD는 아까 창에서 check out을 누르지 않았기 때문에 exp를 가리키지 않고 exp가 만들어졌던 commit을 가리키는 여전히 detached HEAD 상태이다.

 

Merge

  • master가 exp를 병합
    실험이 끝남
    1번 일어남
  • exp가 master를 병합
    미리 update를 받아둠
    자주 일어남

exp를 master에 병합하려고 하면 exp에 마우스를 대고 우클릭->Merge into current branch를 누른다.

Yes, merge를 누른다.

그럼 master branch에는 exp의 내용과 master의 내용이 모두 들어있게 된다.


Pull= Fetch + Merge

Fetch는 다운로드만 받는 것이기 때문에 conflict가 나지 않는다.

 

[Day36] Github 특강 1-5 git push / pull (VSCode)

현재 v4라는 Commit까지는 원격저장소(github)에 올라가 있고, v5는 아직 동기화가 되지 않은 상태이다. v4의 origin/master는 git이 자동으로 만들어서 관리하는 remote tracking branch이다. 마지막으로 pairin..

chae52.tistory.com

의 첫 부분에 나왔던 것처럼 origin/master도 하나의 branch로 취급되어 원격 저장소에 저장되어 있는 다른 branch의 코드 상황을 받아볼 수 있고 거기가 origin/master인 것이다.