딥러닝 개발환경

8-3. Git에서 Branch 사용하기

Do-Woo-Ner 2020. 3. 12. 15:27

안녕하세요~

 

이번글에서는 '8-2. Git으로 버전관리하기'글을 기반으로 작성하는 곳이니 이번글이 이해가 안되시는 분은 먼저 읽어주시고 오시면 좋을거 같아요~

 

 

지난번글에서 'pytorch_cnn.py'를 기점으로 생성된 버전1,2,3,.... 을 생성하고 관리하는 방법을 알아보았어요.

 

 

 

 

그런데, 모두가 pytorch_cnn.py이라는 프로젝트 코드를 공유하고 개발하고 있는데 원래 계획과는 달리 자신이 다른 기능을 구현해보고 싶거나, 회사에서 다른 기능들을 구현해볼 수 없겠냐는 부탁이 들어온다면 어떻게 하시겠어요? 

 

먄약 'pytorch_cnn.py' 파일을 복사하고 개발하게되면 내가 수정하는 부분이외에는 기존 'pytorch_cnn.py'코드와 대부분 중복된 내용일 테니 불필요한 용량이 증가할거에요 (조금만 수정하기위해 엄청나게 많은 공간을 필요로 할 수 있어요ㅜ)... 내가 수정한 부분만 용량을 차지하면 참 좋을텐데요... 

 

또한 나중에 잘 만들어서 병합할때 다른 사람들에게 수정된 코드를 하나씩 다 설명해줄수도 없고....

 

이러한 문제들을 해결하기 위해 다음글에서는 git에서 제공하는 branch라는 기능에 대해서 알아보도록 할게요!

 

 

 

 

 

 

 

 

<1. Branch 생성하기>

 

git branch: 현재 어떤 branch가 있는지 확인합니다. 처음에는 기본 'master' branch가 있다는걸 확인 할 수 있어요.

git branch 이름: 이름이 아닌 다른 명칭을 사용해도 상관없지만, 저는 hyunsu라는 개발자가 따로 기능을 추가하기 위해 branch를 생성했다는 의미를 부여하고 싶어 아래와 같이 입력했어요.

git checkout 이름: '이름' branch로 이동하게 됩니다.

 

 

 

 

 

 

 

 

 

<2. 서로다른(독립적인) Branch에서 작업하기>

 

지금부터는 'master', 'hyunsu' 브랜치에서 각각 독립적으로 작업을 해볼게요.

 

 

 

1) hyunsu 브랜치에서 기능 추가하고 commit하기

 

 

 

 

 

2) master 브랜치로 이동 후, 기존 'pytorch_cnn.py'의 버그를 수정하기

 

 

 

 

 

 

git log --branches --graph --decorate --oneline 명령어를 입력하면 branch와 git으로 commit된 파일들의 history를 보여주게되요.

 

 

 

 

 

 

 

 

 

 

<3. Branch 병합하기>

 

앞서 'master', 'hyunsu' 브랜치에서 독립적으로 작업하던 내용을 병합해볼거에요.

 

여기에서는 branch가 2개 분이니, 'master' -> 'hyunsu' 또는 'hyunsu' -> 'master' 브랜치로 병합하는 경우의 수가 있겠죠? 

 

 

 

1) 'master' -> 'hyunsu' 병합

 

(먼저 'master' 브랜치에 위치해 있는지 확인해주세요)

 

먼저 현재 master 브랜치에 있는 파일을 확인해 볼게요.

 

아래와 같은 코드가 입력되어 있네요.

 

 

 

자그럼 hyunsu 브랜치에 있는 파일과 병합해볼게요.

"git merge hyunsu"

 

 

 

 

아래 창이 생성되면 'shift+세미콜론(;)'을 동시에 누르고 ':wq'를 입력해준 후 enter를 입력해주세요

 

 

 

"git log --branches --graph --decorate --oneline" 명령어를 이용하여 확인해보면, merge한 파일이 master 브랜치에 새롭게 생성된것을 볼 수 있어요.

 

 

 

 

hyunsu 브랜치 파일에 있는 내용과 비교해봤을 때, 하나의 코드가 추가된걸 확인할 수 있을거에요!

 

     

         

 

 

 

 

 

 

 

 

 

 

<4. Conflict(충돌) 문제 해결하기>

 

두 개의 파일을 merge(병합)할때 conflict 문제가 발생할 수 있어요. 어떤 경우에 conflict가 발생하는지 알아보도록 할게요.

 

먼저 conflict 예시를 들기위해 기존에 만들어놓은 .git 저장소를 제거해주고 

 

 

다시 생성해주었어요.

 

 

 

 

아래와 같은 코드를 만들어주고 master 1 파일을 만들어 줍니다. 

 

 

 

 

 

hyunsu 브랜치에서 2 파일을 만들어줍니다.

 

 

 

 

master 1->hyunsu 2 병합을 시켜주면 아무 문제가 일어나지 않아요.

 

 

 

 

 

 

 

 

그런데, master 1의 파일을 수정하여 master 3라는 파일을 commit했다고 합시다.

 

 

 

 

 

이때 master 3 -> hyunsu 2 를 병합하면 충돌(conflict)가 일어날 가능성이 생겨요.

 

 

 

문제가 일어나는 직접적인 원인은 master 3, hyunsu 2 코드에서 같은 줄에 위치한 내용이 다르기 때문인데요. master 1, hyunsu 2 코드에서도 같은 줄에 위치한 내용이 달랐지만 merge가 된것과 달리 master3, hyunsu 2 병합에서는 문제가 발생하네요. 

 

그 이유에 대해서 언급하자면 아래의 그림으로 표현할 수 있겠어요.

 

 

 

 

충돌문제가 발생하면 아래와 같이 master 브랜치의 어느 부분과 hyunsu 브랜치의 어느 부분이 conflict를 일으키는지 나오게 되는데요. 이 부분을 본인이 판단하는 것에 따라 수정을 해주시면 되요. 만약 

 

 

 

hyunsu 2 파일의 "B로 수정합니다" 부분을 삭제하고 "C로 수정합니다"로 대체하고 싶다면 아래와 같이 입력해주고, pytorch_cnn.py를 실행시킨후

 

 

 

 

commit 해주면 'master 3->hyunsu 2' 병합파일이 생성되요! (자동으로 병합이 생성되는이유는 conflict가 생성되면 자동으로 임시 브랜치인 'master|MERGING'이 생성되기 때문에, 이 branch는 현재 conflict 된 부분을 수정하는 중인걸 알려주고, commit을 통해 conflict가 해결이 되었다는 사실이 확인되면 자연스럽게 master 브랜치에서 'master 3 -> hyunsu 2' 병합파일인 master 4가 생성되는 원리에요.

 

 

 

 

 

 

 

 

 

<5. Branch 삭제하기>

 

삭제명령어: git branch -d 브랜치이름

 

 

 

 

 

 

 

 

 

지금까지 git을 이용하여 branch를 어떻게 하는지 알아보았어요.

 

다음 글에서는 지금까지 git을 이용하여 loca repo에 업로드한 파일들을 어떻게 원격저장소(remote repo; Github)에 업로드하고 사용할 수 있는지에 대해서 알아볼게요!   

 

 

 

 

[글 레퍼런스]

https://opentutorials.org/module/3733

https://www.youtube.com/playlist?list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk

https://rogerdudler.github.io/git-guide/index.ko.html