branch 수련
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 커밋이라고 하는 형태의 커밋을 생성한다.
'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 |
댓글