본문 바로가기
프로그래밍 ( Programming )/깃허브 (GitHub)

6. Git Branch와 Merge

by Jayce_choi 2021. 11. 18.
반응형

git 브랜치

깃은 동시에 여러 개발자들이 프로젝트에서 각기 다른 기능을 개발할 수 있도록 브랜치라는 기능을 제공합니다. 이를 통해서 서로 다른 브랜치는 작업을 하는 데 있어서 서로에게 영향을 받지 않는다는 점에서 서로 다른 개발 작업이 가능합니다. 

브랜치의 동작 과정은 다음과 같은 예시로 표현이 가능합니다. 

기본적으로 Git 저장소를 만들게 되면 자동으로 마스터(Master) 브랜치가 생성이 됩니다. 깃 허브의 사이트에서 레포지토리를 한개 생성하면 밑에 사진과 같이 branch 항목에 1 숫자가 들어가게 되는데 해당 숫자가 바로 마스터 브랜치를 의미합니다.

그리고 해당 마스터 브랜치는 일반적으로 배포가 가능한 수준의 안정화된 버전을 포함하고 있어야 하기때문에 항상 안전하게 관리되어야 합니다. 

여기서 만약 새로운 기능을 개발할 필요가 있거나 버그 수정이 필요한 일이 발생했을때는 이때 필요에 따라서 밑에 그림과 같이 branch를 생성해주게 됩니다. 

그리고 시간이 지나서 기능 개발과 에러 수정이 완료가 되었을때는 하늘색의 포인트로 Master와 합쳐지게 되는데 이를 Merge라고 합니다. 

종합하면 다음과 같이 2가지 브랜치로 표현할수있습니다. 

-통합 브랜치: 배포가 가능한 수준의 브랜치로 일반적으로 마스터 브랜치를 의미합니다.
-토픽 브랜치: 특정한 기능을 위해서 만들어진 브랜치로 일반적으로 마스터 브랜치를 제외한 브랜치들을 의미합니다. 
(Develop, Bug fix .... ) 


실습을 해봅시다. 

git branch라는 명령어를 입력하면 사진과 같이 현재 branch가 몇 개 존재하는지 나오게 됩니다. 현재는 branch 생성을 안 했기 때문에 master branch, 즉 원래 있던 메인 branch만 보입니다.
(여기서 현재 * 표시가 master 옆에 붙어있는데 이는 현재 내가 다루는 branch 위치를 말하고 있습니다) 

 

1. 이제 새로운 branch를 만들어봅시다. 

명령어: git branch (브랜치)이름

develop1이라는 branch를 하나 생성하였고 생성된 것을 명령어를 통해서 확인하였습니다.
(master 이외에 한 개가 더 생겼습니다) 

 

2. 이제 다른 branch로 활동 영역을 옮겨봅시다. 

명령어: git checkout (브랜치) 이름

checkout 명령어를 통해서 다른 branch로 이동을 한 것을 확인하였습니다. 

 

3. 이 상태에서 코드에다가 새로운 함수를 넣고 변화를 한번 관찰해봅시다. 

먼저 기존에 있었던 python 파일 add_module에다가 변화를 관찰하기 위해서 add_twice라는 새로운 함수를 기입하였습니다. 

그리고 동일하게 git add. 명령어와 git commit -m 명령어를 이용하여 add_twice라는 함수가 생겼다는 것을 add_module이름과 함께 기록해줍니다. 

 

git log 명령어를 이용하여 확인해보면 다음과 같이 HEAD->develop1, 즉 develop1이라는 branch에 add_twice commit이 생겼습니다. 그러나 아직까지는 master branch에는 반영이 안 되었으며 또한 master branch가 원격 저장소를 가리키고 있으므로 원격 저장소에도 반영이 안 된 상태입니다. 

 

4. 이제 branch에서 수정된 코드를 master와 병합하고 원격 저장소로 보내봅시다.

먼저 master branch와 develop1이라는 branch 내용과 merge 해봅시다. 

checkout 명령어를 통해서 현재 보고 있는 branch위치를 master로 옮깁니다. 그리고 git merge 명령어를 통해서 코드를 합칩니다. 


*코드를 합친다는 의미가 조금 헷갈릴 수가 있습니다. 왜냐하면 코드를 합치는 상황이 여러 개가 존재하기 때문입니다. 

merge에는 크게 두 가지 상황이 존재합니다. 

1. 서로 다른 파일을 수정했을 때
2. 서로 같은 파일을 수정했을 때

먼저 1번의 상황은 불편할 것이 하나도 없습니다. 만약 A라는 사람이 A.java 파일을 수정했고 B라는 사람이 B.java 파일을 수정했을 때 merge 한다면 git이 자동으로 소스코드를 합쳐줄 것입니다. (충돌 없음)

2번의 상황은 또다시 세부적으로 두 가지 경우로 나뉠 수 있습니다. 

2-1) 서로 같은 이름의 파일을 수정했지만 수정한 부분이 다를 때
2-2) 서로 같은 이름의 파일을 수정하고 수정한 부분이 겹칠 때


2-1 상황일 때는 같은 파일을 수정할 때 A라는 사람은 1~200번째 코드에 위치한 내용을 수정했고 B라는 사람은 400~600의 위치를 수정했고 내용에 겹침이 없을 때 git이 자동으로 합쳐줄 것입니다. (문제없음 - 충돌 없음) 

2-2 상황일 때는 예를 들어서 A와 B라는 사람이 동일한 함수 명의 내용을 수정했고 만약 내용이 한 줄이라도 다를 경우 git에서는 conflict 충돌이 났다고 알려주고 즉 개발자 스스로 수정을 해야 한다고 알려줄 것입니다. 


다시 본론으로 돌아와서 제가 했던 과정은 단순하게 새로운 함수를 추가한 것뿐이므로 master branch 내용과 develop1 branch 내용과 겹치는 게 존재하지 않기에 문제없이 merge 될 수 있습니다. 

 

이제 다시 git log 명령어를 실행해보면 다음과 같이 master와 develop1 모두 add_module [add_twice]가 포함된 것을 확인할 수가 있었습니다. (HEAD-> master와 develop1 모두 가리키고 있습니다)

 

5. 이제 원격 저장소로 push를 함으로써 원격 저장소에도 반영을 시켜줍니다. 

 

6. 기능을 다한 develop1 branch를 삭제하고 마무리해줍니다. 

삭제를 위해서는 git branch -d 옵션을 사용하면 되겠습니다. 그리고 git branch 명령어를 통해서 남아있는 branch가 master 뿐인 것을 확인하였습니다. 


이번 글에서는 새로운 branch를 만들어보았으며 branch 간의 이동 방법과 merge 명령어를 통해서 master에 반영하는 방법, 그리고 마지막으로 branch 삭제까지 해보았습니다. 

사용한 명령어

1. git branch (현재 branch 목록을 확인)
2. git branch '이름' ('이름'이라는 branch를 생성함)
3. git checkout '이름' ('이름' 이라는 branch로 이동) 
4. git merge '이름' (현재 내가 있는 branch로 '이름'이라는 branch의 내용과 합침, 현재 내가있는 위치는 git branch 명령어 입력 시 * 표시가 달린 위치로 확인 가능)

5. git branch -d '이름' ('이름'이라는 branch를 삭제)  

반응형

댓글