thumbnail
Git 시작하기(6)
Git / Github
2022.02.04.

Git은 데이터를 Change Set이나 Diff로 기록하지 않고 스냅샷인 Commit으로 기록한다고 말하였다. Branch는 특정 한 Commit을 가리키는 40글자의 SHA-1 체크섬 파일에 불과하여 쉽게 생성하고 삭제할 수 있다. 이러한 Branch 개념은 공동작업에 대하여 협력할 때 요긴하게 사용될 수 있다.

Branch 만들기

1. 생성

Branch를 생성하면 HEAD가 가리키는 Branch와 동일한 Commit을 가리키는 Branch가 생성되게 된다.

git branch <branch-name>

2. 이동

HEAD가 가리키는 Branch를 변경한다. 기존에는 checkout을 통해서 변경하였으나, checkout의 기능이 많아지면서 Git 2.23 버전부터 switch와 restore로 분리되었다.

git switch <branch-name>  // git checkout <branch-name>

3. 생성과 동시에 이동

git switch -c <branch-name>  // git checkout -b <branch-name>

4. 삭제와 이름변경

git branch -d <branch-name>  // 강제 삭제 git branch -D
git branch -m <branch-name>  <new-branch-name>

5. 생선된 Branch 확인하기

명령어를 통해 git Branch를 확인할 수 있다. git log --all --decorate --oneline --graph 명령어를 이용하면 commit이 생성된 순에 따라 그래프가 표현되고, Branch, HEAD가 표현되어 있는 것을 확인할 수 있다.

git branch                                    // 단순 텍스트로 리스트가 출력된다.
git log --all --decorate --oneline --graph    // 아래와 같이 시각적으로 그래프가 출력된다.

Imgur


Branch 합치기

여기서 기준이 되는 Branch를 orinial Branch, 합쳐질 Branch를 theOther Branch 라고 하겠다.

1. merge

merge(병합)이라는 말 처럼, 두 Branch를 합치는 명령어다.

git merge <theOther-Branch-Name>
git branch -d <theOther-Branch-Name>
  1. 중심되는 Branch로 이동

  2. 명령어 git merge <theOther-Branch-Name> 입력

    ❗️ 흡수할 Branch에 HEAD를 위치하고 merge 명령어를 실행시켜야 한다

  3. mac의 경우, commit 메시지를 입력하는 vim 에디터가 뜨는데, :wq를 통해서 저장 및 종료한다.

  4. 명령어 git branch -d <theOther-Branch-Name> 입력하여 Branch 삭제

2. rebase

Branch의 각 commit들을 대상 Branch로 이어 붙이는 명령어다.

git rebase <original-Branch-Name>
git merge <theOther-Branch-Name>
git branch -d <theOther-Branch-Name>
  1. 이동시킬 Branch로 이동

  2. 명령어 git rebase <original-Branch-Name> 입력

    ❗️ 흡수당할 Branch에 HEAD를 위치하고 rebase 명령어를 실행시켜야 한다(merge와 반대)

  3. 명령어 git switch <original-Branch-Name> 입력하여 이동

  4. 명령어 git merge <theOther-Branch-Name> 입력하여 합치기

    ❗️ rebase 이후에도 original-Branch는 기존 커밋에 위치하고 있기 때문에 merge를 통해서 rebase로 연결된 commit 최상단으로 이동해야한다.

  5. 명령어 git branch -d <theOther-Branch-Name> 입력하여 Branch 삭제

3. merge vs rebase

  • 브랜치의 사용내역들을 남겨둘 필요가 있다면 merge
  • History를 깔끔하게 남겨둘 필요가 있다면 rebase
  • 이미 팀원들과 공유된 commit에 대해서는 rebase 사용을 자제해야한다.

Branch 충돌 해결하기

같은 내용에 대한 수정이 일어난 Branch를 합치게되면 아래와 같이 충돌이 발생하게 된다. 충돌을 처리하는 방식은 동일하나, merge와 rebase의 특성에 따라 내용이 조금 달라지게 된다.

Imgur

1. merge

  1. 충돌 발생한 파일 수정(IDE에 따라 GUI로 수정을 도와주는 문구도 뜬다)
  2. 명령어 git add . 입력
  3. 명령어 git commit 입력, :wq로 commit 메시지 저장
  4. 명령어 git branch -d <theOther-Branch-Name> theOther Branch 삭제

2. rebase

rebase 커밋들 자체를 하나하나씩 위에 붙여 나가는 방식이기 때문에, 각 커밋 마다 충돌이 있으면 각 각 따로 처리를 해줘야한다.

  1. 충돌 발생한 파일 수정(IDE에 따라 GUI로 수정을 도와주는 문구도 뜬다)
  2. 명령어 git add . 입력
  3. 명령어 git rebase --continue 입력, 충돌이 모두 해결될 때 까지 1~3 반복
  4. 명령어 git switch <Original-Branch-Name>git merge <theOther-Branch-Name>으로 합치기
  5. 명령어 git branch -d <theOther-Branch-Name> theOther Branch 삭제

rebase의 경우, 충돌이 일어나면 웬만하면 cli로 해결하는 것이 좋다.


이번에 merge와 rebase 실습을 하면서 앞서 미리 공부한 HEAD, Branch 개념이 크게 도움이 되었다. head를 특정 커밋으로 detached head 상태로 새로운 Branch를 생성한다던지의 응용도 가능할 것 같다.


참조

Thank You for Visiting My Blog, Have a Good Day 😆
© 2022 Engineer Haesim, Powered By Gatsby.