Git / Merge에 대한 다양한 병합 방법!

최민경·2024년 5월 3일
1

Weekly-paper

목록 보기
4/10
post-thumbnail

Git branch란?

메인 브랜치에서 새로운 갈래를 분기해 메인 브랜치에 영향 없이 독립적으로 작업할 수 있도록 도와주는 기능

  • 불안정하거나 에러있는 코드라면 삭제하고,
  • 안정적인 코드만을 메인 브랜치에 병합할 수 있어 안정성이 올라감

또한 브랜치는 커밋에 대한 포인터로 브랜치를 생성하는 것은 현재 커밋에 대한 새로운 포인터를 생성하는 것과 같다.

Merge

분기했던 브랜치에서 기존 브랜치와 합치는 것으로 다른 브랜치의 변경사항을 현재 브랜치에 적용시키는 것이다.

git merge "branch-name"

일반적인 Merge는 해당 코드를 통해 할 수 있지만 merge에도 다양한 방법이 존재한다.

merge

  • 위에 적었던 merge 방법으로 가장 일반적인 merge 방법이다.
  • 해당 merge는 보통 두 브랜치를 합쳤다는 정보가 커밋 히스토리에 남아야하는 경우 사용한다.

fast-forward

  • 새로운 브랜치가 분기된 이후 main 브랜치에 새로운 커밋이 없을 때 새로운 브랜치의 변경 이력을 그대로 가져오는 병합 방식
  • 메인 브랜치에서 새로운 변경 이력이 있다면 fast-forward merge가 아님
  • 현재 브랜치가 가리키는 커밋이 병합하려는 브랜치가 가리키는 커밋의 조상 커밋일 때 두 브랜치는 Fast-forward 관계에 있다고 한다
  • 기본적으로 설정되어 있는 옵션은 병합하려는 두 브랜치가 Fast-forward 관계일 때는 Fast-forward 방식으로 병합
  • fast-forward 관계에 있어도 git merge -no-ff "branch-name" 명령어를 통해 강제로 3-way merge 방식을 사용할 수 있다.

3-way merge

  • 대부분의 협업에서 발생하게 되는 merge 방식
  • 브랜치마다 새로운 커밋이 하나 이상 있는 경우 사용
  • 새로운 커밋을 생성해 병합한다.
casebase브랜치1브랜치2result
case1AAB->B
case2121->2
case3"Hello"(공백)"hello"->(공백)
case4"hello""hi""bye"->conflict!
  • 3-way merge에서는 base에서 변화가 발생한 것을 우선 채택한다.
  • case4 는 base를 기준으로 브랜치1브랜치2 모두 변화가 생겼기 때문에 conflict가 발생한다

squash and merge

  • 병합할 브랜치의 모든 커밋을 하나의 커밋으로 합친 새로운 커밋을 main 브랜치에 추가하는 방식
  • 모든 커밋 이력이 하나로 합쳐져 사라진다

rebase and merge

  • 사진에서 base는 A 커밋이지만
  • rebase를 통해 C 커밋으로 베이스가 바뀌고 베이스를 기준으로 브랜치가 이동했다.
  • rebase merge란 말 그대로 base를 재지정하는 병합방식
  • 병합할 브랜치의 커밋을 새로운 base로 이어붙여지게 되므로 구조가 새롭게 바뀌고 새로운 커밋이 생기지 않는다.
  • 커밋 히스토리를 깔끔하게 유지하는게 더 중요한 경우 사용한다.



출처

profile
감자

0개의 댓글

관련 채용 정보