다양한 git merge 방법 (3-way, fast-forward, squash, rebase)

하마·2025년 2월 18일
0

git & github

목록 보기
2/14

1. 3-way merge

브랜치에 각각 신규 커밋이 1회 이상 있는 경우
merge 명령을 내리면 두 브랜치의 코드를 합쳐 새로운 커밋을 자동으로 생성해줌

이걸 3-way merge라 부르고, git merge 브랜치명 했을 때의 기본 동작 방식입니다.

2. fast-forward merge

가끔 새로운 브랜치에만 커밋이 있고
메인 브랜치, 혹은 기준 브랜치에 신규 커밋이 없을 때가 있음

이 경우 merge 명령을 내리면 "fast-forward merge 됐어 ㅇㅇ" 라고 알려줍니다.

별건 아니고, 딱히 합칠게 없어서 그냥 새로운 브랜치 보고
"지금부터 니 이름은 메인 브랜치여"" 하는 것입니다.

브랜치를 삭제하려면

아무렇게나 merge 해도 브랜치가 자동으로 삭제되진 않는다.

git branch -d 브랜치이름
git branch -D 브랜치이름

이러면 필요 없는 브랜치를 삭제할 수 있습니다.


merge가 완료된 브랜치 삭제 시엔 -d 이것만 해도 되는데
merge 없이 그냥 브랜치를 삭제하려면 -D 이거 해야함

3. rebase and merge

일단 rebase가 뭐냐면

브랜치의 시작점을 다른 커밋으로 옮겨주는 것이다.

  1. rebase를 이용해서 새로운 브랜치의 시작점을 메인 브랜치 최근 커밋으로 옮긴 다음
  2. fast-forward merge 하는 것

그래서 이거 왜 함? 🤔

  1. 3-way merge 말고 강제로 fast-forward 하고 싶을 때
  2. 브랜치 그딴거 필요 없이 코드 잘 짜는 고수같은 느낌을 주고 싶을 때
  3. 커밋 내역을 한 줄로 계속 이어서 남기고 싶을 때
    그럴 때는 3-way merge 대신 rebase and merge 해도 됩니다.

rebase 하려면

  1. 새로운 브랜치로 이동

    주의
    일반 merge 시엔 메인 브랜치로 이동했었는데
    rebase 하려면 해당 브랜치로 이동해야 함!

  2. git rebase main 하면 됨
  3. 그럼 브랜치가 메인 브랜치 끝으로 이동하는데, 그걸 fast-forward merge 하면 됩니다.
git switch 새로운브랜치
git rebase main

git switch main
git merge 새로운브랜치

물론 단점도 있는데
충돌이 많이 발생할 수 있는데 그거 하나하나 해결하기 귀찮음.

4. squash and merge

님들 님들.. 대충 그냥 3-way merge 해버리면

이런 대참사가 날 수 있음;

이게 왜 대참사냐면
1. 3-way merge 된 것들은 매우 복잡해 보임
2. 메인 브랜치에서 git log 출력해보면 3-way merge된 브랜치들의 커밋 내역도(쓸데없는 커밋) 다 같이 출력돼서 더러워짐

이러기 싫으면 rebase 아님 squash and merge 하면 됩니다.
이거 쓰면 새로운 브랜치에 있던 커밋들을 연결해주는게 아니라 똑 떼와서 메인 브랜치에 붙여주기 때문에
위에 1, 2번 걱정을 안해도 됩니다.


아무튼 squash는 뭐냐면
3-way merge랑 다르게 새 브랜치에 있던 커밋들이 메인 브랜치로 텔포합니다.

이제 메인 브랜치에서 git log 했을 때 merge 된 브랜치의 커밋 같은 것들은 출력되지 않습니다.
이게 왜 좋은거냐고요?
님들이 직접 해봐야 체감 되는거라 3-way merge 많이 해보든가 하십숑


git switch main
git merge --squash 브랜치명
git commit -m "commit msg"

그냥 merge 할 때 --squash 만 추가하면 끝입니다.


  • 그냥 merge 했을 때
  • merge --squash 했을 때

결과는 둘 다 똑같은데 한 놈은 선으로 이어져있고 한 놈은 텔포했을 뿐입니다.




강의 출처

0개의 댓글