국비교육(22-23)

11일차(2)/GIT(3) : merge commit

서리/Seori 2022. 10. 20. 20:19

 

- 분기가 갈라지는 경우의 merge / merge commit 실습

 

visual studio code에서 test02 폴더, index.html 파일만들기

 

- 위와 같이 폴더와 index.html 를 만들어주었다.

 

- visual studio code에서도 git을 지원한다. eclipse, IntelliJ 등등에서도 모두 깃을 사용할 수 있다.

- 툴에 따라서 사용법이 전부 다르므로 기본은 명령 프롬프트(git bash)에서 잘 사용할 수 있어야한다!

 

- init 으로 추적되고 있을 때, 파일 옆에 뜨는 U는 untracked file을 의미하고, M은 modified를 의미함

 

Initialized empty Git repository in C:/~~~/
: (저장위치)에 있는 빈 깃 repository 가 초기화되었다는 의미. git init을 했을 때 나온다.

 

 

- 만약 새로운 실험을 하고싶으면? 새 브랜치 만들기!

- lab1이라는 이름의 신규 브랜치 생성 후, study.html이라는 링크와 파일을 생성함.

 

 

그런데 갑자기 수정할 게 있어서 master branch로 이동해야 한다면!?

- lab1에서 현재까지 한 것을 commit하고 다시 마스터로 이동한다.


- 다른 branch로 checkout 이나 merge를 할 때는 꼭!!! 워킹트리를 깨끗하게 하고 이동해야 한다.
 안 그러면 변경사항이 원치않게 다른곳으로 옮겨갈 수 있다.

 

그리고 이동한 master 브랜치에서 다른 내용을 커밋한다면?

→ 분기가 갈라진다.

다시 lab1 브랜치에서 작업하고 싶으면 head를 lab으로 옮기면 되는데,
이 경우 master에서 새롭게 수정한 부분은 적용되어 있지 않다.

 

- 분기가 갈라질 경우 merge를 하면서 새로운 커밋 지점, 즉 merge commit이 발생할 수밖에 없다.

 FastForward로는 병합이 되지 않고, 반드시 merge commit을 써야 한다.

 

- 위의 merge commit 위치(상단의 master)는 lab1과 master라는 두 지점 모두를 조상으로 가지고 있음

 

 

참고) 그래도 동일한 파일의 동일한 부분을 수정하지 않았으면, merge commit은 자동으로 일어난다.
 만약 똑같은 파일의 같은 부분을 수정했다면? 충돌이 생기기 때문에 개발자가 수동으로 commit지점을 만들어주어야 한다.

 

- git merge lab1를 입력하면 자동으로 창이 열린다.
- 이 머지커밋에 대한 메시지를 적으라고 vi창이 열리는 것이고, 기본값은 입력되어 있어서 :wq 입력하면 그대로 저장된다.

 

- 위 창이 닫히면 merge commit이 일어난다. (master에 커서를 둔 상태로 lab1을 병합)
 그러면 자동으로 merge가 일어나면서(Auto-merging)

 master에서 작업했던 내용과 lab1에서 만들었던 내용이 잘 합쳐진 것을 볼 수 있다.

 

 


- 병합 후 master 및 HEAD 가 위치한 지점이 merge commit이고, 이는 공통된 양쪽의 커밋을 가지고 있다.

 

- git log로 확인해보면 lab1 브랜치는 그대로 있고, master로 병합된 새로운 커밋이 생겨난 것을 확인할 수 있다.

- 그럼 branch도 삭제해도 된다. 브랜치를 삭제한다고 커밋이 지워지는 건 아니다.

 

 

하지만 git log 로 로그를 확인하는 것이 불편하다면? git gui 를 사용한다.

- git gui의 기본화면

- 메뉴의 repository - visualize all branch history 를 눌러서 새 창을 켠다.


- 노란색 동그라미가 HEAD이다. HEAD가 master branch에 얹혀진 상태.

lab1을 없애도 포인터(초록색 박스)만 사라지는 것이고, commit이 사라지는 것은 아니다.

 

 

 

ex) merge commit 예시

오른쪽 팔을 들고 있는 사진과 오른쪽 다리를 들고 있는 사진을 merge하려면 새로운 사진을 찍어야 한다.

단순히 상단으로 이동할 수 있는 상단 branch가 없는 상태

오른쪽 팔&다리를 둘 다 들고있는 사진은 현재 없기 때문에, 새로 찍을 필요가 있다.

새로운 commit 지점 발생

 

이것이 merge commit이 발생하는 경우이다.

이런 부분은 git이 이해하므로 git 응용프로그램이 자동으로 commit 하는 것이 가능하다.

 


 

참고) merge가 충돌하는 경우 예시

- 위와 같이 두 branch에서 동일한 부분이 수정되어 수정된 내용이 충돌하는 경우엔 git이 자동으로 merge 해줄 수 없다.

 개발자가 직접 수정해서 add commit 해주어야 한다.(수정→add→commit 과정을 거쳐야 함)
- 충돌은 ERROR가 아니다!

- 개발자가 직접 팔을 [ 옆으로 들고있을지 /  위로 들고있을지 / 두개로 그릴지 / 없앨지 / ... ] 를 구분하여 수정한다.
 보통은 잘 정리해서 두 개를 다 남기는 쪽으로 한다.ㅎㅎ