본문 바로가기
학부 생활 + 랩실/Git, GitHub

Git Tutorial(4) - GitHub와 Branch

by 프롭 2026. 3. 19.

 

Branch?

브랜치는 여러 사람이 협업하는데 있어 필수다. 지금까지 다룬 내용은 모두 main이라는 메인 브랜치에서 작업을 한 것이다. 하지만 여러 사람이 하나의 브랜치에서 동시에 작업을 하게 되면 여러 문제가 생길 것이다. 완성되지 않은 코드를 원격 저장소에 올리고 그걸 다른 작업 중인 사람들이 받게되면 에러가 발생할 수 있는 등 다른 사람이 작업중에 불필요한 영향을 받아 작업 효율이 저화될 수 있다.

 

여기서 이 브랜치를 사용하면 문제 해결이 가능하다. 메인 브랜치의 특정 버전에서 분기(branching)하여 새로운 기능을 넣거나 이슈를 해결하는 등의 작업 단위를 진행하며 자유롭게 commit할 수 있는 독립적인 작업공간이다. 자신의 브랜치를 만들어 작업하고 기능이 어느정도 완성되면 코드 정리와 동작 테스트를 한 후 다른 사람들의 동의를 얻어 자신이 만든 변경 사항을 메인 브랜치에 합칠 수 있다. 그 후 다시 새 브랜치를 만들어 새로운 작업을 한다. 이것이 git을 활용한 협업의 흐름이다.

 

각 개발자는 자신이 단위 기능을 만드는 동안 다른 사람의 영향을 받지 않고 새로운 기능에만 집중할 수 있다. 프로젝트 관리 측면에서는 메인 브랜치를 작업 중인 브랜치와 분리하여 메인 브랜치의 안정성을 보장할 수 있다. 메인 브랜치 업데이트 할 때는 작업이 완료된 상태의 코드를 보고 판단하면 되므로 효율적으로 관리할 수 있다.

 

커밋과 브랜치를 비교해자. 커밋은 작은 단위의 변경사항을 짧은 메시지와 함께 기록한다. 브랜치는 새로운 기능이나 특정 이슈 해결이라는 토픽을 잡고 브랜치 내부에서 여러 커밋을 쌓아서 그 기능을 완성한다. 토픽 브랜치를 메인 브랜치에 합친다는 것은 토픽 브랜치의 커밋을 메인 브랜치에 추가한다는 말이다. 그래서 커밋은 작은 단위의 변경 사항이고 브랜치는 기능, 이슈 단위의 변경 사항이라 볼 수 있다.

 

브랜치 만들어 작업하기

기본적인 명령어로 git branch라는 브랜치 관리 명령어와 git checkout이라는 브랜치 전환 명령어가 있다.

 

  • git branch

협업의 핵심인 브랜치를 관리하는 verb다.

git branch : 로컬 저장소의 브랜치 목록을 보여준다.

git branch -r : 원격 저장소의 브랜치 목록을 보여준다.

git branch <branch_name> : 새로운 브랜치를 만든다.

git branch -m <old_name> <new_name> : 브랜치의 이름을 변경한다.

git branch -d <branch_name> : 브랜치를 삭제한다. HEAD에 병합되지 않은 브랜치를 삭제하려면 (즉 브랜치의 commit을 영구적으로 삭제하려면) -D 옵션을 준다.

 

  • git checkout

Head를 다른 커밋 혹은 브랜치로 옮기고 작업 트리를 그 커밋의 snapshot으로 복원한다. 목적지를 다른 브랜치로 지정하면 그 브랜치의 최신 커밋으로 Head가 옮겨지고 작업 트리가 바뀐다. 그래서 주로 작업할 브랜치를 변경하는데 주로 쓰인다.

git checkout <other_branch> : other_branch로 작업 브랜치를 바꾸고 작업 트리 영역을 other_branch의 최신 commit 상태로 복원한다.

git checkout -b <new_branch> : 현재 상태에서 새로운 브랜치를 생성하고 그곳으로 브랜치를 옮긴다. HEAD의 commit이 변하지 않고 단지 브랜치만 바뀐다. 그래서 작업 트리도 변하지 않는다.

git checkout HEAD -- <filename> : 파일의 상태를 HEAD (최신 commit)으로 복원하는 명령어다. 잘못된 변경 사항이 있을 때 주로 쓴다.

 

  • 브랜치에서 작업하기

브랜치를 만들어 간단한 연산 함수를 구현하여 이를 메인 브랜치에 합치는 작업을 해보겠다.

먼저 make-list-operatores라는 브랜치를 만들어 전환하자.

# 브랜치 만들고 만든 브랜치로 전
~/workspace/desktop$ git checkout -b make-list-operators
 

 

이전에 만든 add.py에 기능을 추가히기 전 이름을 list_ops.py로 수정한다.

~/workspace/desktop$ cd git_practice
~/workspace/desktop/git_practice$ git mv add.py list_ops.py
~/workspace/desktop/git_practice$ gedit list_ops.py
 

더하기 빼기 기능을 구현한다.

# list_ops.py
def add(foo, bar):
    out = []
    for f, b in zip(foo, bar):
        out.append(f + b)
    return out

def subtract(foo, bar):
    out = []
    for f, b in zip(foo, bar):
        out.append(f - b)
    return out
 

변경 사항을 커밋한다.

~/workspace/desktop/git_practice$ git add .
~/workspace/desktop/git_practice$ git commit -m 'implement add and subtract'
 

추가로 곱하기 나누기 기능도 구형하자.

# 아래쪽에 추가
def multiply(foo, bar):
    out = []
    for f, b in zip(foo, bar):
        out.append(f * b)
    return out

def divide(foo, bar):
    out = []
    for f, b in zip(foo, bar):
        out.append(f / b)
    return out
 

다시 변경 사항을 커밋한다.

~/workspace/desktop/git_practice$ git add .
~/workspace/desktop/git_practice$ git commit -m 'implement multiply and substract'
 

main.py도 새로운 함수를 사용하도록 수정하자.

# main.py
import list_ops as lo

if __name__ == "__main__":
    foo = [1,2,3]
    bar = [4,5,6]
    print("foo+bar=", lo.add(foo, bar))
    print("foo-bar=", lo.subtract(foo, bar))
    print("foo*bar=", lo.multiply(foo, bar))
    print("foo/bar=", lo.divide(foo, bar))
 

이제 변경 사항을 커밋하고 로그를 확인해보자

~/workspace/desktop/git_practice$ git add .
~/workspace/desktop/git_practice$ git commit -m 'change main to use list ops'
~/workspace/desktop/git_practice$ git log
commit e97a572fda2c132a7f4c09eb3828daa9272e2 (HEAD -> main, make-list-operators)
Author: <your_id> <your_email>
Date:   Wed Mar 18 12:46:32 2026 +0900
    change main to use list ops

commit fa8a82f31c9526f61c8a34666sdf1zb2cffc7bdd6
Author: <your_id> <your_email>
Date:   Wed Mar 18 12:46:01 2026  +0900
    implement multiply and substract

commit 55f779972a6dea3f9328cff0a37575ee94065f24
Author: <your_id> <gyour_email>
Date:   Wed Mar 18 12:45:22 2026 +0900
    implement add and subtract

commit 2cbd36f543fcd6cf879146dbc9b877ca0536d8 (origin/main, origin/HEAD)
Author: <your_id> <your_email>
Date:   Wed Mar 18 12:44:30 2026 +0900
    move files to git practice
 

 

  • git merge

git merge <other_branch> : 현재 branch에서 other_branch의 commit들을 병합한다.

git merge [--ff / --no-ff / --ff-only] <other_branch> : 병합하는 방식을 지정한다. 기본은 –ff (fast-forward), only-ff는 fast-forward 방식이 가능할 때만 merge를 하라는 것

git merge --squash <other_branch> : other_branch의 모든 commit들을 하나의 commit으로 합쳐서 병합.

 

git merge는 두 개의 브랜치를 합칠 때 쓴다. 메인 브랜치로 전환 후 토픽 브랜치인 make-list-operators 브랜치를 병합한다. 병합 전에 git pull을 실행하여 다른 사람이 올린 변경 사항을 모두 병합 후 내가 만든 토픽 브랜치를 합쳐야 코드를 최신 상태로 업데이트 할 수 있다.

~/workspace/desktop/git_practice$ cd ..
~/workspace/desktop$ git checkout main
~/workspace/desktop$ git pull
~/workspace/desktop$ git merge make-list-operators
~/workspace/desktop$ git status
~/workspace/desktop$ git push origin main
 

이때 두 브랜치가 서로 같은 줄을 다르게 수정했다면 CONFLICT가 발생할 수 있다. git pull도 알고 보면 원격 저장소의 내용을 내려받는 git fetch와 브랜치를 흡수하는 git merge 두 명령어를 한번에 실행하는 것이기 때문이다.

 

병합을 하면 두 main 브랜치에도 변경사항이 반영됐음을 볼 수 있따.

 

다른 사람들과 협업하는 프로젝트에서 이렇게 새로운 브랜치를 만들어 독립적으로 작업하고 단위 작업이 마무리가 됐을 때 메인 브랜치에 합치는 일이 동시다발적으로 일어난다.

 

Pull Request 만들기

위에서 직접 merge를 통해 브랜치를 병합했지만 사실 여러 사람들이 협업할때 이렇게 하지는 않는다. 브랜치를 만드는 이유는 기능을 변겨/추가하거나 어떠한 문제를 해결하기 위함이다. 이러한 목적을 메인 브랜치에 합칠 때 무엇을 어떻게 구현했는지 다른 사람의 동의를 얻어야 메인 브랜치에 합칠 수 있다. 이때 단순 커밋 메시지와 코드만 보고는 브랜치의 기능을 쉽게 파악할 수 없기에 간단한 설명문이 필요하다.

 

그래서 팀으로 일하는 개발자들을 자신이 임의로 합치지 않고 Pull Request(PR)라는 문서를 작성하여 사람들에게 공유하고 동의를 구한다. git에서 pull이란 다른 저장소의 변경 사항을 내 저장소에 반영한다는 의미가 있으므로 Pull Request란 내가 만든 브랜치의 변경사항을 원격의 메인 브랜치에 반영할 수 있도록 '요청'한다는 의미다.

 

이는 간단히 깃헙 게시판에 내가 이러한 작업을 했다고 설명문을 쓴느 것인데. 깃헙에서는 관리 권한을 가진 사람이 깃헙 원격 저장소에서 병합할 수 있는 기능도 제공한다. 그래서 커맨드에서 git merge를 사용할 일이 별로 없다.

 

PR을 작성하면 자연스럽게 과정이 기록된다. 누가 무엇을 어떻게 했는지 커밋보다 더 쉽게 알수 있다. PR 작성을 통해 회사등에서 보고서를 작성할때도 도움이 된다고 한다. 간단한 실습을 해보자

 

  • 새 브랜치 작업하기

앞서 만들었던 desktop에서 이어서 하겠다. 연산 함수를 담은 파일을 만들었으니 딕셔너리 연산자를 추가해보자.

$ cd ~/workspace/desktop
~/workspace/desktop$ git status
# 이렇게 나오는 상태여야 한다.
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

~/workspace/desktop$ git checkout -b make-dict-operators
~/workspace/desktop$ git branch
* make-dict-operators
  make-list-operators
  main
~/workspace/desktop$ gedit git_practice/dict_ops.py
 

dict_ops.py를 다음과 같이 작성하자,

# dict_ops.py
def add(foo, bar):
    out = {}
    for key in foo.keys():
        if key in bar:
            out[key] = foo[key] + bar[key]
    return out

def subtract(foo, bar):
    out = {}
    for key in foo.keys():
        if key in bar:
            out[key] = foo[key] - bar[key]
    return out

def multiply(foo, bar):
    out = {}
    for key in foo.keys():
        if key in bar:
            out[key] = foo[key] * bar[key]
    return out

def divide(foo, bar):
    out = {}
    for key in foo.keys():
        if key in bar:
            out[key] = foo[key] / bar[key]
    return out
 

변경 사항을 커밋한다.

~/workspace/desktop$ git add .
~/workspace/desktop$ git commit -m 'create dictionary operator module'
 

main.py도 다음과 같이 수정하자

# main.py
import list_ops as lo
import dict_ops as do

if __name__ == "__main__":
    foo = [1,2,3]
    bar = [4,5,6]
    print(f"foo: {foo}, bar: {bar}")
    print("foo+bar=", lo.add(foo, bar))
    print("foo-bar=", lo.subtract(foo, bar))
    print("foo*bar=", lo.multiply(foo, bar))
    print("foo/bar=", lo.divide(foo, bar))
    
    foo = {"Java": 79, "Cpp": 45, "Python": 99}
    bar = {"Java": 36, "Python": 56, "Ruby": 63}
    print(f"foo: {foo}, bar: {bar}")
    print("foo+bar=", do.add(foo, bar))
    print("foo-bar=", do.subtract(foo, bar))
    print("foo*bar=", do.multiply(foo, bar))
    print("foo/bar=", do.divide(foo, bar))
 

변경 사항을 커밋한다.

~/workspace/dsektop$ git add .
~/workspace/dsektop$ git commit -m 'make main.py to use dict_ops.py'
 
  • 깃헙에서 PR 작성하기

이제 작업한 브랜치를 원격 저장소로 올리자. 바로 main에 합치지 않고 원격 저장소에서 브랜치를 PR과 함께 올려 정리한 후 다른 사람의 평을 받을 수 있게 한다.

 

원격 저장소로 브랜치를 올리려면 git push origin <branch_name> 명령어를 쓴다. origin은 git clone 할 때 자동 지정된 원격 저장소의 이름이고 git remote -v 명령어를 통해 origin의 실제 주소를 볼 수 있다.

~/workspace/desktop$ git remote -v
origin	https://github.com/your_id/desktop.git (fetch)
origin	https://github.com/yout_id/desktop.git (push)

~/workspace/desktop$ git push origin make-dict-operators
...
To https://github.com/your_id/desktop.git
 * [new branch]      make-dict-operators -> make-dict-operators
 

이제 깃헙에 들어가보면 make-dict-operators 브랜치를 위한 Compare & pull request라는 메뉴가 있다.

클릭해 들어가면 다음과 같이 설명문을 작성할 수 있는데 이를 통해 다른 사람들에게 요청할 사항 등을 남긴다.

후에 Create pull request를 누르면 PR이 완성된다. 다른 사람들은 여기서 PR을 읽고 커밋을 확인하며 코드 변경 사항을 확인 요청 댓글을 남기거나 관리 권한을 가진 사람이 Merge pull request를 눌러 main 브랜치에 합칠 수 있다. merger를 하고 나면 다음과 같이 화면이 바뀌고 main 브랜치의 코드도 변했음을 확인 할 수 있다.

로커 저장소의 main 브랜치도 업데이트 하고 싶다면 main 브랜치에서 git pull을 해주면 된다.

 

이상으로 git과 github에 대한 것과 간단한 사용법 정리를 마치겠다.