1. Branch
개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생깁니다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있습니다.
만약, 코드를 복사하지 않고 한 줄로 커밋할 경우 똑같은 코드를 동시에 커밋하면 충돌이 일어나지 않을까요? 이럴 때 독립적으로 개발하여 여러줄로 커밋하는 것이 브랜치입니다.
이렇게 브랜치를 생성하면 여러 줄로 커밋하면 충돌이 일어나는 시점을 찾아 해결이 가능합니다.

브랜치는 하나의 기능을 가리키거나 특정 커밋을 가르키는 바로가기 같은 것 입니다. 브랜치를 생성하면 현재 커밋을 가르키는 브랜치가 생성됩니다.
특정 브랜치에서 작업중인데 새로운 커밋을 하면 브랜치는 그 새로운 커밋을 가르키게 됩니다.
기본 브랜치는 master 브랜치 입니다. git저장소를 초기화 할 때 자동으로 만들어 집니다. 이때, 'HEAD'라는 특수한 포인터가 있습니다. 이 포인터는 지금 작업중인 브랜치를 가르킵니다.

하나의 기능의 개발이 완료되면 특정 브랜치의 내용들을 master 브랜치에 합칩니다. 또 새로운 작업을 하려고 하면 master 브랜치에서 다시 새로운 feature브랜치를 생성하고 작업을 합니다.


특정 기능을 작업하고 있는데 급하게 버그를 수정해야 하는 경우가 발생합니다. 이런 경우 현재의 작업상태를 임시로 커밋해두고 이전 기능 작업중인 상태로 브랜치(작업폴더)를 변경할 수 있습니다.
버그 패치용 브랜치를 만들고 수정 작업을 합니다. 이후 작업이 완료되면 버그 패치용 브랜치의 추가된 변경 내역을 마스터 브랜치에 합칠 수 있습니다.
이런 과정을 거치면 master브랜치는 가장 최근에 배포한 소스코드의 커밋을 가르키고 있게 됩니다.
지금부터 브랜치 사용방법을 알아보겠습니다.
- 현재 브랜치 목록과 현재 브랜치 확인
$ git branch

- branch 만들기 브랜치를 현재 시점에 만들수 있습니다. Gary 브랜치를 만들어 보자.
$ git branch Gary

2. git checkout
2-1. checkout
checkout은 브랜치 변경 또는 작업 트리 파일 복원을 할 수 있습니다. 하지만 Git 2.23에서 checkout 을 대신해 switch와 restore가 도입되었습니다. 다음과 같이 대체된 이유는 기존의 checkout이 가진 기능이 많기 때문입니다.
브랜치를 이동할 수 있습니다. Gary 브랜치로 이동해보자.
$ git checkout Gary

새로운 내용을 추가하고 커밋해봅시다.
$ echo 'hello branch' >> branch.txt $ git status $ git add branch.txt $ git commit -m "개리 5"

상대방이 원격 저장소에서 pull을 받습니다.
$ git pull
.png?table=block&id=9c97ba4a-3b22-40de-8f95-c12101f87dce&cache=v2)
상대방이 브랜치를 생성하고 커밋을 한 경우입니다.
$ git checkout master $ git branch binky $ git checkout binky $ git commit -m "빙키 1"

2-2. switch
브랜치 변경합니다.
$ git switch Gary


브랜치를 새로 만들어서 변경할 수도 있습니다.
$ git switch -c Gary


2-3. restore
파일 수정 내용 복원과 add를 통해 스테이지에 올린 것을 뺄 때에도 사용합니다.
우선 파일을 생성한 후 커밋을 합니다.
$ touch README.md $ vi README.md //i->작성 후->Esc->:wq $ git add . $ git commit -m "add file" $ git status

이후 해당 파일을 수정한 후에 저장을 하고 상태를 보도록 하겠습니다.
$ vi README.md //i->수정 후->Esc->:wq
modified 파일이 있다고 나온 것을 볼 수 있습니다.

이때, 파일 변경내역을 modified 파일에서 unmodified 파일로 되돌리는 방법은 두가지가 있습니다.
1) restore을 이용하여 변경사항을 되돌려 보도록 하겠습니다.
$ git restore README.md
2) checkout을 이용하여 파일 변경내역을 되돌립니다. 이때, checkout으로 지워진 내용은 commit을 하지 않았기 때문에 다시 복구할 수 없습니다.
$ git checkout -- README.md
modified 파일이 없는 것을 볼 수 있습니다.

파일을 열어 확인한 결과입니다.
hello world Byebye
hello world
스테이지 올린 것을 빼는 방법은 두가지가 있습니다. 이용합니다.
$ git add . $ git status

1) restore 명령어를 이용하여 빼기
$ git restore --staged README.md
1) reset 명령어를 이용하여 빼기
$ git reset HEAD README.md

상태를 확인해 보면 스테이지에 올라가 있지 않은 것을 확인할 수 있습니다.

3. merge(합병)

두 branch로 나누어 작업했던 것을 병합하는 명령어입니다.
$ git checkout master $ git log $ git merge binky $ git log
merge가 완료되었으면 push 까지 해주셔야 원격 저장소에 반영이 됩니다.
$ git push origin master

위에 binky 브랜치를 merge한 후에 gary의 브랜치를 merge해 보도록 하겠습니다. 만약, 두 브랜치가 같은 곳을 수정했다면 충돌이 일어나지만 지금은 다른 곳을 수정했다는 가정하에 진행하도록 하겠습니다.
$ git merge Gary $ git push origin master

4. conflict(충돌)
개리 브랜치와 master 브랜치 둘 다 README.md에서 작업을 하는데 서로 변경 내역이 다르다고 가정해 보도록 하겠습니다.
이때, 개리 브랜치와 master 브랜치의 작업내역입니다.
hello world hello Gary
hello world hello binky
merge할 때 두 브랜치가 같은 곳을 수정했다면 충돌이 일어납니다. 이때 충돌난 시점을 찾아 수동으로 고쳐주셔야 합니다.
<<<<<<< HEAD (Current Change) hello world hello binky ======= >>>>>>> branchName (Incoming Change) hello world hello Gary
conflict는 두가지 변경 내역을 비교한 다음에 원하는 코드를 남기는 것입니다.
hello world hello binky Gary
이후 commit > push 를 해주시면 됩니다.