8-3. Git에서 Branch 사용하기
안녕하세요~
이번글에서는 '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