안녕하세요~ 항상 나아가는 개발자 pink_salt 핑솔입니다!
코드프레소 Java 웹 개발 체험단 활동을 하고 있습니다.
이번엔 git 브랜치 병합과 충돌이 발생했을 때 어떻게 해결하는지 알아보는 시간을 갖겠습니다.
추가적으로 Git Tag에 대해서 기본적인 내용에 대해서도 보겠습니다.
이번엔 '실무자가 알려주는 Git 활용한 프로젝트 관리'의 Git 브랜치의 이해 강의를 듣고 공부한 내용을 정리하여 포스팅을 진행하겠습니다.
이슈 해결이 완료되면?
이슈 해결이 완료되면 branch를 master로 합병하는 git merge를 진행하게 됩니다.
git merge에 관련하여 실습을 진행하겠습니다.
브랜치 병합(merge)
- 기준이 되는 브랜치로 이동해서 병합을 진행해야 합니다.
- issue 브랜치 -> master 브랜치
브랜치 이동 - 그럼 지금 HEAD 포인터는 master를 가리키고 있습니다.
- 합쳐질 브랜치를 병합합니다.
-
git merge issue
- 이러면 master는 issue의 최신 커밋으로 이동하게 됩니다.
-
Fast-forward Merge
브랜치의 위치만 최신 커밋으로 이동시키는 방식을 말합니다.
git merge issue
각 브랜치 별로 commit을 확인할 때는 git log보다 더 나은 명령어가 있습니다.
git branch -v
브랜치가 어떤 커밋을 가리키고 있는지 빠르게 확인할 수 있습니다.
사용하지 않는 브랜치를 삭제
더 이상 사용되지 않는 브랜치를 삭제하기 위해서는
git branch -d 브랜치명
을 사용하면 됩니다.
지금 issue 브랜치는 더 이상 사용하지 않기 때문에 삭제해 보겠습니다.
브랜치가 삭제되고 확인되지 않는 것을 알 수 있습니다.
브랜치가 삭제될 때는 브랜치와 관련된 commit 또한 사라지는 것이 아닙니다.
그렇기 때문에 브랜치를 쉽게 만들고 병합하고 삭제하여 관리가 아주 편합니다.
이번에는 feature-login 브랜치 또한 master에 병합(merge)해보겠습니다.
- 기준이 되는 브랜치로 이동해서 병합해야 합니다.
- feature-login 브랜치 -> master 브랜치
- git branch
- 합쳐질 브랜치를 병합합니다.
- git merge feature-login
- 이 명령어를 입력하면
머지 메시지 관련 창이 나옵니다. 각 회사, 조직에 맞게 가이드에 따라 진행하면 됩니다.merge 메시지 - 일단 이 강의에서는 default 메시지로 진행합니다.
- Esc + :wq로 저장하고 나오면 merge가 진행됩니다.
하지만 이때는 fast-forward 방식을 사용할 수 없습니다.
그래서 세 가지 commit에 대한 merge가 진행됩니다.
3-way Merge
위의 3개 커밋을 모두 고려하여 병합하는 방식으로 3-way Merge의 결과는 새로운 커밋으로 생성됩니다.
- master와 feature-login 브랜치의 공통 부모 커밋
- master 브랜치의 최신 커밋
- feature-login 브랜치의 최신 커밋
결국 이렇게 새로운 merge commit이 발생하게 되고 HEAD 포인터의 master브랜치는 merge commit을 가리키게 됩니다.
브랜치 병합은 항상 성공하는가?
현업에서 branch 병합은 빈번하게 일어나지만 실패할 때도 많습니다.
이와 관련한 실습으로 Commit 3을 가리키는 Commit 6을 생성해보겠습니다.
일단 branch를 feature-login으로 변경합니다.
그리고 feature-login 브랜치의 MainService.java 파일에 코드를 추가합니다.
git add와 git commit을 진행합니다. 그러면 HEAD 포인터는 feature-login을 가리키고 feature-login의 여섯 번째 커밋이 생성된 것을 확인할 수 있습니다.
그러면 결과를 그림으로 보면 밑의 그림과 같게 됩니다.
이제 feature-login 브랜치를 master 브랜치에 merge 병합시켜 보겠습니다.
그럼 기준이 되는 master 브랜치로 이동하여 merge를 진행합니다.
그리고 merge를 진행합니다.
merge 하는데 충돌이 발생했다는 것을 확인할 수 있습니다.
merge를 진행하는데 master의 MainService.java와 feature-login의 MainService.java의 3번째 줄에서 충돌이 일어난 것을 확인할 수 있습니다.
변경사항의 충돌(conflict)
Conflict을 발생시켜
개발하는 기능의 목적에 맞게 어떤 변경사항을 어떻게 반영할지를 결정하고 수정하여 반영하는 것을 conflict을 해결하는 과정이라고 합니다.
- 직접 merge 하기
- 툴을 이용해서 merge 하기
1. 직접 merge 하기
MainService.java 파일에 들어가면 우리가 알던 내용에 무언가 적혀있는 것을 볼 수 있습니다.
<<<<HEAD부터 -------까지의 코드는 HEAD가 가리키는 master 브랜치의 MainService.java의 코드입니다.
======부터 >>>>>feature-login까지의 코드는 feature-login 브랜치의 MainService.java의 코드입니다.
두 가지 변경점에서 개발자가 생각하여 어떤 것을 살리고 버릴 것인지 아니면 모두 살릴 것인지 등에 대해 결정해야 합니다.
2. mergetool 사용하기
git mergetool
-> vimdiff 입력
이 화면을 보면 4개의 창이 나타나게 됩니다.
왼쪽부터 첫 번째 화면은 master 브랜치의 MainService.java 내용입니다.
두 번째 화면은 master 브랜치와 feature-login의 MainService.java의 공통분모 부분입니다.
세 번째 화면은 feature-login 브랜치의 MainService.java의 내용입니다.
네 번째 화면은 지금 우리의 디렉터리에 있는 MainService.java의 실제 내용입니다.
왜 밑의 창을 제외하고 3개의 창이 위에 나타나는가?
-> 3-way merge 방식이기 때문입니다.
Tip! -> 한 줄을 지우고 싶을 땐 'dd'를 누르면 된다.
dd를 사용하여 conflict 기호를 모두 삭제해보았습니다.
그리고 Esc + :wq 누르면
이제 위의 3개의 창은 변경하고 저장할 필요가 없기 때문에
모든 창을 각각 클릭한 후 Esc + :q를 눌러서 나옵니다.
이제 merge가 제대로 되었는지 확인하고 commit을 생성해보도록 하겠습니다.
vi MainService.java에 들어가니까 제대로 된 것을 확인할 수 있습니다.
Esc + :q를 해서 나온 뒤 커밋을 생성하겠습니다.
git add를 진행하고
git commit을 진행합니다.
자동으로 commit 메시지가 생성된 것을 볼 수 있습니다.
Esc + :wq로 나오고
이렇게 merge가 되었고 6번째 커밋도 확인할 수 있습니다.
결론적으로 밑의 그림과 같이 됩니다.
Git의 Tag
- 태그란?
- 꼬리표
- git에서 태그란?
특정 브랜치 위에 꼬리표처럼 생성이 되는 것을 말합니다.- 태그는 특정 시점의 소스코드 정보를 기록합니다.
- 프로젝트 진행 중 의미 있는 시점의 커밋을 태깅한 것입니다.
- 의미있는 시점?
- 1차 목표 기능 개발 완료되었을 때
- 매우 중요한 이슈가 해결되었을 때
- 기능 개발 완료 및 테스트까지 모두 완료 및 통과하였을 때
- 고객에게 소프트웨어를 배포할 때
- 의미있는 시점?
git의 원격 레파지토리에서는 branches 옆에 tags라는 것을 확인할 수 있습니다.
태그를 살펴보면 rc(숫자)를 볼 수 있습니다.
rc0은 고객에게 소프트웨어를 전달하기 위해서 어느 정도 진행이 된 버전을 말합니다.
차례대로 rc 뒤의 숫자가 증가할 때마다 지속적으로 테스트하고 개발한 것의 버전을 말합니다.
rc2가 되면 최종적으로 고객에게 소프트웨어가 릴리즈 되어도 된다고 결정하여
v2.3.0으로 태그를 만들 수 있습니다.
git 태그의 종류
- Lightweight 태그
- 버전명과 같은 태그명만 남기는 태그를 말합니다.
- Annotated 태그
- git 데이터베이스에 태그를 만든 사람의 이름, 이메일, 태그 생성 날짜, 태그 메시지 등을 저장한 태그를 말합니다.
Git 태그 생성하기
- Lightweight 태그 생성
git tag [태그명]
- Annotated 태그 생성
git tag -a [태그명] -m [태그 메시지]
Annotated 태그 생성하기
git tag -a v1.0 -m "Implemented login feature"
git log
그럼 가장 최신 커밋에 tag: v1.0이 달린 것을 확인할 수 있습니다.
Annotated 태그는 tag명 말고도 많은 정보를 담을 수 있습니다.
git show v1.0을 통해서 확인해보겠습니다.
Tagger와 tag 생성 시점, tag 생성 메시지 등을 확인할 수 있습니다.
내가 원하는 특정 시점에 태그 생성
이번엔 제가 원하는 특정 시점에 또 다른 태그를 달아보겠습니다.
- 태깅하고자 하는 커밋의 ID 값을 알아야 내가 원하는 특정 시점에 tag를 만들 수 있습니다.
-
을 통해서 commit ID를 확인할 수 있습니다.git log --oneline
Commit 5 on issue branch commit 기반으로 태그를 만들어보겠습니다.- commit ID는 44c434d입니다.
-
- 커밋 ID 값을 인자로 태깅하기
-
git tag -a v0.1 [커밋ID] -m "fix issue number-1"
- tag: v0.1을 확인할 수 있습니다.
- git show 태그명을 입력해 정보를 확인합니다.
-
태그 활용 전략
- Git을 이용한 태그 생성 시점은 조직마다 다를 수 있습니다.
- 태그 생성 시점?
- 태그명 규칙?
- 태그 메시지 규칙?
- 중요한 것은 소스코드의 효율적인 관리를 위해 태그 생성 시점과 방법에 대해서 일관성 있는 규칙(프로세스)을 정해 프로젝트 팀원 모두가 준수할 수 있도록 정책화해야 합니다.
다음 게시물에서는 git 브랜치 활용 전략에 대해 공부하고 정리해서 다시 찾아뵙겠습니다!
열심히 나아가는 개발자 핑솔이었습니다.
go go!
코드프레소 URL: https://www.codepresso.kr/
프리미엄 IT 교육 서비스 - 코드프레소
www.codepresso.kr
'WEB study > Git, GitLab' 카테고리의 다른 글
Git 브랜치 활용 - GitFlow (0) | 2022.02.01 |
---|---|
Git 브랜치의 이해 (3) - Git 브랜치 이동 및 이슈 발생, 실습 (0) | 2022.01.20 |
Git 브랜치의 이해 (2) - Git 브랜치 개념, 실습 (0) | 2022.01.17 |
Git 브랜치의 이해 (1) - Git 브랜치 (0) | 2022.01.17 |
Git 기본 플로우 이해 - (4) 원격 저장소에 commit 반영하기 (0) | 2022.01.13 |