[Git] 브렌치(Branch)란 무엇인가? / Merge 과 Conflict

msung99·2022년 2월 27일
2
post-thumbnail

현재 포스트는 예쁜 블로그 테마 Haon Blog 로 이전되었습니다. 지금보다 훨씬 예쁜 뷰에서 가독성 있는 글을 읽을 수 있습니다 🙂

Git 과 GitHub 를 입문하는 많은 분들이 브렌치에 많이 들어보셨을 것이라고 생각합니다. 그 만큼 브렌치(branch) 라는 개념은 정말 중요하며, 개인 프로젝트라면 상관없을 수 있으나 협업 프로젝트 만큼은 브렌치를 사용하지 않을 수가 없습니다.


브렌치(Branch) 란?

브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념입니다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있습니다.

또한 이렇게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있습니다

브랜치(Branch)를 통해 하나의 프로젝트를 여러 갈래로 나누어서 관리할 수 있습니다. 각각의 독립된 Branch에서 마음대로 소스코드를 변경하여 작업 한 후 원래 버전과 비교하여 또 하나의 새로운 버전을 만들어 낼 수 있게 됩니다.

위와 같이 작업을 진행하는 메인 브렌치가 Master 브렌치라고 가정해봅시다. 그러면 개발자 A 와 B 는 동일한 Master 브렌치에서 작업하는 것이 아닙니다. 각자 Master 브렌치에서 현재까지 작업한 내용(히스토리) 를 로컬로 가져와서, 브렌치 A와 B에서 작업을 진행하는 방식입니다.

각자의 브렌치에서 작업한 내용은 나중에 Merge 라는 병합과정을 통해서 메인 브렌치인 Master 브렌치에 병합됩니다.


Merge(브렌치 병합하기)

그렇다면 각 개발자들이 각자의 브렌치에서 작업한 내용은 어떻게 합쳐질까요? 이는 바로 Merge 라는 과정을 통해 합쳐질 수 있게 됩니다.

예를들어 위와 같이 브렌치 A(보라색) 와 B에서(초록색)에서 버전을 생성하면서 작업한 내용들은 Master 브렌치에 PR(Pull Request) 와 Merge 과정을 통해서 병합될 수 있게 됩니다.

여기서 Master 브렌치란 브렌치중에서 으뜸이 되는 브렌치입니다. 즉, 해당 레포지토리에 대해 모든 개발자들이 공유하는 메인 브렌치를 의미합니다. 또한 해당 프로젝트에 대해서 결과물이라 할 수 있는 코드들이 올라라가는 브렌치라고 보시면 됩니다. 이 브렌치는 꼭 기억해두시는게 좋습니다.


브렌치의 충돌(Conflict) 발생

충돌이 발생하는 경우 : Git 을 이용하여 협업을 할 때, 브랜치는 여러개인 경우인데 여러명이 동시에 같은 브랜치의 같은 내용을 접근하고 수정했을때 충돌이 발생합니다.

각 개발자가 브렌치를 분할했다면 각자 맡은 파일 또는 파트를 작업하는 것이 원칙이나, 간혹 동일한 파일을 건드린다면 이는 곧 "충돌(Conflict)" 로 이어지는 경우가 자주 발생합니다.

따라서 브렌치를 생성했다면 각자 맡은 파일과 영역에 대해서만 작업을 진행해야하며, master 또는 main 브렌치에 push 로컬에서 작업한 내용을 직접 push 하는 일을 지양하도록 합시다!

예시

예로 아래처럼 master 브렌치에서 작업한 커밋들이 존재한다고 해봅시다.
이떄 sub 라는 새로운 브렌치를 생성하고 커밋을 생성하는 경우를 가정해봅시다.


Branch 관리를 위한 명령

cf) HEAD : 여러 브랜치 중에서 현재 작업중인 브랜치가 무엇인지 알려주는 포인터

1 브렌치 생성 및 조회

git branch : 모든 브랜치 조회
git branch 브랜치명 : 새로운 브랜치 생성


2. 브렌치 전환하기

git checkout 브렌치명
git switch 브렌치명

checkout 키워드가 활용되는 명령어들이 너무 많아져서, switch 라는 키워드의 명령어를 새롭게 만들어졌다고 합니다.


3. 새로운 브랜치 생성후, 해당 브랜치로 바로 이동하기

git checkout -b 새로운 브랜치명
git switch -c 새로운 브랜치명

새로운 브렌치를 생성하면서 이동하는 명령입니다. 즉, 위 명령어들은 아래 명령어를 한 줄로 줄인것입니다.

git checkout my_branch
git checkout my_branch

4. 브렌치 히스토리 조회 (git log 관련)

git log --oneline
git log --oneline --branches
git log --oneline --branches --graph

  • git log --oneline : git log 를 한줄로 간략히 조회

  • git log --oneline --branches : 모든 브랜치의 커밋 상황을 확인

  • git log --oneline --branches --graph : 모든 브랜치의 커밋 상황을 시각적으로 표현
    (각 브랜치들의 커밋 생성순서 및 관계를 그래프 형태로 확인 가능합니다.)


4. 두 브렌치간의 Commit 차이 조회

git log 브렌치1..브렌치2

  • git log master ..safecal : 브렌치 사이의 차이점을 확인합니다. 여기서는 master 와 safecal 브랜치의 차이를 확인합니다.

    • git log 브렌치1..브렌치2 : 브렌치1에는 없고 브렌치2에만 있는 커밋의 log 를 띄어줍니다.

    • git log 브렌치2..브렌치1 : 브렌치2에는 없고 브렌치1에만 있는 커밋의 log 를 띄어줍니다.


5. 원격 레포지토리에서 브랜치 삭제하기

git push < remote >--delete < branch >

예를 들어서 삭제하고 싶은 원격 브랜치 이름이 fix/authentication 이라면

git push origin --delete fix/authentication

와 같이 명령을 입력하시면 됩니다. 그러면 이제 이 브랜치는 원격에서 삭제됩니다.
참고로 더 짧은 버전의 명령어도 있습니다.

git push < remote > :< branch >

이렇게 쓰면 됩니다.

profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글