참조
애플코딩: (무료) 매우쉽게 알려주는 git & github
브랜치에 각각 신규 commit
이 1회 이상 있는 경우, merge 명령을 내리면 두 브랜치의 코드를 합쳐서 새로운 commit
을 자동으로 생성해주는 것
이것이 merge
의 기본 동작방식
commit2
시점에서commit2-1
이라는 신규 브랜치를 만들고
그 이후 각각commit3
,commit2-2
라는 신규 커밋이 1회 이상 생겼을 때merge
를 해주는 것이3-way-merge
이다.
새로운 브랜치에만 commit
이 되어있고
기준이 되는 브랜치에는 신규 commit
이 없는 경우가 있는데,
이럴 경우 merge
하게 되면
"fast-forward merge 되었습니다" 라고 알려줌
기준이 되는 브랜치에 새롭게 합칠 것이 없어서 분리된 브랜치를 메인 브랜치처럼 다루는 것
만약, fast-forward merge
가 싫다면
git merge --no-ff 브랜치명
를 사용하여 강제로 3-way merge
할 수도 있음
위의 두 가지 방법으로 merge
를 하더라도 브랜치가 자동으로 삭제되진 않는다
git branch -d 브랜치이름
git branch -D 브랜치이름
둘 중 하나를 사용하면 필요없는 브랜치를 삭제할 수 있다
병합이 완료된 브랜치를 삭제할 땐 -d
만 사용해도 되는데
병합하지 않은 브랜치를 삭제할 땐 -D
를 사용해야 한다.
rebase
는 브랜치의 시작점을 다른 commit
으로 옮겨주는 행위다
rebase
를 이용하여 신규 브랜치의 시작점을 main 브랜치 최근 commit으로 옮긴 다음fast-forward merge
를 하는 것
3-way merge
말고 강제로fast-forward
하고 싶을 때- 브랜치 없이도 코드를 잘 짜는 고수 느낌을 주고 싶을 때
rebase & merge
를 사용한다
fast-forward merge
하면 됨git switch 새로운브랜치
git rebase main
git switch main
git merge 새로운브랜치
main 브랜치 뿐만 아니라 다른 브랜치끼리도 가능함
단, 브랜치끼리 차이가 너무 많은 경우에 rebase
를 하게 되면 충돌이 많이 발생할 수 있음
모든 브랜치를 3-way merge
해버리면 이후에 문제가 생길 수도 있음
그게 싫을 경우,
rebase 또는 squash and merge하면 됨
위와 같이 사용하면 새로운 브랜치에 있던 commit들을 연결해주는 것이 아니라 똑 떼와서 main 브랜치에 붙여주기 때문에
1번과 2번 걱정을 하지 않아도 됨
squash and merge를 하게 될 경우,
3-way merge처럼 선으로 이어주지 않고
새 브랜치에 있던 코드변경사항들이 main 브랜치로 순간이동함
main 브랜치의 git log를 출력해볼 때
merge 완료된 브랜치의 commit 같은 것들은 출력되지 않음 (훨씬 깔끔)
git switch main
git merge --squash 브랜치명
git commit -m '메세지'
git merge 뒤에 --squash 옵션 추가하면 됨
▲ 그냥 merge 했을 경우
▲ merge --squash 했을 경우
정말 좋은 정보 감사합니다!