[Git] Git branch & merge

한결·2023년 4월 14일
0

Github

목록 보기
11/14

git branch

  • 브랜치는 나뭇가지라는 뜻으로, 여러 갈래로 작업공간을 나누어 독립적으로 작업할 수 있도록 도와주는 Git의 도구

장점
1. 브랜치는 독립 공간을 형성하기 때문에 원본(master)에 대해 안전함
2. 하나의 작업은 하나의 브랜치로 나누어 진행되므로 체계적인 개발이 가능함
3. Git은 브랜치를 만드는 속도가 굉장히 빠르고, 적은 용량을 소모함

git branch

  • 브랜치의 조회, 생성, 삭제와 관련된 Git 명령어
  • 조회
    • git branch # 로컬 저장소의 브랜치 목록 확인
    • git branch -r # 원격 저장소의 브랜치 목록 확인
  • 생성
    • git branch {브랜치 이름} # 새로운 브랜치 생성
    • git branch {브랜치 이름} {커밋 ID} # 득정 커밋 기준으로 브랜치 생성
  • 삭제
    • git branch -d {브랜치 이름} # 병합된 브랜치만 삭제 가능
    • git branch -D {브랜치 이름} # 강제 삭제

git switch

  • 현재 브랜치에서 다른 브랜치로 이동하는 명령어
  • git switch {브랜치 이름} # 다른 브랜치로 이동
  • git switch -c {브랜치 이름} # 브랜치를 새로 생성 및 이동
  • git switch -c {브랜치 이름} {커밋 ID} # 특정 커밋 기준으로 브랜치 생성 및 이동
  • switch하기 전에, 해당 브랜치의 변경 사항을 반드시 커밋 해야함을 주의할 것!!
    • 다른 브랜치에서 파일을 만들고 커밋 하지 않은 상태에서 switch를 하면 브랜치를 이동했음에도 불구하고 해당 파일이 그대로 남아있게 됨

[참고] HEAD

  • "This is a pointer to the local branch tou're currently in."
  • 그냥 커밋을 바라보는 포인터임
    그 외에 다른 기능은 하지 않음
  • HEAD는 형재 브랜치를 가리키고, 각 브랜치는 자신의 최신 커밋을 가리키므로 결국 HEAD가 현재 브랜치의 최신 커밋을 가리킨다고 할 수 있음
  • git log혹은 cat.git/HEAD를 통해서 현재 HEAD가 어떤 브랜치를 가리키는지 알 수 있음

  • 결국 git switch는 현재 브랜치에서 다른 브랜치로 HEAD를 이동시키는 명령어

[참고] branch와 switch 그림으로 파악하기

  • 현재 HEAD는 master를 가리키고, master의 최신 커밋은 C3인 상태

  • (master) $ git branch hotfix

  • (master) $ git commit -m "C4"

  • (master) $ git switch hotfix

  • (hotfix) $ git commit -m "C5"

  • (hotfix) $ git commit -m "C6"

Git merge

  • 분기된 브랜치들을 하나로 합치는 명령어
  • master 브랜치가 상용이므로, 주로 master 브랜치에 병합
    • 근데 그냥 master가 브랜치(hotfix)가 바라보는 커밋을 바라보도록 하는거임 -> 사실 병합이 아님
  • git merge {합칠 브랜치 이름}
    • 병합하기 전에 브랜치를 합치려고 하는, 즉 메인 브랜치로 switch 해야함
    • 병합에는 세 종류가 존재
      1. Fast-Forward
      2. 3-way Merge
      3. Merge Conflict

Fast-Forward

  • master 브랜치의 변경사항이 없는 경우에 merge 하는 경우
  • 마치 빨리감기처럼 브랜치가 가리키는 커밋을 앞으로 이동시키는 방법

  • (master) $ git merge hotfix

  • (master) & git merge hotfix

3-way Merge

  • 각 브랜치의 커밋 두 개와 공통 조상 하나를 사용하여 병합하는 방법

  • (master) & git merge hotfix

Merge Conflict

  • 두 브랜치에서 같은 부분을 수정한 경우,
    Git이 어느 브랜치의 내용으로 작성해야 하는지 판단하지 못하여
    충돌(conflict)이 발생했을 때 이를 해결하며 병합하는 방법

  • 보통 같은 파일의 같은 부분을 수정했을 때 자주 발생

  • (master) $ git merge hotfix

  • master 브랜치와 hotfix 브랜치에서 같은 파일의 같은 부분을 수정하여 충돌 발생

  • 충돌이 발생한 부분은 작성자가 직접 해결해야함 (i 클릭 후 수정)

  • 충돌 해결 후, 병합된 내용을 기록한 Merge Commit 생성

충돌은 언제 일어나는가

  • 두브랜치에서 서로 다른 파일을 수정 후 병합하는 경우
    -> 자연스럽게 Merge

  • 두브랜치에서 같은 파일의 같은 부분을 수정 후 병합하는 경우
    -> 충돌(Conflict)

0개의 댓글