본문 바로가기
GIT.GITHUB

[GIT/GITHUB] 깃 '이해'하기 (Branch, Merge 해보기)

by sjs_2215 2019. 8. 13.

출처:

생활코딩 git 강의: https://opentutorials.org/module/3762
sourcetree, git 설치 가이드: https://github.com/egoingsb/git-offline/wiki/Sourcetree
git doc: https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F
버전 관리 도구란?: https://opentutorials.org/course/2482/13915

손깃: 개념 알려주기용. 실제로 저렇게 안됨


1. Branch 이해하기

ex) 현대는 현대대로, bmw는 bmw대로 원하는 것이 다르다면? 이를 해결해주는 기술이 branch

사용하는 경우:

: 실험적인 기능을 따로 빼놓기 위해. (100개 중 실험적인 커밋 20개를 나중에 도려내는 작업이 힘들 것임 -> 실험적인 기능을 아예 브랜치 해버리는 거임. 나중에 버리고 싶으면 그 브랜치만 버리게)

 

깨알 지식:

  • default branch = head->master
  • 항상 자신이 어느 브랜치에 있는지 알아야 함

branch가 그 전까지의 commit을 똑같이 copy를 뜬 다음 가지치기하는 게 아님. (이렇게 하면 심각하게 비효율적일 것. 실제로 branch를 이런 개념으로 생각하고 옛날에는 유행하지 않았다고 함)

branch 뜨고 싶은 것을 가리키면 됨. (아래 사진 참고)

사진으로 이해하자

- exp라는 브랜치를 만들고 커밋해보자:

=c2에서 브랜치. m3는 c3를 가리키면 되고, master는 m3를 가리키면 됨

 

 

exp로 체크아웃하고 커밋한 상태:

= exp로 체크아웃한 다음에 거기서 commit을 한 게 e3, 34

= head를 보면 exp에서 브랜치한 걸 알 수 있음. e4 working copy를 가지고 있다는 걸 바로 알 수 있어야 함

 

branch의 단점

병합이 힘들다. 근데 git에서는 자동으로 해줌 -> 해결책 auto margin


2. Branch를 만들어보자


3. 병합의 여러가지 경우를 살펴보자

주의해야 할 점: master에서 exp를 체크아웃하는지, exp에서 master를 체크아웃하는지 차이점을 잘 알고 있어야 함


(1) 서로 '다른 브랜치'에서 '다른 파일'의 '다른 부분'을 각각 수정하고 이를 병합해보자 - 난이도 중

목적:

m4와 e4를 병합해서 me5를 만들고자 함

m4와 e4는 me5의 "공통의 부모"라는 것 알고 있기

사진처럼 1, 2, 3 과정 하면 됨 (아래 설명 있)

how to? -step by step

1. 먼저, master로 checkout하기

2. 병합하기

2-1. 자동으로 commit 해주는 신비한 과정

그때 commit 내용은 (지가 알아서 이렇게 commit 내용도 만들어줌)

3. master가 m4가 아닌 me5을 가리킴


- 병합 취소하기

  • git reset --hard work m4 커밋 아이디 (=병합하기 전 master가 있던 곳).

master가 working m4로 가게 됨 => 병합이 취소된 것과 같은 효과를 냄

- 병합이 끝난 브랜치 exp는 지워도 됨

이유: me5는 e4도 부모로 두기 때문에 e3, e4가 유실되는 건 아님. 언제든지 다시 찾아낼 수 있음

지우는 방법: master로 체크아웃하고 exp를 삭제.

병합 안 하고 exp 지우려 하면 경고창 뜰 거임(안전장치 st)-무시해도 ㄱㅊ


(2) 서로 '다른 브랜치'에서 한쪽에서만 파일을 수정하고 이를 병합해보자 - 난이도 하

1. master를 체크아웃

2. exp로 merge

충돌 문제 될 게 전혀 없음.


(3) 서로 '다른 브랜치'에서 '같은 파일'의 '다른 부분'을 수정하고 이를 병합해보자 - 난이도 중상

= 서로 다른 브랜치에서 같은 이름의 파일의 다른 부분을 수정했다면, 이것을 병합하려 할 때 [m1과 e1을 병합]

 

 

->git은 똑똑해서 알아서 잘 병합해줌


(4) 서로 '다른 브랜치'에서 '같은 파일'의 '같은 부분'을 수정하고 이를 병합해보자 - 난이도 상

=서로 다른 브랜치에서 같은 이름의 파일의 같은 부분을 수정하고 [m2과 e2를 병합]하려 할 때 문제가 발생하는데, 이것을 conflict라고 함

 

 

이처럼 conflict가 발생했을 때 3 way merge 덕분에 git은 "주인님, m2와 e2 conflict 났는데 여기만 수정해주세요, 나머지는 제가 다 알아서 할게요"라고 해주며 기특한 리액션을 보임. (임의로 m2를 선택하거나 그러지 않음)

 

3 way merge

= base, 수정 1, 수정 2 이렇게 3가지를 비교하여 합병하는 것을 말한다.

base : 수정 1과 수정 2가 공통으로 가지고 있는 부분을 base라고 한다.

 


4. conflict 해결하기

결합하고 나서의 work.txt 파일

 

 

<<<<< head: 내가 현재 체크아웃되어 있는 브랜치

>>>>> exp : 내가 병합한 브랜치

사진 해석: 이 부분에서 conflict가 났는데 이 부분 처리해주세요. 나머지 e1, m1은 제가 자동으로 해놓았습니다.

여기서 compare changes 누르면 아래 화면 나옴

 

+sourcetree에서는 이렇게 해결도 가능

 

merge 할 때. orig 파일이 생길 수 있는데 이건 지워도 됨. 합병에 대한 도움말 같은 게 들어있는 것뿐임

위 사진에서 '내 것'을 이용하여 해결하면

 

 

이렇게 커밋 내용이 자동으로 생성되고, 이대로 커밋하면 됨!!

Comments