버전관리/github

git 병합

Giant Oreo 2021. 6. 29. 17:13
git branch --merged  //브랜치 병합 여부 확인

깃에서 사용되는 병합 방식에는 두가지가 있다.

fast forward병합과 3-way병합이다.

 

전자는 주로 순차적으로 커밋한 경우 한 줄로 병합하는 것을 의미한다. 주로 혼자 작업할 경우 이 병합이 사용된다.

반면 후자는 여러 사람과 작업하는 경우 기준 커밋을 기점으로 서로 다른 브랜치의 커밋들이 연결되어 복잡하다.

 

그림을 보면 이해가 쉽다.

 

1. fast-forward병합

출처: https://www.pngkey.com/detail/u2y3q8u2r5q8w7t4_fast-forward-merge-diagram/

master브런치에서 develop브런치가 분기한 이후 master에는 더 이상의 커밋이 없고 순차적으로 커밋된 경우,

master브런치에서 merge하면 fast-forward병합이 이루어 진다.

 

 

 

2. 3-way 병합

출처: https://thebook.io/080212/ch08/07/03/

공통 조상인 base커밋을 기점으로 병합 커밋을 하나 만들어서 커밋하는 것을 말한다.

 

병합할 때는 충돌할 수 있는데, 해당 내용을 수정하고 커밋해야 병합 커밋이 만들어진다.

 

 

이때, 3-way 병합과 rebase와 헷갈릴 수 있는데 둘의 차이점은 병합 커밋에 있다.

rebase는 병합 커밋이 만들어지지 않고 브런치의 커밋이 연결되어 한 줄로 만들어지는 형태이다. 

 

출처: https://morioh.com/p/29e8fd57daa3

이 때 feature브런치에서는 마지막 커밋을 가리키고 있지만, master브런치는 master브런치의 마지막 커밋을 가리키고 있기 때문에 HEAD포인터가 같지 않다. 따라서 rebase한 이후 fast-forward병합이 필요하다.

 

rebase는 merge와는 반대로 리베이스 되는 브런치로 이동해서 rebase 명령어를 사용해야 한다.

다시 말해 feature브런치로 이동해서 git rebase master를 사용해야 한다.