Git 은 Branch라는 것을 통해 저렇게 파일을 복사하지 않고 독립적으로 작업이 가능하다
독립적으로 작업을 한 Branch에서 작업이 완료되면 원래의 master branch에 merge를 해준다.
바로 이때의 Merge가 바로 merge이다.
git checkout -b Hotfix
git add .
git commit -m "Remove cat file for fatal error"
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 커밋으로 이동한다
git checkout master
git merge iss31
💁 아까 일직선 모양과는 다르게 갈래가 생겼다.
왜냐하면 master가 가리키고 있는 커밋과 iss31이 가리키고 있는 커밋 이 다르기에 이전 Fast Forward처럼 master 포인터 이동만으로 불가능하다..
그래서 3-way Merge 결과를 별도의 커밋으로 만들고 (여기선 Merge branch "iss31") 별도의 커밋이 iss31 커밋과 기존 Master가 가리키고 있던 Add a snake file 커밋을 가리키게 한다.
git checkout -b develop
git add dog.txt
git commit -m "Add attributes at dog file"
git checkout -b develop
git add snake.txt
git commit -m "Add attributes at snake file"
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를 유발할수 있다.
위 충돌된 내용을 확인해 충돌이 난 부분을 수정해 주고 저장해 주면 된다.
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하면 된다. 🧑🏼🚒쫄지말자