github 브랜치(branch) 병합 방법

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
git 

더 보면 좋을 글들