모든 버전 관리 시스템은 브랜치를 지원한다. 원래 코드와 상관없이 독립적으로 개발을 진행할 수 있어야 되는데, 이렇게 사용하는 것이 브랜치이다.
다른 브랜치를 만들어 작업한 다음 나중에 병합(merge) 하는 식으로 작업을 권장한다.
git의 새 브런치는 git branch
명령어로 만들 수 있다.
$ git branch tube
git은 HEAD라는 특수한 포인터가 지금 작업 중인 브랜치를 파악한다.
브랜치를 생성하면서 바로 해당 브랜치로 이동할 수 있다.
$ git switch -c tube
git switch
명령어로 HEAD가 가리키는 브랜치를 변경할 수 있다.
$ git switch tube
Switched to branch 'tube'
git 2.3 이후 버전에서는 checkout 기능 중에 switch, restore 기능은 분리되었다. checkout 명령어가 안되는 건 아니지만 checkout의 기능이 많아 분리 시킨 듯싶다.
tube 브랜치로 파일을 하나 만들고 커밋 해 보자. ( 현재 tube의 브랜치이다. )
$ echo "tube branch" > REAMDME_TUBE.md
$ git add .
$ git commit -m "tube branch commit"
$ ll
total 16
drwxr-xr-x 5 jeonjeonghoon staff 160B 4 29 03:36 .
drwxr-xr-x 8 jeonjeonghoon staff 256B 4 29 03:25 ..
drwxr-xr-x 12 jeonjeonghoon staff 384B 4 29 03:36 .git
-rw-r--r-- 1 jeonjeonghoon staff 12B 4 29 03:27 README.md
-rw-r--r-- 1 jeonjeonghoon staff 12B 4 29 03:36 REAMDME_TUBE.md
잘 생성 되었다. 그럼 이제 다시 master의 브랜치로 가보자.
$ get switch master
$ ll
total 8
drwxr-xr-x 4 jeonjeonghoon staff 128B 4 29 03:36 .
drwxr-xr-x 8 jeonjeonghoon staff 256B 4 29 03:25 ..
drwxr-xr-x 12 jeonjeonghoon staff 384B 4 29 03:36 .git
-rw-r--r-- 1 jeonjeonghoon staff 12B 4 29 03:27 README.md
tube 브랜치에서 커밋 했던 파일이 없다. 두 브랜치의 작업은 독립적으로 각 브랜치에 존재한다. 때가 되면 각자 작업 후 병합(merge) 해줘야 된다.
현재 어떤 브랜치에서 작업 중인지 확인해야 될 때가 있다. git log
명령어로 확인하도록 하자.
$ git log --oneline --decorate --graph --all
* 7ec78d8 (HEAD -> tube) tube branch commit
* 373147d (master) first commit
(END)
새로운 브랜치를 만들어 작업이 끝났거나 이슈를 해결했으면 git merge
명령어로 다시 브랜치를 합쳐야 한다.
밑은 12번 issue가 생겨 브랜치를 만들어 해결하는 과정이다.
$ git switch -c iss12
$ echo "fixed me" > fixedfile.md
$ git add fixedfile.md
$ git commit -m "fixed the issue 12"
$ git switch master
$ git merge iss12
더 이상 필요 없는 브랜치는 git branch -d
명령어로 삭제해 준다.
$ git branch -d iss12
git branch
명령어로 branch들을 관리할 수 있다. git branch -v
명령어를 이용하면 각 브랜치마다 마지막 커밋 메시지를 볼 수 있다.
$ git branch -v
--merged
--no-merged
옵션을 이용하면 merge된 브랜치와 merge 되지 않은 브랜치를 볼 수 있다.
$ git branch --merged
$ git branch --no-merged
merge 되지 않는 커밋을 담고 있는 브랜치는 기본적으로 삭제되지 않지만 git branch -D 명령어로 강제로 삭제할 수 있다.
리모트 Refs는 리모트 저장소에 있는 포인터인 레퍼런스이다. 리모트 저장소에 있는 브랜치, 태그 등등을 의미한다. git ls-remote
로 모든 리모트 Refs를 조회할 수 있다. git remote show
명령은 모든 리모트 브랜치와 그 정보를 보여준다.
$ git remote show
origin
$ git remote show origin
* remote origin
Fetch URL: https://github.com/tube-jeonghoon/git-test.git
Push URL: https://github.com/tube-jeonghoon/git-test.git
HEAD branch: master
Remote branches:
master tracked
refs/remotes/origin/serverfix stale (use 'git remote prune' to remove)
Local ref configured for 'git push':
master pushes to master (fast-forwardable)
리모트 브랜치를 추적하는 브랜치이다. 이 브랜치는 로컬에 있지만 움직일 수는 없다. 리모트 서버에 연결할 때마다 리모트 브랜치에 따라서 자동으로 움직일 뿐이다. 리모트 트래킹 브랜치는 북마크라고 할 수 있다.
리모트 브랜치의 이름은 (remote)/(branch)
형식으로 되어 있다. 예를 들어 저장소 origin의 master의 브랜치를 보고 싶다면 origin/master라는 이름으로 브랜치를 확인하면 된다.
로컬 브랜치를 서버로 전송하려면 쓰기 권한이 있는 리모트 저장소에 Push 해야 한다.
git push (remote) (branch)
명령어로 원격 저장소에 Push 할 수 있다.
$ git push origin hotfix
git push origin hotfix
명령어는 자동적으로 원격 저장소에 hotfix 브랜치에 저장된다. [로컬 저장소]:[원격 저장소] 형으로 자동으로 변형된다. 만약 원격 저장소에 다른 이름의 브랜치로 저장하고 싶으면 [원격 저장소]의 이름을 바꿔주면 된다. git push origin hotfix:newhotfix
이런 형태로 말이다.
업데이트된 원격 저장소에서 데이터를 받을 때는 git fetch
명령어를 쓰면 된다. 주의할 점은 여기서 Fetch 명령으로 리모트 트래킹 브랜치를 내려받는다고 해서 로컬 저장소에 수정할 수 있는 새로운 브랜치가 생기는 것이 아니다. 그냥 origin에 해당 브랜치의 리모트 브랜치 포인터가 생기는 것이다.
내려받은 Fetch에는 두 가지 선택지가 있다.
1. git merge [remote]/[branch]
로 받은 내용하고 병합(merge) 하는 것
$ git merge origin/hotfix
2.git switch -c [new_branch] [remote]/[branch]
로 병합(merge) 하지 않고 트래킹 브랜치에서 새 브랜치를 만들어서 작업하는 것
$ git switch -c hotfix origin/hotfix
리모트 트래킹 브랜치를 로컬 브랜치로 받아오면 자동으로 "tracking 브랜치"가 만들어진다. 트래킹 브랜치는 리모트 브랜치와 직접적인 연결고리가 있는 로컬 브랜치이다. 저장소를 clone 하면 자동적으로 로컬 master 브랜치를 리모트 origin/master 브랜치의 트래킹 브랜치로 만든다.
새로운 브랜치를 생성하면서 origin 저장소의 hotfix 브랜치를 트래킹 한다.
$ git switch -c hf origin/hotfix
기존 브랜치에 origin 저장소의 hotfix 브랜치를 트래킹한다.
$ git switch hotfix
$ git brach -u origin/hotfix
해당 리모트 브랜치가 업데이트되면 git pull
명령어로 업데이트하면 된다.
$ git pull
해당 리모트 브랜치가 필요 없어지면 git push --delete
명령어로 삭제해 준다.
$ git push origin --delete hotfix
To https://github.com/tube-jeonghoon/git-test.git
- [deleted] hotfix