merge 심화개념

김용인·2024년 3월 24일
post-thumbnail

머지커밋 (merge commit)

일단 merge에 관해 간단히 설명하자면 현재 내가 있는 브랜치에서 다른 브랜치의 commit(바뀐 내용)을 합치고 싶을 때 사용하는 것이다.
이때 브랜치끼리 머지를 하게 되면 새로운 커밋이 생기는데 이를 머지커밋(merge commit)이라고 부른다.

Fast-forward merge

그런데 머지를 한다고 항상 새로운 머지커밋이 생기는 것은 아니다.

체크된 master 브랜치에서 파생되어 나간 premium 브랜치가 커밋을 해나가고 있는 상황이다.
그런데 master 브랜치에서는 추가로 커밋을 하지않고 있는 상황이다.


이 상황에 master브랜치에서 premium브랜치를 merge하게 되면 위와 같이 새로운 머지커밋이 생기는것이 아니라 master브랜치가 premium브랜치로 이동하게 된다. 이를 Fast-forward merge라고 한다.

3-way merge

이해를 돕기 위해 아래와 같이 3가지 커밋을 표로 정리하였다.
Base는 My와 Other의 공통조상이 되는 커밋, 변경된 내용이 a,b,c,d 이라고 보면된다.
My와 Other은 각각 Base에서 파생된 브랜치라고 보면 된다.

Base를 기준으로 My와 Ohter을 보면 각각의 내용이 바뀐것도 있고 그대로인것들도 있다.
그런데 여기서 만약에 Base가 없다고 가정을 해보자.

그러면 위와같이 양쪽에서 동일하게 관찰되는 b부분을 제외하고는 a가 원래 a였는지 a’였는지 확실하게 정하기가 어렵다. 따라서 충돌이 난 것인지의 여부도 알 수가 없다.

그래서 Base가 되는 커밋과 함께 비교를 하면 merge의 커밋상태를 보다 확실하게 알 수 있다.
이렇게 3가지 커밋을 함께 비교하면서 merge를 하는것을 3-way merge라고 한다.

다시 정리하면, git은 merge를 할 때 각 브랜치의 마지막 커밋 두 개, 브랜치의 공통 조상 커밋 총 3개의 커밋을 비교하여 새로운 커밋을 만들어 병합한다.

merge 옵션

git merge --ff  (default)
git merge --no-ff
git merge --squash

--ff

--ff 옵션은 현 브랜치와 merge 대상 브랜치가 fast-forward 관계에 있는 경우 새로운 commit을 생성하지 않고 브랜치의 참조 값만 변경되도록 한다. fast-forward 관계가 아니면 merge commit을 생성한다.

간단하게 a브랜치에서 파생된 a-1브랜치와 merge를 할때 a브랜치에서 변경된 내용이 없으면 새로운 머지커밋을 만들지 않고 a브랜치의 참조값이 a-1로 변경이 된다.

--no-ff

--no-ff 옵션은 merge 대상과 fast-forward 관계여도 강제로 merge commit을 생성하고 병합한다.

--squash

--squash 옵션은 여러개의 커밋하나의 커밋으로 합치는 것을 의미한다.
병합할 브랜치의 모든 커밋을 하나의 커밋으로 Squash한 새로운 커밋을 Base 브랜치에 추가하는 방식으로 병합하는 것을 의미하고 머지커밋이 생성되지 않는다.

rebase merge

git rebase [합칠 브랜치명]

rebase merge 란 파생됐던 branch의 기준을 최신 Base(Init)로 설정하고 merge하는 방법으로 결과적으로는 git merge -ff 와 같은 형태가 된다.
rebase를 하면 커밋들의 Base가 변경돼 커밋 해시 또한 변경 될 수 있다.
이런 경우 git push -f (force push)해야할 경우도 있습니다.

squash와 rebase의 차이점은 squash는 여러개의 커밋이 하나의 커밋으로 합쳐져서 커밋내역을 추적할 수 가 없지만 rebase는 여러개의 커밋들 그대로 합쳐지기에 커밋내역을 추적할 수 있다.

squash와 rebase는 머지커밋없이 하나의 라인에 그려지기에 가독성이 좋다.

참고
1. https://wonyong-jang.github.io/git/2021/02/05/Github-Merge.html
2. https://wikidocs.net/153672
3. https://hudi.blog/git-merge-squash-rebase/

profile
어쩌겠습니까?해내야죠!!

0개의 댓글