본문 바로가기
갭알 ☠️/GitHub

깃허브 기본 사용 2 (Branch, Merge)

by Niyaoh 2021. 8. 25.

이번에는 브런치(Branch)를 알아볼 것이다.

브런치는, 쉽게 말하자면 각자의 작업 공간이다.

 

git init 명령어를 사용하게 되면, 그 폴더를 Git으로 관리하는 동시에 오른쪽에 Master 라는 문구가 생기는데, 이게 바로 브런치이다. 현재 폴더를 Master 브런치가 관리하고 있다는 뜻이다. Master는 가장 기본이 되는 브런치이며, 메인이 되는 브런치이다.

 

브런치는 아까 말했듯이 각자의 작업 공간이다. 팀원들 각자가 본인의 브런치를 만들고, 그 브런치에서 본인이 맡은 작업을 한다. 작업을 완성했으면 그 작업물을 Master 브런치에 올린다. 그렇게 각 팀원들이 만든 작업물들은 Master 브런치에서 합쳐지게 되고, 그렇게 합쳐져서 완성된 결과물은 최종적으로 Hub에 올라가게 된다.


처음 git init을 했을 때 나오는 장면.

오른쪽에 (master) 라고 적혀있는데, 저게 바로 브런치이다. 이 폴더를 Master 브런치가 관리하고 있다는 뜻이다.

처음 실행했기 때문에, 당연히 Master 브런치 하나밖에 없다.

 

이제 각자의 브런치들을 만들 차롄데, 여기서 중요한 점은 기준이 되는 브런치에 최소 한 개 이상의 파일이 Commit 되어있어야 브런치들을 만들 수 있다는 것이다.

이게 무슨 소리인가 하면, 브런치를 만드는 구조가 이렇다.

브런치를 만드려면 최소 한 개 이상의 파일이 Commit 되어있어야 한다고 했다.

근데 현재는 Master 브런치 밖에 없으니, Master 브런치에 '팀원들이 공동으로 사용할 기본 프로젝트'를 만들어 Commit 시켜놓는거다.

그 상태로 A브런치와 B브런치를 만들면, 기본 프로젝트를 가진 채로 똑같은 공간의 A, B브런치가 만들어지는 것이다.

(여기서 헷갈리면 안되는게, 다른 폴더를 만드는게 아니다. 같은 폴더를 Master, A브런치, B브런치 셋이서 관리하는 것이다.)

 

A라는 사람은 A브런치에서 기본 프로젝트와 더불어 본인이 맡은 작업을 하고, B라는 사람 역시 B브런치에서 본인이 맡은 작업을 한다. 그 뒤 Master 브런치에 합치는 식으로 협업이 이루어진다고 보면 된다.


Master 브런치에서 기본 프로젝트를 Commit 시켰다면 이제 브런치를 만들 수 있다.

git branch 브런치이름

: 브런치를 만드는 명령어

 

git checkout 브런치이름

: 브런치를 바꾸는 명령어

(오른쪽을 보면 Master에서 a-branch로 바뀌었다. 다른 폴더로 간게 아니다. 같은 폴더다. 그 폴더를 관리하는 브런치만 바뀐 것)

 

a-branch는 로그인 기능을 구현 할거라고 가정하고,

login 디렉터리를 만들었고 그 안에 login.txt 와 logout.txt 라는 파일을 만들었다.

 

여기서 중요한 점은, a-branch 에서 작업할 파일들은 반드시 a-branch에서 Commit을 해야 한다는 점이다. Commit을 해야 온전히 a-branch의 파일이 된다고 생각하면 편할 것 같다.

만일 Commit을 하지 않고 다른 브런치로 넘어가게 되면, 다른 브런치에서 저 login.txt 와 logout.txt가 보인다. 만들었던 곳은 a-branch인데 말이다. 협업할 때 상당히 헷갈리게 될 것이고 파일들이 꼬일 것이다.

 

login 디렉터리를 add하고 commit까지 완료했다.

이제 b-branch로 바꾸겠다.

 

a-branch에서 b-branch로 바꿨다.

 

b-branch는 멤버 기능을 구현 할거라고 가정하고,

member라는 디렉터리에 member.txt 와 membership.txt 라는 파일을 만들어놓은 상태다.

 

그 뒤에 add와 commit을 해서 b-branch가 관리하게끔 설정해놓았다.


여기서부터는 충돌에 관한 이야기다.

 

a-branch에서 만든 login과 b-branch에서 만든 member를 이제 Master 브런치에 합칠건데, 각자가 만든 작업물들은 크게 상관이 없다. 근데, 방금 전 브런치를 만들 때 '팀원들이 공용으로 개발하는 기본 프로젝트' 가 있다고 했었다.

그리고, 지금 A와 B브런치에는 각각 그 기본 프로젝트들이 들어가 있는 상태이다.

 

만약 a-branch에서 기본 프로젝트의 첫번째 줄을 'aaa' 라고 적었고, b-branch에선 그 첫번째 줄을 'bbb' 라고 적었다고 치자. 그럼 그 상태로 Master 브런치에 합치게 되면 충돌이 발생한다.

한 줄씩 뒤로 밀어준다던지 하는 거 없다. 이럴 경우 이제 직접 충돌을 수정해 줘야한다.


먼저 그 전에, 다른 브런치에 있는 파일을 가져오는 방법과 브런치를 Master로 합치는 방법을 알아보자.

 

상황은 이렇다.

b-branch에서 commonservice.txt 라는 파일을 만들었는데, 이 파일이 a-branch에도 똑같이 있었으면 좋겠다는 상황.

b-branch에서 commonservice.txt를 add 와 commit 먼저 한다.

 

그 뒤, a-branch에 가서

git checkout -p 파일이있는브런치이름 파일명

: 패치(-p)할 파일을 가져오는 명령어

맨 아래에는 a 라고 답하면 된다. (Append)

 

그럼 이렇게 a-branch에도 commonservice.txt 가 들어온 것을 확인할 수 있다. 이 역시 Commit은 필수다.

 

이제 브런치끼리 합치기 전에, 충돌 상황을 미리 만들어보자.

현재 a-branch와 b-branch에 commonservice.txt 라는 똑같은 파일이 있는데, 똑같은 줄에 각각 다른 문구를 넣었다고 가정해보자. 방금 설명했듯이 이 상태로 합치게 되면 충돌이 일어날 것이다.

master 브런치로 돌아온 뒤, a-branch 먼저 합친다.

 

git merge 브런치이름

: 브런치를 합치는 명령어

 

현재 master 브런치엔 기본 프로젝트 외에 다른 건 없었으니 정상적으로 잘 합쳐진다.

그럼 이제 b-branch를 합칠 차례.

예상대로 b-branch를 합치는 도중 충돌이 발생했다.

충돌이 발생하면 저렇게 master | MERGING 이라는 문구로 변한다.

 

아마 에러창을 열어보면

이런 식으로 나와있을 건데,

HEAD 부분은 현재 master 브런치에 저장된 내용이고,

b-branch 부분은 새로 합치려는 내용이다.

첫번째 줄에 두개의 문구가 합쳐지려고 하니 충돌이 발생하는 것이다.

상황을 봐서 잘 해결을 하면 된다. 이 경우에는 그냥 <<<<<<<< HEAD 와 >>>>>>>> b-branch 를 지워버리면 된다.

 

그 뒤, Commit을 해주고

Push를 해주면 최종적으로 a-branch와 b-branch를 합친 master 브런치가 저장소에 올라가게 되는 것이다.


※ 참고로 브런치를 만들 때, 현재 어느 브런치를 사용하고 있는가를 유심히 살펴봐야 한다.

git branch 브런치이름

브런치를 만드는 명령어는, 현재 사용하고 있는 브런치를 본따서 다른 브런치를 만드는 것이기 때문에, 만일 개인 브런치 공간을 본따서 다른 사람의 브런치로 만들어준다면 복잡해질 수도 있다.

댓글