git 을 정말 오랫동안 사용하고 있긴한데, 나는 branch 기능은 몬가 어렵고 잘못될까봐 잘안쓰는 경향이 있다. 그래도 잘만 사용하면, 소스의 버전을 여러개 만들어서 건별 이슈를 대응하거나 테스트계 등을 구현할때 편리하게 사용할 수 있다.
git branch 기능은 실수를 하게 되면 돌이키기가 좀 어렵다보니, 별도의 저장소를 하나 만들어서 테스트와 훈련을 열심히 하고난 후에 실제 프로젝트에 적용해보시길 권한다. 하더라도 소스 백업 등 zip 으로 묶어 별도 저장하고나서 진행하는 것도 하나의 방법이다.
test branch 만들기
브랜치를 생성하는 명령어는 간단하다. 이름만 정하면 되며, 여기서는 test
로 정했다.
root@bb0c9c1 ~/github/branch-study [master]
> git branch test # 브랜치 생성
root@bb0c9c1 ~/github/branch-study [test]
> git checkout test # master 에서 test 브랜치로 전환
Switched to branch 'test'
test branch 에서 신규파일 추가
test 브랜치에서 신규파일을 하나 만들고, 임의의 텍스트를 적고 저장한다.
root@bb0c9c1 ~/github/branch-study [test *]
> vim new-file.txt
root@bb0c9c1 ~/github/branch-study [test *]
> cat new-file.txt
test 브랜치에 입력한 텍스트.
이제 git add
, git commit
으로 로컬에 커밋까지 완료한다.
> git status
On branch test
Untracked files:
(use "git add <file>..." to include in what will be committed)
new-file.txt
> git add .
> git commit -m .
[test 2da83dd] .
1 file changed, 1 insertion(+)
create mode 100644 new-file.txt
이 시점에서 새로 생성된 new-file.txt
이 각 브랜치에서 보이는지 안보이는지 확인을 해보자. test
에서는 보이나 master
에서는 안보인다.
# test 브랜치에서는 new-file.txt 파일이 존재함.
root@bb0c9c1 ~/github/branch-study [test]
> ls -al
total 40
drwxr-xr-x 8 root staff 256B 10 23 13:18 .
drwxr-xr-x 11 root staff 352B 10 23 11:24 ..
drwxr-xr-x 13 root staff 416B 10 23 13:18 .git
-rw-r--r-- 1 root staff 18B 10 23 11:24 .gitattributes
-rw-r--r-- 1 root staff 297B 10 23 11:24 README.md
-rw-r--r-- 1 root staff 39B 10 23 13:18 new-file.txt
# test에서 master 브랜치로 전환
root@bb0c9c1 ~/github/branch-study [test]
> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
# 전환된 master 브랜치에서는 new-file.txt 파일이 보이지 않는다.
root@bb0c9c1 ~/github/branch-study [master]
> ls -al
total 32
drwxr-xr-x 7 root staff 224B 10 23 13:16 .
drwxr-xr-x 11 root staff 352B 10 23 11:24 ..
drwxr-xr-x 13 root staff 416B 10 23 13:16 .git
-rw-r--r-- 1 root staff 18B 10 23 11:24 .gitattributes
-rw-r--r-- 1 root staff 297B 10 23 11:24 README.md
하나만 더 확인해보자. 만약 어떤 브랜치에도 git commit
하지 않은 신규 파일은 브랜치별로 어떻게 보일까. 실험으로 new-file2.txt
파일을 하나 만들어서 커밋없이 그냥 나두고, 브랜치간 전환을 해서 ls
로 파일목록을 확인해봤다. 결론은 모두 그냥 보인다. 아직 어느 브랜치에서도 귀속되지(커밋) 않았기 때문이다.
# test 브랜치에 new-file2.txt 파일이 존재함.
root@bb0c9c1 ~/github/branch-study [test *]
± % ls -al
total 48
drwxr-xr-x 9 root staff 288B 10 23 13:26 .
drwxr-xr-x 11 root staff 352B 10 23 11:24 ..
drwxr-xr-x 13 root staff 416B 10 23 13:18 .git
-rw-r--r-- 1 root staff 18B 10 23 11:24 .gitattributes
-rw-r--r-- 1 root staff 297B 10 23 11:24 README.md
-rw-r--r-- 1 root staff 39B 10 23 13:18 new-file.txt
-rw-r--r-- 1 root staff 47B 10 23 13:26 new-file2.txt
root@bb0c9c1 ~/github/branch-study [test *]
> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
# master 브랜치에서도 new-file2.txt 파일이 존재함.
root@bb0c9c1 ~/github/branch-study [master *]
> ls -al
total 40
drwxr-xr-x 8 root staff 256B 10 23 13:27 .
drwxr-xr-x 11 root staff 352B 10 23 11:24 ..
drwxr-xr-x 13 root staff 416B 10 23 13:27 .git
-rw-r--r-- 1 root staff 18B 10 23 11:24 .gitattributes
-rw-r--r-- 1 root staff 297B 10 23 11:24 README.md
-rw-r--r-- 1 root staff 47B 10 23 13:26 new-file2.txt
test branch 에서 git push 하기
github 원격저장소에 파일을 push 해서 올려보자. 처음이라면 오류가 난다. 아직 한번도 github 원격저장소에 test 브랜치를 push 한적이 업기 때문에 한번은 git push --set-upstream
옵션으로 push 를 해야 한다.
> git push
fatal: The current branch test has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin test
도움말에 보면, -u
와 --set-upstream
두개 명령어는 동일한 것이니 아무거나 사용하면 된다.
> git push --help
NAME
git-push - Update remote refs along with associated objects
SYNOPSIS
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] ...(중략)...
어쨋든 아까 오류 메시지에 있던 명령어를 실행하면, github 에 test 브랜치가 등록이 된다. 참고로 한번 실행하고 나면, --set-upstream origin test
옵션 없이 git push
만 실행해도 알아서 해당 브랜치 원격저장소로 push
가 되니 참고한다.
root@bb0c9c1 ~/github/branch-study [test]
> git push --set-upstream origin test
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 537 bytes | 537.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
To https://github.com/******/branch-study.git
* [new branch] test -> test
Branch 'test' set up to track remote branch 'test' from 'origin'.
github 페이지에 가보면, 아래와 같이 test 브랜치가 생긴걸 볼 수 있다.
참고로, 아래 명령어를 사용하면 한번 입력후 git push, git pull
사용시 더이상 비번과 유저명을 물어보지 않게 된다. 개인PC에만 사용하길 권장한다.
$ git config --global credential.helper store
git 브랜치간 병합 처리
branch 가 별도 PC 에서 커밋해서 원격저장소까지 발행했다면, master 쪽 PC에서는 branch 정보가 없기 때문에 git pull
명령어로 원격저장소 변경내용을 받아와야 한다. 동일 환경이라면 굳이 할 필요는 없다.
git pull
이렇게 test
브랜치를 만들어서 관리를 하다가 드디어 메인인 master
로 해당 소스를 머지(병햡)하려면 어떻게 해야 할까. 브랜치간 병합처리를 도와주는 git merge
명령어를 사용하면 된다. 중요한 포인트는 머지를 하고자하는 브랜치로 전환을 해놓고 거기서 명령어를 실행해야 한다. 우선 master
로 브랜치 전환을 하고 ls
명령어로 현재 아직 new-file.txt
가 없는 걸 확인한다.
root@bb0c9c1 ~/github/branch-study [test]
± % git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
root@bb0c9c1 ~/github/branch-study [master]
± % ll
total 32
drwxr-xr-x 7 root staff 224B 10 23 13:58 .
drwxr-xr-x 11 root staff 352B 10 23 11:24 ..
drwxr-xr-x 13 root staff 416B 10 23 13:58 .git
-rw-r--r-- 1 root staff 18B 10 23 11:24 .gitattributes
-rw-r--r-- 1 root staff 297B 10 23 11:24 README.md
main
브랜치임을 확인하고, git merge
명령어를 실행해서 new-file.txt
가 제대로 생겼는지 확인하면 끝.
root@bb0c9c1 ~/github/branch-study [master]
± % git merge test
Updating cfa3bea..2da83dd
Fast-forward
new-file.txt | 1 +
1 files changed, 1 insertion(+)
create mode 100644 new-file.txt
root@bb0c9c1 ~/github/branch-study [master]
± % ll
total 40
drwxr-xr-x 8 root staff 256B 10 23 13:58 .
drwxr-xr-x 11 root staff 352B 10 23 11:24 ..
drwxr-xr-x 14 root staff 448B 10 23 13:58 .git
-rw-r--r-- 1 root staff 18B 10 23 11:24 .gitattributes
-rw-r--r-- 1 root staff 297B 10 23 11:24 README.md
-rw-r--r-- 1 root staff 39B 10 23 13:58 new-file.txt