개요
Branch란 같은 뿌리에서 나왔지만 서로 다른 역사를 써가고 있는 버전들을 말한다.
git의 branch 기능을 이용하면 이런 branch를 유지하면서 생기는 여러문제를 깨끗하게 해결할 수 있다.
하나의 branch에는 a.txt라는 파일이 있고,
하나의 branch에는 b.txt라는 파일이 있을때 이 두가지를 합치면 서로 파일이 다르지만
자동으로 두가지를 합쳐준다.
그리고 같은 파일인데 서로 다른 부분이 수정됐을때 git이 알아서 하나의 파일을 합쳐서 자동으로 생성해준다.
그런데 같은 파일인데 같은 부분을 수정했다면, git이 병합을 중지시키고 병합을 하는 사람에게 충돌이 났기 때문에
그 부분에 대해서 수동으로 수정해달라고 요청하게 된다.
바로 이러한 상황을 'Conflict'라고 한다.
실습준비
=> 똑같은 방법으로 work3까지 만듦
=> git commit -am : add와 message 둘다 한번에 하기
=> 버전마다 content n번째 추가
브랜치의 사용법
=> master branch는 우리가 저장소를 만드는 순간에 생기는 기본 branch이다.
=> 그냥 bracch 라고 치면 branch의 목록을 보여준다.
=> 그리고 master앞의 *이 있는것은 master branch에서 작업중이라는 뜻이다.
=> HEAD가 master가 가리키고 있는 의미는 우리는 master branch에 속해있다는 뜻이다.
=> 우리가 생성한 각각의 branch들은 현재 master가 머물고 있는 상태에서 만들었기 때문에
=> work3 라는 상태라고 하는 공통점이 있다.
=> 작업을 하고 commit 하면 head가 master를 가리킴
=> ms, google, apple은 work3에 머물러 있음
=> checkout으로 apple branch로 바꾸면,
=> head가 apple을 가리키게 되고, work3에 머물러있음.
=> 따라서 master에서 work.txt에 추가했던 버전이전으로 돌아가게됨.
=> work.txt와 apple.txt에 모두 apple work 4 추가 한후, add, commit
=> apple work 4 버전의 부모는 work3 이고, master work 4의 부모도 work3이다.
=> google을 가리키고 work.txt와 google.txt에 google content 4 추가 후 add, commit
=> master work 4도 부모가 work3이고, google work 4도 부모가 work3이다.
=> 위에서 작업한 것들과 같은 작업
더이상 우리가 필요한 복제본마다 저장소를 카피할 필요가 없이 하나의 저장소 안에서 공통의 작업을 공유하면서도
각자 자신의 작업을 가지는 별도의 평행 우주를 만들 수 있다 라는 것이 git이 가져온 혁명적인 기능이다.
브랜치 병합
apple에서도 가지고 있는 작업과 master에서 작업한 내용을 합치려고 함.
우리가 합치고 싶은 버전의 공통의 조상을 base라고 함.
합쳐진 버전은 merge commit이라고 함
실습 (파일명이 다른것을 병합)
=> work.txt에 1만적은후 staging -> commit 함
=> o2 branch를 만든뒤, checkout전에 master에서 2라고 적힌 master.txt를 만듦
=> work2로 add후 commit
=> 하지만 commit message를 바꾸기 위해 --amend를 사용함.
=> o2 branch로 이동후, o2 work 2를 commit함.
이제 master에 o2 branch를 병합할것임.
방향은 o2 branch의 내용을 master branch로 합칠것.
첫번째로 master branch 상태가 되어야함.
그리고 땡겨와서 현재 나의 branch와 병합하고 싶은 branch를 merge로 지정하면 된다.
=> o2의 work 2 commit과 master의 이전 commit인 work 2 commit을 merge해서 새로운 commit을 만듦
실습 (파일명이 같고, 다른부분 수정했을때의 병합)
=> master branch에서 work.txt 수정
=> o2 branch에서 work.txt 수정
=> master branch로 가서 o2 branch를 merge함.
=> master와 o2에서 한 수정 사항이 모두 들어가있음.
실습 (파일명이 같고, 같은부분 수정했을때의 병합)
=> work.txt 만들고, o2 branch 까지 만듦
=> work.txt 내의 내용
=> master branch에서 work.txt를 수정함
=> o2 branch에서 work.txt를 수정함
=> master branch로 가서 o2 branch를 merge함
=> 양쪽 다 수정되었으므로 conflict가 발생하여 오류가 남
=> ======를 기준으로 위쪽은 head에서 수정한 것이고, 밑은 o2에서 수정한 것임.
=> conflict를 해결하고 나면 add가 가능해짐
3 Way Merge
here | base | there | 2 way merge | 3 way merge |
A | A | A | A | A |
H | B | B | ? | H |
C | C | T | ? | T |
H | D | T | ? | ? |
here과 there이 같은 조상에서 만들어진 branch이다.
그 조상은 base branch라고 부른다.
우리가 here와 there를 merge하려고 한다면, 2 way merge로는 base없이 here와 there만 비교하게 된다.
그래서 둘이 비교했을때 같은것으로 바뀌었다면 그것으로 merger를 하고,
둘이 다르면 어떤것이 바뀐건지 알 수가 없기때문에 merge가 불가능하다.
하지만 3 way merge로는 조상 branch인 base branch와 비교하게 된다.
따라서 base와 비교해서 바뀐것으로 merge를 하게 된다.
'Git' 카테고리의 다른 글
GIT CLI - 협업 (0) | 2022.02.01 |
---|---|
GIT CLI - Backup (0) | 2022.01.27 |
Git CLI - 버전관리 (0) | 2022.01.21 |
GIT1 (0) | 2022.01.20 |