Git Basics (4)

2 minute read

Creating a branch

브랜치는 생성하는 것은 코드나 워크 플로우를 깨트릴 위험 없이 레포지토리에 새로운 내용을 추가할 수 있는 일을 가능하게 해준다.

즉, 레포지토리의 다른 브랜치들에게 영향을 주지 않고 개발 환경을 분리시킬 수 있다. 각 레포지토리는 한 개의 디폴트 브랜치를 가지고, 여러 개의 다른 브랜치들을 가질 수 있다. 브랜치를 만들면 메인 브랜치로부터 분리된 working repository를 생성할 수 있는 것이다. 여기서 working repository는 과거에 만든 아무런 커밋을 기반으로 가질 수 있다. Git에서 첫번 째의 디폴트 브랜치는 항상 parent라고 부른다.

브랜치를 생성하기 위해서는 그 브랜치가 어떠한 커밋으로부터 시작될 것인지를 결정해야 한다. 따라서 해당 커밋을 가지고 있는 브랜치의 이름과 commit object의 SHA1 파일 이름을 알아야 한다.

예를 들어, master 브랜치의 가장 최근의 커밋으로부터 브랜치를 생성한다고 생각해보자. 그 commit object의 SHA1 파일 이름을 알아내기 위해서, Git은 커밋들과 관련 object 이름을 나열하는 편리한 커맨드를 제공한다.

git log

다음과 같은 아웃풋이 나올 것이다.

    commit f76db3c05ddc2b5944f0ff8c4d9d3da1cd5dd1ed (HEAD -> master) 
    Author: Sui <sui.man@google.com>
    Date: Thu Jul 26 15:24:17 2018 +1000 


        add unit name to unit.txt 

    commit c104d14008cdcef613ec0ef06bdd8af708db0d8b
    Author: Sui <sui.man@google.com>
    Date: Thu Jul 26 14:44:19 2018 +1000 

        My First Commit 

HEAD -> master가 있는 가장 최근 커밋을 확인 하였다. 이제 git branchgit status를 실행하여 어떠한 브랜치가 현재 active한지 확인할 수 있다.

이제 브랜치를 만들기 위해 다음을 실행한다.

git branch new_branch

이제 가장 최근 커밋으로부터 new_branch라는 새로운 브랜치가 생성될 것이다. 다른 브랜치로 바꾸기 위해 git checkout <branch name>을 실행할 수 있다.

특정 브랜치로 checkout 한다고 말하고, 이는 HEAD 포인터를 특정 커밋으로 옮기는 것을 의미한다.

git checkout new_branch # To move HEAD pointer to branch new_branch

쇼트컷이 존재하는데, 위의 두 개의 커맨드는 다음 커맨드 하나로 한 번에 실행될 수 있다.

git checkout -b new_branch

git checkout-b flag를 쓰면 새로운 브랜치를 만들고 그것으로 checkout을 한다.

NOTE: checkout to a commit? OR checkout to a branch?에 대해 의문점이 들었다. 브랜치 이동도 가능하고 커밋 이동도 가능한 것일까?라는 질문이 생겨서 찾아보았다. 브랜치는 단지 한 커밋에 대한 포인터라고 생각하면 모든 것이 깔끔하게 정리된다.

git checkout <hash>          # non named commit
git checkout <branch_name>   # named commit

위의 두 줄 모두 HEAD 포인터를 커밋을 가르키는 브랜치를 가르키게 한다.

TBD: -ADD IMAGE-

Merging branches

두 개의 브랜치의 내용을 합치는 것이 git merge이다. (주로 master로 병합을 하지만, 항상 그렇지는 않음)

new_branch에 있는 상태로 hello.txt에 새로운 글을 추가해주자.

echo Course Coordinator: Dr. Cooper >> hello.txt
git add hello.txt
git commit -m "Updated hello.txt"

이제 .git/objects 디렉토리에 9개의 object가 있을 것이다. 현재의 new_branch를 master 브랜치로 머지해보자.

git checkout master
git merge new_branch

TIP: git merge <branch>를 할때, 어디서 어떤 브랜치로 머지하는지가 중요하다. 따라서 내가 기억하는 방법은 “git merge branch into current_branch” 이렇게 생각하여 git merge 다음에 오는 브랜치가 현재 브랜치로 머지된다는 점을 기억한다.

이제 다음과 같은 아웃풋이 나온다.

Updating f76db3c..34d226c
Fast-forward
    hello.txt | 1 +
1 file changed, 1 insertion(+)

TBD: 추가로 merge의 내부 알고리즘을 연구해보는 것도 흥미로울 것 같다.

출처

https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell

Categories:

Updated:

Leave a comment