Git - 원리 : branch
git의 내부가 브랜치를 사용하는 과정에 어떤 변화를 겪게 되는가

git init을 했을 때 생기는 파일들.
HEAD라는 파일은 git을 처음 생성 했을 때 생성이 되면서 그 동시에 ref:refs/heads/master 라고 적혀있다.
이것은 파일의 이름인데 아직은 존재하지 않는 상태.

f1.txt라는 파일에 a라는 내용을 넣고 add, commit을 하면
왼쪽 사진에 보이는 것과 같이 파일들이 생기고 그 중 아까 언급한
rdfs/heads/master 파일이 생겼다.
파일을 클릭해보면 오브젝트 id값을 가지고 있고 오브젝트 내용을 클릭해 보면 방금 내가 커밋한 커밋을 가리키는 id 였다.
정리하자면 깃을 처음 만들면 HEAD라는 파일이 반드시 생기고, 이 HEAD라는 파일은 master라고 하는 파일을 가리킨다.
그리고 master이라는 파일은 가장 최신 커밋을 가리킨다.
이걸 통해서 알 수 있는 것은
1) 내가 git log를 했을 때 깃이 커밋 2를 나에게 가장 최신 커밋이다 라고 나에게 알려줄 수 있었던 것은 위의 방식처럼 동작하기 때문이라는 것을 출원해 볼 수 있다.
2) 이것을 통해 알 수 있는 것은 깃에서 브랜치라고 하는 것은 단지 refs라는 디렉토리 밑에 있는 파일을 의미한다 라는 것을 알 수 있다.
branch 충돌해결
merge를 하는 과정에서 파일의 내용이 서로 다를 경우에 충동이 일어날 수도 있다.
exp 의 이름을 가진 브랜치를 만들고
master에는 master.txt 내용은 a인 파일 생성하고 add 하고 commit을 하고
exp 에서는 exp.txt 내용은 마찬가지로 a인 파일 생ㅅ어하고 add하고 커밋 해준다.

이 상태에서 git merge exp를 하게 되면 두개의 브랜치가 수정한 부분이 각자 있었기 때문에

머지 커밋을 생성한다. :wq 입력하고 커밋이 되면 어떤 상태가 되는지 보자.

exp의 커밋과 마스터가 원래 가지고 있었던 커밋6이 병합된 새로운 커밋에 마스터가 체크아웃 되어 있는 상태이다.

exp 브랜치에서 만들어진 exp.txt 파일도 병합된 것을 볼 수가 있다. 파일이 다르면 무조건 자동으로 합쳐준다.
그런데 파일이 같으면 문제가 생긴다.
마스터 브랜치와 exp브랜치에 이름이 같은 파일을 만들어 보자.
exp 브랜치에서 common.txt 파일을 만들고 마스터 브랜치로 체크아웃하여 merge를 해주고 ls -al을 해보면 master브랜치에도 common.txt가 자동으로 만들어져 있는 걸 확인할 수 있다.
참고로 exp브랜치에서 처음 common.txt의 내용의 functin a(){} 였고 마스터 브랜치에서는 기존 내용위에 function b(){}을 입력하였고 다시 exp브랜치로 넘어와서는 기존내용 밑에 function c(){}을 입력하였다.
정리해보자면 지금 현재 상황은 master와 exp가 common.txt라는 파일에 서로 다른 부분을 수정하였다.
이 상테에서 git merge exp를 하여 병합이 되고

마스터에서 작성했던 내용과 exp에서 작성했던 내용이 둘다 병합된 것을 볼 수 있다. 같은 파일임에도 서로 수정한 위치가 다르다면 자동으로 합쳐버린다.
반대로 exp로 체크아웃해서 common.txt를 확인하면 마스터에서 수정한 function b(){}는 없다. 왜냐하면 exp내용을 마스터로는 옮겼는데 마스터의 내용은 exp로는 안왔기 때문에 이 두개의 상태가 다른 것이다.
이번에는 마스터를 exp로 병합을 해보자. 그럼 두개가 완전히 같은 상태가 될 것이다.
common.txt 확인해보니 아까 마스터에서 본 내용과 똑같이 나온다.
다시 마스터로 돌아가서 common.txt 파일의 함수 a의 매개변수 쪽에 master를 삽입하여 수정한다.
그리고 exp브랜치로 가서 common.txt에 위의 똑같은 위치에 exp를 삽입하여 수정한다.
이렇게 같은 부분을 수정했을 때 병합하면 엄청난 큰일이 일어날 것만 같다..
또 다시 마스터로 돌아가서 git merge exp를 해주면 이러한 메세지가 나온다.

git status 를 하여서 보면

vim common.txt를 하여 보면 평소와는 다르게 나온다.

이렇게 나오고 여기 있는 기호를 해석할 수 있어야 한다.
중간에 있는 ====== 이것은 구분자이다. 이 구분자를 중심으로 해서 위쪽에 <<<<<<< HEAD 라고 되어있는 부분이 현재 내가 체크아웃함 브랜치의 수정사항이다. 즉 마스터의 내용이다.
그리고 밑에 >>>>>>> exp 라고 되어있는 부분은 exp브랜치의 내용이다.
이것은 무슨 뜻이냐면 깃이 나에게 자기가 자동으로 병합하는 것이 실패했기 때문에 merge를 실행한 내가 이 충돌을 해결하라고 위임한 것이다. 그리고 동시에 충돌이 난 부분을 표시해주고 있는 것이다. 나는 이 정보를 바탕으로 해서 병합 문제를 수정하여 처리를 하면 되는 것이다. 해당강의에서는 function () 안 매개변수에 master,exp 이렇게 동시 갖고 있게 입력하여 결합을 해결하면 될 것같다고 하였다.
나머지 불필요한 내용들은 삭제 하였다.

이렇게 하는 게 맞다고 치면 이렇게 수정하고 저장한다. git add common.txt를 해주고 git status를 해보면 수정되었다는 글이 초록색으로 나오고 git commit을 하면 comflicts가 났던 것을 수정하였다는 도움말을 보여주고 exp와 merge를 하였다는 메세지도 적혀있다.

다시 vim common.txt를 하여 내용을 확인하면 잘 처리가 된 것을 볼 수 있다.
Conflict가 나면 이런식으로 처리가 가능하다.
'git' 카테고리의 다른 글
| <10> 생활코딩 - GIT (0) | 2022.12.02 |
|---|---|
| <9> 생활코딩 - GIT (0) | 2022.11.28 |
| <7> 생활코딩 - GIT (0) | 2022.11.27 |
| <6> 생활코딩 - GIT (0) | 2022.11.25 |
| <5> 생활코딩 - GIT (0) | 2022.11.24 |
댓글