Branch란 특정시점으로 부터 분기점을 생성하여 독립적으로 코드를 변경할 수 있도록 도와주는 모델이다. 문자 그대로의 뜻인 나무가 가지를 치는 그림을 떠올리면 조금 더 이해가 쉬울 것이다.
branch를 생성할 때는 그 위에서 어떤 일을 할 것인지를 명시적으로 작성해주어야 한다. 그렇지 않으면 branch에서 어떤 일을 했는지 다시 다 뜯어봐야하게 되는 문제가 생긴다.
또한 분기점이 생기는 상황들은 항상 commit을 기준으로 움직인다고 생각하는 것이 좋다.
$ git branch // *main
$ git branch hello // 현재 있는 최신 commit으로부터 분기점을 생성한다.
$ git branch //*main hello
//이동(구버전)
$ git checkout hello [checkout은 복구, 이동 의 액선을 가짐] => 두개로 나눔(switch, restore)
$ git branch
//이동(최신)
$ git switch hello
$ git branch // main *hello
branch이동
- 기존에는 checkout을 통해 branch를 이동했지만, checkout이 복구와 이동의 두가지 액션을 가지고 있기 때문에 두가지 액션을 분리하게 되었다. 이동의 경우 switch, 복구의 경우 restore로 사용할 수 있다.
hello branch 위에서 작업
$ vi branch.py //작성 내용: print('hello')
$ cat branch.py // print('hello')
$ python3 branch.py // hello
$ git add branch.py
$ git commit -m "feat: Print 'hello'"
main brnach 위에서 작업
$ git switch main
$ cat branch.py // 출력결과가 없다.
$ python3 branch.py // 출력결과가 없다.
코드 병합의 경우 당긴다라고 생각하면 이해가 조금 더 쉽다. 만약, hello라는 브랜치에서 작업한 내용을 mian 브랜치로 당겨오고 싶은 경우 main 브랜치에서 코드 병합을 진행해주면 된다.
$ git branch // *main 확인
//코드 병합
$ git merge hello
// hello 브랜치 삭제
$ git branch -D hello
$ cat branch // print('hello')
브랜치 삭제
git branch -D hello
- branch를 지우는 경우는 브랜치의 라이프사이클이 다 되었거나 잘 못 되었을 경우이다. 또한 브랜치는 주기적으로 지우며 진행을 하는 것이 좋다.
- 브랜치가 병합된 후라면 브랜치가 삭제되더라도 코드는 남아있게 된다.
$ git branch //*main
// repeat-hello 브랜치 생성 및 코드 작성
$ git branch repeat-hello
$ vi repeat-hello
// 생성 확인
$ git branch //*main repeat-hello
// main브랜치의 branch.py 파일 수정
$ vi branch.py
$ cat brnach.py
//i =3
if i%3==0;
print('hello')
$ python3 branch.py
//hello
$ git status
$ git add branch.py
$ git commit -m "feat: Add if Statement"
//repeat-hello 브랜치로 이동
$ git switch repeat-hello
$ vi branch.py
// for _ range(10):
print('hello')
$ python3 branch.py // hello 10번 출력
$ cat brnach.py
$ git add branch.py
$ git commit -m "feat: Add for Statement"
//코드병합
$ git switch main
$ git merge repeat-hello //CONFICT 충돌이 났음을 알린다.
$ vi branch.py //brnach.py를 열어 확인
repeat-hello
브랜치에서는 hello
를 출력하는 코드를, main
브랜치에서는 hello
를 10번 출력하는 코드를 작성했다.(기존 branch.py 코드 : print('hello')
병합을 하게 되면 git은 아래와 같이 충돌난 코드 부분만 따로 알려주게 된다. 이를 merge completed라고 한다.
<<<< HEAD
i = 3
if i%3==0:
======
for _ in range(10):
>>>>>>>> repeat-hello
print('hello')
코드 수정 후 git status
를 통해 확인해보면, both modified: branch.py라는 안내문구로 아직 merge
가 끝나지 않은 상태임을 확인할 수 있다. merge가 완벽하게 끝나기 위해서는 코드 수정 후 git add
와 git commit
작업까지 완료를 해주어야한다.
단, 코드 충돌 병합 후에는 자동으로 commit내용이 수정되어 들어가기 때문에 $ git commit -m
을 통해 commit
을 진행해서는 안된다. 만약, -m
플래그를 통해 commit
을 하게 되는 경우 그 내용까지 덮어쓰게 된다.
$ git add branch.py
$ git commit
$ git push origin master