Antilog의 개발로 쓰다
article thumbnail
반응형

이전 강의 내용에 이어서 진행합니다.

HEAD와 master라는 기본이 되는 branch가 가진 값이 무엇인지 알고있다는 가정하에 내용을 진행합니다

2019/11/09 - [분류 전체보기] - [Git]Git 과정 자세히 알아보기, HEAD, master

 

[Git]Git 과정 자세히 알아보기, HEAD, master

Git 명령어 알아보기 2019/11/03 - [Git] - [Git] Git 명령어 살펴보기 [Git] Git 명령어 살펴보기 Git 은? Git 컴퓨터 변경 사항 추적, 여러 사용자 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시..

antilog.tistory.com

 이전 포스팅을 보고

HEAD는 현재 브랜치인 master를 가리키고, master는 현재 커밋을 가리키는 것을 생각하면 이전 포스트 내용처럼

아래 그림과 같은 상태임을 알 수 있습니다.

하지만 우리는 git을 사용할 때, 파일을 단하나만 커밋하고 단한번만 올리지 않습니다.

이제 실제 사용과 비슷한 경우를 위해서

현재 워킹디렉토리 파일을 바꾸어봅시다.

해당 경우에는 이전 untracked 상태와 다르게 Uncommitted Change 라는 상태로 변경됩니다.

이것은 현재 파일은 바뀐 상태라 변경사항이 있는데 커밋은 하지 않은 상태라는 것을 뜻합니다.

 

해당 상태에서 커밋을 하게되면

git commit -a -m "2nd"

위 명령어는 add와 commit을 동시에 하는 명령어입니다.

단, 해당 명령어는 변경 사항이 있을 경우만 동시에 가능합니다.

uncommitted change의 상태(modified)의 파일만 자동으로 찾아서 해당 내역을 커밋합니다.

이렇게 커밋을 진행하면 아래와 같은 상태가 됩니다.

사진 내용과 같이 커밋을 진행하면 자동적으로 master와 HEAD는 새로운 커밋을 가리키게 됩니다.

그리고 후에 생성된 커밋을 이전에 생성된 부모 커밋의 정보를 가지고 있어서, 해당 커밋의 부모를 따라서 히스토리를 추적할 수 있습니다. (Linked LIst 처럼 이어짐)

새로운 branch와 tag라는 또 다른 포인터
$git tag v0.1
$git branch run

git tag "tag명" 명령어로 현재 커밋을 가리키는 tag를 만들 수 있는데 이 tag는 주로 해당 버전에서 배포를 나간 표현을 할때 사용하는 포인터이다.

해당 태그는 후에 설명할 branch와 다르게 지금 현재 가리키는 커밋 id를 바꿀 방법은 없습니다.

만약 그럼에도 태그가 가리키는 커밋 id를 변경하고 싶은 경우는 해당 태그를 삭제하고 다시 태그를 만드는 명령어를 사용하여 내용을 바꿀 수는 있습니다.


tag내용을 바꾸지 못하는 이유?

더보기

해당 부분에서 어떠한 버전으로 배포가 되었다는 정보를 담고있는 포인터이므로

어떤 부분에서 배포가 되었는지 알리는 정보가 바뀐다면 버전관리에 이상이 생길 수 있다.


위에 사진에서처럼 branch로 새롭게 생성한 run이라는 브랜치는 지금 현재 커밋id를 가리킵니다.

 

지금 이 상태에서 다시 현재 워킹디렉토리에 파일을 수정합니다.

현재 워킹디렉토리 파일이 변경되어 커밋이 되어있지 않으니 당연히 Uncommitted change 상태가 됩니다.

 

$git commit -a -m "3rd"

그리고 변경한 파일을 commit 하면 지금 현재 HEAD가 가리키는 브랜치의 master는 자동적으로 최신 커밋id를 가리키게 됩니다.

 

만약 지금 작성하는 파일이 사칙연산을 수행하는 클래스를 구현한다고 가정합시다.

지금 현재 위의 상태까지는 사칙연산 클래스에 더하기, 빼기를 구현하였는데

갑자기 마음이 변해서 곱하기와 빼기를 먼저 구현하고 싶어졌습니다.

그러기 위해서는 현재 커밋상태가 아닌, 이전 클래스만 구현된 efe228a 상태로 돌아가야합니다.

그러면 해당 커밋id를 가리키는 브랜치인 run으로 이동하면 되겠죠?

$git checkout run

위의 명령어로 run 브랜치로 이동하였고 아래와 같은 상태가 되었습니다.

HEAD가 가리키는 브랜치는 run이 되었습니다.

또한 이렇게 해당 브랜치로 넘어가면 run branch의 commit의 snapshot으로 변경됩니다.

snapshot의 용어를 모를 경우 아래 포스팅에서 참고 가능합니다.

2019/11/03 - [Git] - [Git] Git 명령어 살펴보기

 

[Git] Git 명령어 살펴보기

Git 은? Git 컴퓨터 변경 사항 추적, 여러 사용자 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템. Github Git을 사용하는 프로젝트를 지원해주는 웹 호스팅 서버, 오픈소스로 자신의 코드를 공..

antilog.tistory.com

 

위에 예시에서 현재 워킹디렉토리에 클래스에서 곱하기, 나누기를 먼저 구현한 파일로 변경하면

또 파일은 변경사항이 있지만 커밋을 하지 않은 상태이므로 uncommitted change 상태가 됩니다.

 

그리고 다시 커밋을 하면

$git commit -a -m "new3rd"

위 그림처럼 동일한 부모 커밋id를 가진 자식 커밋id가 또 생성됩니다. 따라서 워크트리는 2갈래로 갈라지게 됩니다.

 

여기까지가 직접 알아보는 branch의 개념입니다.

여기까지 하면서 알아본 결과, 

branch

생성시, 현재 커밋 id의 값을 가진다.

HEAD

지금 참조하는 branch를 가리키는 값을 가진다.

로 간단히 설명할 수 있을 것 같습니다.

 

+

지금 현재 브랜치가 나뉘어진 상태로 온라인 레포지터리로 올리면

서로다른 브랜치 이름으로 각각 다른 상태로 업로드가 됩니다.

 

나누어진 브랜치를 합치는 과정은 다음 시간에 계속 하도록 하겠습니다.

반응형
profile

Antilog의 개발로 쓰다

@Parker_J_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...