[Git] Merge 이제는 좀 제대로 집고 넘어가자

Sanghoon Han·2021년 4월 16일
1

Merge가 무엇인지


언제 쓰는지

😂 다들 이런 경험 한번쯤은 있을것이다

Git 은 Branch라는 것을 통해 저렇게 파일을 복사하지 않고 독립적으로 작업이 가능하다
독립적으로 작업을 한 Branch에서 작업이 완료되면 원래의 master branch에 merge를 해준다.
바로 이때의 Merge가 바로 merge이다.

👀종류

😎 Fast-forward가 무엇인지

  • c3 commit까지 작업한 내용에서 버그가 발견한 것 같다.
  • 바로 master에서 수정하기엔 리스크가 크다.
  • 그래서 Hotfix branch를 만들어 주었다
git checkout -b Hotfix
git add .
git commit -m "Remove cat file for fatal error"

  • 고양이 파일에 심각한 문제가 있음을 받아들이기로 해 Hotfix branch와 Merge하기로 했다!
git checkout master 
git merge Hotfix

Merge 메시지에서 "fast-forward"가 적혀있다. 이는 Remove cat file for fatal error이었던 c4커밋c3커밋 Add color attribute to cat file 기반 이기에
💁Master 포인터Merge 과정 없이 그냥 c4 커밋으로 이동한다

3way Merge란


  • 개발자 A가 강아지 이름이 원래 hoon2가 아니라 hoon 임을 확인했다.
  • iss31 branch로 옮긴 후 강아지 이름을 바꿔주었다.
  • master branch에서 새로운 뱀 item이 추가되었다.
  • master branch에서 강아지 이름이 변경이 확실한 정보임을 확인해 iss31을 받아들이기로 했다
  • 이전과는 다르게 iss31 branch 포인터는 snake file을 만들기 전 Remove cat file for fatal error commit 을 가리키고 있다
  • 이때 master branch로 merge를 한다면 어떤 변화가 일어날까?
  • 🙈신입 개발자 b 군은 깃이 꼬여버리는 건 아니겠지..하며 긴장된 상태로 merge를 진행했다.
git checkout master
git merge iss31



💁 아까 일직선 모양과는 다르게 갈래가 생겼다.
왜냐하면 master가 가리키고 있는 커밋iss31이 가리키고 있는 커밋 이 다르기에 이전 Fast Forward처럼 master 포인터 이동만으로 불가능하다..

그래서 3-way Merge 결과를 별도의 커밋으로 만들고 (여기선 Merge branch "iss31") 별도의 커밋이 iss31 커밋기존 Master가 가리키고 있던 Add a snake file 커밋을 가리키게 한다.

Conflict가 일어났을때


같은 파일을 다른 브랜치에서 작업함

  • 신입 개발자 b군은 merge 별거 없네라고 느꼈다.
  • 이제 merge 개념을 제대로 알게 된 개발자 b 군은 개발을 할때 branch를 나누고 merge 하는데 자신감을 갖게 되었다.
  • 사수 A 군은 b 군에게 Merge를 배웠으니 강아지 개발을 해보라고 했다.
  • b 군은 develop branch를 만들고 열심히 강아지를 개발했다
git checkout -b develop
git add dog.txt
git commit -m "Add attributes at dog file"
  • b 군은 개발에 너무 심취해 선배가 작업하고 있는 snake까지 개발을 해버렸다.
git checkout -b develop
git add snake.txt
git commit -m "Add attributes at snake file"
  • 사수 A 역시 snake를 작업했고 master에서 commit 을 했다.
  • b 군은 배운 merge를 활용해 master branch로 이동 후 develop를 merge 했다.
git checkout master
git merge develop


여기서 merge를 하게 되면 어떻게 될까?

b 군과 A 군 모두 snake file을 작업하였고 내용이 서로 다르기에 충돌이 일어났다.
b 군은 A 군에게 상황을 보고 하였고 A 군은 어떤 상황인지 보기 위해 git status를 했다.

A 군은 b 군이 snake 파일 역시 작업했음을 확인했고 그래서 두 개 충돌이 일어났음을 확인했다.
충돌된 파일 내용을 확인해 보기 위해 VsCode로 확인해 보았다

b 군 역시 뱀의 색깔을 빨간색으로 만들었고 A 군 역시 뱀의 색깔을 작업했다.

만약 이렇게 같은 파일내에 같은 line을 수정하게 되면 Conflict가 일어난다.
되도록 branch가 다르면 같은 파일을 작업하는것은 이렇게 Conflict를 유발할수 있다.

Conflict 해결법

위 충돌된 내용을 확인해 충돌이 난 부분을 수정해 주고 저장해 주면 된다.

  • A 군은 b 군이 snake file까지 작업해 conflict를 일으킨 것에는 다음부터 그러지 말라고 타일렀다. 하지만 뱀의 색깔을 red로 하는 것이 더 좋은 아이디어인것 같아 b 군의 아이디어를 받아들였다. (Accept incomming Change) merge로 들어오는 내용만 선택할 수 있다.

  • 그리고 snake.txt file을 저장한 다음에
    다시

git add .
git status

git status가 위처럼 바뀌었다. 그 후 commit을 해주면

git commit

이렇게 어떻게 conflict가 있었고 어떻게 수정했는지 commit message를 작성할 수 있게 된다.
잘 작성해 주고 저장해 준 후 닫으면

👍Conflict가 해결 됐다!!!

😉n 줄 요약
Merge는 독립적으로 작업한 branch를 기존의 branch로 병합하는 데 사용된다.
만약 merge 하려는 branch 갈라지기 시작한 곳과 merge 하려는 기존의 branch가 같은 곳이라면 Fast forward가 일어나고 다를 경우 merge commit을 만들고 3-way merge를 한다.
각기 다른 branch에서 같은 파일을 작업할 경우 conflict가 일어날 수 있고 일어날 경우 당황하지 말고 git status를 통해 어떤 파일이 merge 가 되었으며 어떻게 수정할지 이야기해보고 저장한 다음 다시 add 하고 commit하면 된다. 🧑🏼‍🚒쫄지말자


reference

https://git-scm.com/book/ko/v2/Git-브랜치-브랜치와-Merge-의-기초

profile
Fail Fast learn Faster

0개의 댓글