본문 바로가기
뒷북 정리 (국비 교육)/git, github

Git command : merge

by 규글 2022. 3. 30.

merge : 합치기

 은하가 병합한다는 말에도 merge라고 쓴다. 새롭게 branch를 만들어서 개발하고, 이를 master branch에 합칠 때, Git에서도 이를 merge라고 한다. 이 merge를 하는 방식에는 다음의 세 가지 방식이 있다.

  1. fast-forward merge
  2. no-fast-forward merge
  3. three-way merge

 

>>> git merge branch-name

 우선 새로 만든 branch에서 'Make new one' 이라는 commit을 한 다음, master branch로 와서 아무런 옵션 없이 merge하고자 하는 branch 이름을 써서 merge 명령어를 사용하면 위와 같은 결과를 얻게 된다. 가장 평범하게, 가장 심플하게 한 단계 한 단계 commit 해왔기 때문에 어떤 문제 없이 자연스럽게 merge가 되는 경우이다. 이런 merge 방식을 위 이미지 메시지에서도 볼 수 있듯 fast-forward merge 라고 한다. 보통은 merge 이후 작업하던 branch를 삭제하기 때문에, 이런 경우 branch가 있었다는 사실과 history에 merge했다는 내용조차 전혀 남지 않게 된다. 이 점은 단점이라고 한다면 때에 따라 단점이 될 수 있다고 생각한다. 때문에 모든 내용을 commit으로 남기고 싶다면 이 방식을 쓰면 안된다.

 

>>> git merge --no-ff branch name
>>> git merge branch name --no-ff
>>> git merge branch name --no-ff -e

 모든 내용을 commit으로 남기고 싶다면 fast-forward를 하지 않으면 된다. 그래서 이름이 no-fast-forward merge 이다. --no-ff 옵션을 이용한다. 그렇다면 이전의 fast-forward merge에서는 ff 옵션이 생략되었다고도 생각할 수 있겠다. merge 후의 history를 보면 merge 후 branch 해당 branch를 지웠으나, branch와 merge 했다는 commit 메시지를 입력해준다. 문제라면 명령어를 작성하면 메시지를 입력하라고 하는 editor가 나온다고 했지만 필자는 나오지 않았다는 점이다. 어떻게 나오게 하는지 모르겠어서 서치해봤지만 방법을 찾지 못했다. 그래서 config 명령어를 동작할 때 사용했던 e 옵션과 함께 사용해봤더니 하단처럼 editor가 등장했다. 또 서치 중에 옵션의 위치가 바뀌어있는 경우를 봤는데, 온전히 동작하는 것을 확인했다.

 

 

 하지만 fast-forward 방식의 merge가 선택사항이 아니라 불가능한 경우가 있다. 위 예시처럼 branch master에서 파생된 다음, master branch에서 새로운 commit이 생긴 경우이다. 만약 이런 경우 master의 포인터를 f로 옮긴다고 해도 g commit에 해당하는 변경 사항을 잃어버리게 된다. 이럴 때는 fast-forward 방식이 불가능해서 three-way merge 방식을 이용한다. 이것은 master branch와 파생된 branch의 변동사항을 모두 합친 merge commit을 만들어서 master branch commit 하는 방식이다. 명령어는 fast-forward merge 명령어와 동일하다. fast-forward merge가 불가능할 때는 이런 방식으로 동작한다.

 

 history 왼쪽의 그래프는 앞선 도식과 같은 상황이다. 이 상황에서 동일한 merge 명령어를 작성해서 수행하면 다음의 결과를 얻을 수 있다.

 

 

'뒷북 정리 (국비 교육) > git, github' 카테고리의 다른 글

Git command : stash  (0) 2022.03.30
Git command : reset  (0) 2022.03.30
Git command : branch  (0) 2022.03.30
Git command : log, checkout  (0) 2022.03.30
Git command : commit  (0) 2022.03.30

댓글