본문 바로가기

Git & Github

😃Git bash - Part 3 : Fast-foward merge와 3-way merge

728x90

👋 Git fast-foward merge

가장 기본적인 merge로 기존 branch에서 분기한 branch 둘 모두가 동일한 commit을 참조하고 있는 경우 Fast-foward 관계라고 합니다.

 

fast-foward

feature branch는 master branch에서 분기되었으며, 두 branch가 공통으로 commit 1을 참조하고 있고 이를 base라고 합니다. 이때 feature branch에서 어떤 작업을 하며 commit 2, 3, 4를 한 상태에서 master branch에 merge 하면 master branch의 HEAD가 feature branch의 HEAD와 같은 commit 4를 가르키게 됩니다.

이러한 fast-foward 관계의 특징은 merge commit이 생성되기지 않는다는 것입니다. 단지 master branch의 참조 개체가 feature branch가 가르키는 개체를 참조하도록 이동하는 것입니다. 

 

정말 간단한 실습

$ git checkout master
$ touch signIn
$ git add signIn
$ git commit -m "회원가입 구현"

$ git checkout -b feature
또는
$ git branch feature
$ git checkout feature

$ touch logIn
$ git add logIn
$ git commit -m "로그인 구현"

$ git checkout master
ls를 입력해 파일 목록을 확인해보면 logIn 파일은 없습니다.

$ git merge feature
ls를 입력해 파일 목록을 확인해보면 logIn 파일이 있을겁니다.

 

 

 

하지만 master branch와 feature branch의 base가 달라져 어느 것도 base에 위치하기 않게되면 어떻게 되는지 확인해보겠습니다.

 

👋 Git 3-way merge

기존 branch에서 분기한 branch 둘 모두가 base가 아닌 다른 commit을 참조하고 있는 경우 3-way 관계라고 합니다.

 

3-way merge

feature branch는 master branch에서 분기되었으며, feature branch는 commit 4를 master branch는 commit t를 참조하고 있습니다. 이때 master branch에 merge 하면 새로운 commit이 생성되면서 base, master branch의 HEAD, feature branch의 HEAD를 이용한 3-way merge를 합니다. 

 

실습

$ git checkout master
$ touch signIn
$ git add signIn
$ git commit -m "회원가입 구현"

$ git checkout -b feature
또는
$ git branch feature
$ git checkout feature

$ touch logIn
$ git add logIn
$ git commit -m "로그인 구현"

$ git checkout master
ls를 입력해 파일 목록을 확인해보면 logIn 파일은 없습니다.

$ touch signOut
$ git add signOut
$ git commit -m "회원탈퇴 기능"

$ git merge feature
vi 에디터가 나오면서 merge commit에 대한 log 메시지를 작성할 수 있도록 합니다.
여기서 log 메시지를 그대로 사용할 것이라면 esc + :wq를 입력하고
변경을 원한다면 i를 입력한 후 수정하고 esc + :wq를 입력하시면 됩니다.
ls를 입력해 파일 목록을 확인해보면 logIn 파일이 있을겁니다.