본문 바로가기
git

<6> 생활코딩 - GIT

by ChaeLOTUS 2022. 11. 25.
728x90
branch 수련

https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-Merge-%EC%9D%98-%EA%B8%B0%EC%B4%88

 

Git - 브랜치와 Merge 의 기초

Merge 시에 발생한 충돌을 다루는 더 어렵고 요상한 내용은 뒤에 고급 Merge 에서 다루기로 한다.

git-scm.com

 

 

 

 

어떤 사람이 저장소를 만들고 커밋을 마스터 브랜치로 세 번 하였다.

 

그런데 이 상태에서 어떤 이슈가 발생한다. (여기서 말하는 이슈는 기능이 추가 또는 버그 같은 일.)

이 이슈를 해결하기 위해서 일반적으로 깃에서는 브랜치를 만든다.

그 브랜치를 만들기 위해서 

git checkout -b iss53​이라는 명령을 사용한다.

-b의 역할은 iss53이라는 브랜치를 만들고 그 브랜치에 체크아웃 하는 이 두개의 행위를 -b를 붙이면 한 번에 할 수 있다.

 

c2커밋을 마스터와 iss53이 동시에 가리키게 된다.

vim index.html => iss53에서 내용을 수정하고 커밋을 하면

 

C2 에서 iss53은 c3라는 커밋을 가리키게 된다.

그런데 갑자기 급하게 처리해야 된 일이 끼어들어서 그것을 해결하기 위해서 마스터 브랜치에서 다시 브랜치를 달 것이다.

git checkout master
그러기 위해서는 마스터 브랜치로 체크아웃을 먼저 한다.
git checkout -b hotfix
그리고 핫픽스 라고 하는 브랜치를 새로 만든다.
vim index.html
git commit -a -m 'fixed the broken email address'

이 상태에서 hotfix는 급하게 처리해야 될 이슈이기 때문에 핫픽스 내용을 수정을 다 끝내고 마스터 브랜치로 병합을 하려고 하면 

git checkout master
마스터 브랜치로 체크아웃을 하고
git merge hotfix
마스터 브랜치 상태에서 horfix를 merge 한다.
git merge hotfix
Updating f42c576..3a0874c
Fast-forward
 index.html | 2 ++
 1 file changed, 2 insertions(+)
 
 merge를 하면 Fast-forward라는 메세지가 뜬다.
 이것이 merge를 했을 때 경험할 수 있는 첫 번째 상황이다.

Fast-forward는 영어로 하면 빨리감기라는 뜻이다. 이게 무슨 뜻일까

마스터 브랜치에서 hotfix가 독립한 이후에 마스터 브랜치는 어떠한 커밋도 새로 만들지 않았다. 이 경우에 마스터 브랜치로 핫픽스를 병합한다라는 것은 마스터 브랜치가 가르키는 커밋을 핫픽스가 가리키는 커밋으로 빨리감기 하면 병합 작업이 끝난다.

이러한 형식의 브랜치를 Fast-forward라고 부른다.

Fast-forward 방식으로 병합을 하게 되면 그 결과는 밑의 사진처럼 된다.

이제 마스터는 hotfix와 같은 커밋을 가르키게 된다. 그렇기 때문에 별도의 커밋을 생성하지 않는다.

이러한 케이스, 별도의 커밋을 생성하지 않고 그냥 마스터가 기리키는 커밋이 누구인지를 바꾸기만 하는 이 방법을 Fast-forward라고 한다. 그리고 이제 핫픽스가 끝났고 브랜치가 많으면 지저분 하니깐 핫픽스를 지운다.

git branch -d hotfix

핫픽스까지 다 처리 되었으니 iss53을 처리해야 한다. 

그럼 다시 체크아웃하고 파일을 수정하고 커밋한다.

git checkout iss53
vim index.html
git commit -a -m 'finished the new footer [issue 53]'

이 상태에서 iss53에 대한 작업은 끝났다고 하면 마스터로 체크아웃을 하고 iss53을 마스터로 merge 한다.

$ git checkout master
Switched to branch 'master'
$ git merge iss53

Merge made by the 'recursive' strategy.//merge 하면 이러한 메세지가 나온다.
index.html |    1 +
1 file changed, 1 insertion(+)

 Merge 는 재기적이라는 뜻이고 strategy는 전략이라는 뜻인데 
 이전에는 Fast-forward라고 나왔는데 이번에는 다른 메세지가 나왔다.

이것은 어떤 상황이냐면 iss53이 마스터로 독립한 이후에 마스터에는 변화가 생겼다. 원래 마스터는 c2커밋을 가리키고 있었는데 그 이후에 마스터가 c4라는 별도의 커밋을 가르키고 있다. 이 경우에는 Fast-forward를 할 수 없다. 

그럼 깃은 내부적으로 어떻게 동작하냐면 

1. 마스터와 iss53의 공통의 조상을 찾는다. 그리고 3-way merge 라고 하는 내부적인 방법을 이용해서 c4와 c5를 합치고 그 다음 이 두개를 합쳤다는 것을 알려주는 이 두개를 합쳤다 라는 정보를 갖고 있는 별도의 커밋을 만든다.(c6라는 커밋 자동으로 만들어 줌)

c6 커밋이 c5와 c4에서 비롯된 버전이라는 것에 대한 정보게 c6에 담겨있게 된다.

 

그래서 Fast-forward와 아닌 방식의 차이점은 Fast-forward는 커밋을 생성하지 않는다.

하지만 아닌 방식은 merge 커밋이라고 하는 형태의 커밋을 생성한다.

728x90

'git' 카테고리의 다른 글

<8> 생활코딩 - GIT  (0) 2022.11.28
<7> 생활코딩 - GIT  (0) 2022.11.27
<5> 생활코딩 - GIT  (0) 2022.11.24
<4> 생활코딩 - GIT  (0) 2022.11.21
<3> 생활코딩 -GIT  (0) 2022.11.11

댓글