일상

git merge 방법 4가지

프흐프좋아 2023. 8. 14. 11:46

1. 3-way merge

  • 한줄 설명 : 기본적으로 우리가 알고있는 merge의 형태이다.

main branch에 commit들이 쌓여있고,

sub branch에 commit이 쌓인 상태에서

sub branch의 내용을 main branch에 합치고 싶을 때 사용한다

그림으로 설명하면 아래와 같다

3-way merge 설명

그림이 좀 끔찍해 보일 수 있는데,,

빨간색이 - main

검정색이 - sub branch라고 각각 규정하고 보자.

sub branch의 내용을 main branch에 merge하면

새로운 commit이 main branch에 생성되면서 (우리가 아는 커밋메시지가 merge어쩌구..로 시작하는..) merge가 진행된다.

이를 3-way merge라고 한다.

git 명령어는 아래와 같다

git switch main(<-내가 merge를 하려는 브랜치에 접속(?))
git merge sub (<-내가 합치려는 브랜치 명)
끝 (commit이 main branch에 한개 생김 / sub branch는 그대로)
이렇게 하면 기존 sub 브랜치가 남아있는데, 보통 merge를 하고 나면 일일히 지워준다.
branch 삭제 명령어는
git branch -d 브랜치이름 => 병합이 완료된 브랜치 삭제 시
git branch -D 브랜치이름 => 병합하지 않은 브랜치 삭제 시
그리고 만약 이렇게 merge 하고 confilct가 나면, vscode 상에서 뭐 선택할지 물어보고
남기고 싶은 코드로 수정한다음 add/commit하면 해당 내용으로 merge되어 commit된다.

2. fast-forward merge

  • 한줄 설명 : 내가 main 할게~

main branch에서 sub branch를 파고 나서,

sub branch 에서 작업 후 합치려고 하니까 main branch에 더 반영된게 없는 경우에 (= 기준이 되는 브랜치에 신규 commit이 없으면)

merge를 하게 된다면 fast-forward merge가 실행됐다고 볼 수 있다.

상단 이미지에서 sub branch가 main branch가 되는 것이다.

git 명령어는 아래와 같다

git switch main(<-내가 merge를 하려는 브랜치에 접속(?))
git merge sub (<-내가 합치려는 브랜치 명)
끝 (commit이 main branch에 한개 생김 / sub branch는 그대로)
기존에 상단의 3-way merge와 방법은 동일하다.
이게 싫다면 git merge --no-ff 브랜치명 이라는 명령어를 통해 3-way merge를 진행할 수 있다.

3. rebase and merge

  • 한줄 설명 : 브랜치의 시작점을 예쁘게

main branch에서 sub branch를 따온 다음,

sub branch에서 작업한 후에

main branch에서 sub branch를 따온 뒤에 commit 된 내용을

sub branch로 가지고 와서(rebase)

merge 하는 작업을 rebase and merge 라고 한다.

해당 작업은 sub branch의 시작점을 main branch로 옮겨준 후

fast-forward merge하는 것이다.

이런 작업은 3-way merge 말고 강제로 fast-forward 하고 싶을때 쓴다

git 명령어는 다음과 같다

git switch 새로운브랜치
git rebase main
git switch main
git merge 새로운브랜치
근데 얘는 브랜치 간의 차이가 많은 경우 rebase할때 충돌이 많이 발생할 수 있다.

4. squash and merge

  • 한줄 설명 : 브랜치의 시작점을 예쁘게

한줄설명이 rebase랑 같다

둘다 merge를 할때 붙이려는 브랜치를 똑 떼서 main에 붙인다는 개념은 동일하다.

근데 이제

rebase and merge는 내가 sub branch에서 commit을 3번 했으면 main branch에 merge했을때 그 3번 commit한게 git log에 남는다.

squash and merge는 내가 sub branch에서 여러번 commit을 해도 main branch에 merge했을때 1번 commit한것으로 git log에 남는다.

git 명령어

git switch main
git merge --squash 브랜치명
git commit -m '메세지'

내 생각엔 그래서..

쉽게 오류도 적을 것 같고 수정한게 적으면 squash

많이 수정했고 작업 내용이 꽤 많아서 문제가 생길 수 있다면 rebase가 좋지않을까?하는..

뭐가 맞는지는 아직 잘 모르겠다.