#5 다양한 merge 방법 - 3-way / fast-forward / rebase / squash / branch 삭제
- branch는 다양한 방법으로 합칠 수 있다.(merge 할 수 있다.)
● 3-way merge
- 각각의 branch에 신규 commit 이 1회 이상 있는 경우 merge 명령을 내리면 두 branch의 코드를 합쳐서 새로운 commit이 자동으로 생성된다.
- 저번 글에서 한 merge 방식이 3-way merge이다. 이것이 merge의 기본 동작 방식
● fast-forward merge
- 새로운 branch에만 commit이 있고 기준이 되는 branch(이 글의 경우 main branch)에는 신규 commit 이 없는 경우
merge 하게 되면 "fast-forward merge 되었습니다." 라고 알려준다.
- 기준이 되는 branch에 신규 commit이 없으면 자동으로 fast-forward merge가 발동되는 것이다.
cf) 이게 싫으면 [ git merge --no-ff 브랜치명 ] 해서 강제로 3-way merge 할 수도 있다.
- 신규 branch에서 반드시 commit을 한 후에 fast-forward merge를 해야한다.
- commit을 안 하면 merge가 안 된다.
● rebase and merge
- branch를 rebase 하고 나서 merge 하는 방법도 있다.
rebase : branch의 시작점을 다른 commit으로 옮겨주는 행위
1. rebase를 이용해서 신규 branch의 시작점(위 사진의 경우 commit2-1)을 main branch의 최근 commit으로 옮긴 다음
2. fast-forward merge 하는 것이다.
- rebase & merge를 한 줄로 쉽게 비유하면 강제 fast-forward merge이다.
- rebase를 하는 이유
1. 3-way merge 말고 강제로 fast-forward merge 하고 싶을 때
2. branch 그딴거 필요 없이 코드 짜는 고수같은 느낌 풍기고 싶을 때
[rebase and merge 방법]
1. 새로운 branch로 먼저 이동
2. git rebase main
3. 그럼 신규 branch가 main branch 끝으로 이동, 그걸 fast-forward merge 하면 된다.
[명령어]
git switch 새로운브랜치
git rebase main
git switch main
git merge 새로운브랜치
- 위의 명령어를 차례대로 입력하면 rebase and merge가 된다.
※ 새로운 branch에서 작업 내용을 먼저 commit 한 후에 merge를 하는 것이다. commit도 하지 않고 merge하면 안 된다.
- rebase & merge는 main branch 말고 다른 branch끼리도 가능하다.
- 단점 : branch 끼리 차이가 많은 경우 rebase 하면 충돌이 많이 발생할 수 있는데 이러면 conflict 해결하기 귀찮다.
● squash and merge
- 모든 branch 들을 3-way merge 해버리면 나중에 문제가 발생할 수 있다.
이유 1) 3-way merge 된 것들은 매우 복잡해보인다.
이유 2) main branch에서 git log를 출력하면 3-way merge된 branch들의 commit 내역도 다 같이 출력되어 log 창이 더럽다.
- 이게 싫으면 rebase and merge 혹은 squash and merge 하면 된다.
- 해당 방식을 사용하면 새로운 branch에 있던 commit 들을 연결해주는게 아니라 똑 떼와서 main branch에 붙여주기 때문에 걱정을 해결할 수 있다.
squash and merge 자세히
- 3-way merge 처럼 선으로 이어주지 않고 새로운 branch에 있던 변경 사항들이 main branch로 텔레포트된다.
- 이후 main branch에서 git log를 출력하면 merge 완료된 branch의 commit 같은 것들은 출력되지 않는다.
git switch main
git merge --squash 브랜치명
git commit -m '메세지'
※ 새로운 branch에서 작업 내용을 먼저 commit 한 후에 merge를 하는 것이다. commit도 하지 않고 merge하면 안 된다.
- squash and merge는 '--squash' 옵션을 추가해야 한다.
- 그러면 branch에서 만들어놨던 많은 commit 들을 다 합쳐서 하나의 commit으로 main branch에 생성해준다.
- 위의 사진을 보면 merge 후의 최종 결과는 동일한데 위에는 선으로 이어져있고 아래는 텔레포트했다.
결론
- branch를 100개 만들어놨는데 일반 3-way merge를 잔뜩 해놓으면 나중에 git log 그래프가 매우 복잡해질 수 있다.
- 그게 싫으면 squash and merge를 해보자(rebase 해도 마찬가지로 해결가능)
숙제
※ 새로운 branch에서 작업 내용을 먼저 commit 한 후에 merge를 하는 것이다. commit도 하지 않고 merge하면 안 된다.
1. branch 새로 하나 만들어서 commit 몇번 한 다음 main branch에 squash and merge 해보자
2. branch 새로 하나 만들어서 commit 몇번 한 다음 main branch로 rebase and merge 해보자
3. merge 후 쓸모 없어진 branch는 제거해 보자
● branch 삭제
- 3-way, fast-forward 상관없이 branch를 merge 하고 난 후에도 해당 branch는 자동으로 삭제되지 않는다.
- 아래 명령어 중 하나를 사용하면 필요없는 branch를 삭제할 수 있다.
git branch -d 브랜치이름
git branch -D 브랜치이름
- 병합이 완료된 branch 삭제 시에는 -d 옵션을 사용할 수 있지만
- 병합하지 않은 branch 삭제 시에는 -D 옵션을 사용해야 한다.