CS 지식/Git & Github

Git & Github Basic(5)

goldpig 2023. 8. 9. 23:00
728x90

3-way merge

3-way merge는 일반적인 브랜치 합병 방식으로 sample branch와 main branch에 각각 1개 이상의 commit이 일어나서 합치고 싶은 경우

  1. 중심 branch로 이동한다
  2. branch merge sample

출처:https://codingapple.com/course-status/

fast-forward merge

3-way merge 방식 이외에도 다른 merge 방식이 있다. 그 중 하나가 fast-forward merge 방식이다. 이 방식은 가끔은 새로운 브랜치만 commit이 있고, 기준이 되는 main 브랜치는 신규 commit이 없는 경우가 있는데, 이때 사용하는 방식이다. 이 경우 merge를 하게 되면 "fast-forward-merge되었습니다." 라고 알려준다.

  • 장점: 나중에 git log 같은 명령어를 통해 commit history를 확인하고 싶을 때 좀 더 깔끔하게 보기 위해서 사용한다. 
  • 단점: merge conflict가 자주 발생한다

출처:https://codingapple.com/course-status/

fast-forwoard-merge는 딱히 합칠게 없어서 신규브랜치 보고 "지금부터 네 이름은 main branch다" 하고 하는 것이다. 그래도 결과는 어짜피 같다. 따라서 기준이 되는 main/master branch에 신규 commit이 없으면 자동으로 fast-forward merge가 발동한다. 하지만 이런 방식이 싫다면 git merge --no-ff 브랜치명 을 입력해서 강제로 3-way merge를 할 수 있다.

git merge --no-ff 브랜치명

브랜치 삭제

3-way merge나 fast-forward merge방식으로 merge를 해도 사용하지 않는 브랜치가 자동으로 사라지지 않는다. 따라서 merge한 후 사용하지 않는 브랜치를 삭제하고 싶다면 다음 명령어를 통해 삭제 할 수 있다.

git branch -d 브랜치이름 // 병합이 완료된 브랜치 삭제
git branch -D 브랜치이름 // 병합되지 않은 브랜치 삭제

rebase and merge

rebase는 브랜치의 시작점을 다른 commit으로 옮겨주는 행위입니다. 

  1. rebase를 이용해서 신규브랜치의 시작점을 main 브랜치 최근 commit으로 옮긴다.
  2. fast-forward merge 하는 것

when: 3-way merge 말고 강제로 fast-forward merge 하고 싶을 때 사용, 브랜치 그런거 필요없이 고수 같은 느낌을 주고싶을 때 사용

단점: 브랜치끼리 차이가 너무 많이 나는 경우 rebase하면 충돌 많이 발생해서 해결하기 귀찮다.

출처:https://codingapple.com/course-status/

따라서 이 merge 방법을 사용할 경우

  1. 새로운 브랜치로 먼저 이동한다.
  2. git rebase main 하면 된다.
  3. 그럼 브랜치가 main 브랜치 끝으로 이동하는데 그걸 fast-forward merge 하면 된다.
git switch 새로운브랜치
git rebase main

git switch main
git merge 새로운브랜치

차례대로 입력하면 rebase 끝입니다. rebase & merge는 쉽게 말해 강제 fast-forward merge입니다.

squash and merge

모든 브랜치를 3-way merge 방식으로 하면 git log 명령어 등으로 commit history를 확인하려 때 매우 복잡해 보여서 파악하기가 힘들어 집니다. 이러한 문제를 해결하기 위해서 위에서 설명한 rebase 방식이나 squash and merge 방식을 사용하면 됩니다. 이 방식은 3-way merge방식처럼 선으로 이어주는 것이 아니라 새 브랜치에 있던 코드 변경사항들이 main branch로 텔레포트 합니다.

출처:https://codingapple.com/course-status/

장점: main branch의 git log를 출력하면 merge 완료된 브랜치의 commit 같은 것들은 출력되지 않습니다. 이는 나중에 비주얼적으로 복잡해 보이지 않아서 commit history를 파악하기 편합니다.

git switch main
git merge --sqaush 브랜치명
git commit -m '메시지'

위와 같이 명령어를 작성하면 만들었던 많은 commit 을 다 합쳐서 하나의 commit으로 main 브랜치에 생성해준다. *squash and merge 방식은 간단하게 --squash 옵션을 추가하면 끝입니다.

  • 그냥 merge
  • merge-squash

둘 다 결과는 똑같은데 한놈은 선으로 이어져 있고 다른 한 놈은 텔레포트를 한 점이 다르다. 요약하면, 브랜치 100개 만들어놨는데, 일반 merge를 많이 하면 나중에 git log 그래프가 굉장히 복잡해 질 수 있다. 하지만 rebase & squash merge 방식을 사용하면 이러한 문제를 해결할 수 있다.

728x90