제육's 휘발성 코딩
반응형

Branch

image

Branch란 분기된 가지 즉, 여러 차원을 의미한다.

프로젝트에서 하나 이상의 모습으로 관리할 때 (배포용, 테스트용 등)

여러 작업들이 독립되어 진행될 때 (신기능, 코드 개선, 긴급 수정 등)

다음과 같은 작업들을 하나의 프로젝트 폴더에서 진행하여 메인 브랜치에서 통합하는 방식을 사용할 수 있다.

Branch 생성 / 이동 / 삭제

image

git branch add-couch
  • git 브랜치 생성
git branch
  • 브랜치 목록 확인
git switch add-couch    
  • 브랜치 이동 (checkout 명령어가 Git 2.23 버전부터 switch, restore로 분리)
git switch -c new-teams
  • 브랜치를 생성과 동시에 이동 (-c 명령어 사용)
git branch -d 브랜치명
  • 브랜치 삭제 명령어 (단, 커밋 내용이 있을 경우 -d 대신 -D를 사용하여 강제로 삭제해야 한다.)
git branch -m (기존 브랜치명) (새 브랜치명)
  • 브랜치 이름을 바꿀 때는 -m 명령어와 브랜치 명을 작성한다.

Branch 별 작업 실습

main 브랜치

Leopards의 membersOlivia 추가

  • 커밋 메시지: Add Olivia to Leopards

Panthers의 membersFreddie 추가

  • 커밋 메시지: Add Freddie to Panthers

add-coach 브랜치

Tigers의 매니저 정보 아래 coach: Grace 추가

  • 커밋 메시지: Add Coach Grace to Tigers

Leopards의 매니저 정보 아래 coach: Oscar 추가

  • 커밋 메시지: Add Coach Oscar to Leopards

Panthers의 매니저 정보 아래 coach: Teddy 추가

  • 커밋 메시지: Add Coach Teddy to Panthers

new-teams 브랜치

team: Pumas

manager: Jude

members:
- Ezra
- Carter
- Finn
  • pumas.yaml 추가 (커밋 메시지 : Add team Pumas)
team: Jaguars

manager: Stanley

members:
- Caleb
- Harvey
- Myles
  • jaguars.yaml 추가 (커밋 메시지 : Add team Jaguars)

결과 살펴보기

image

git log --all --decorate --oneline --graph
  • git log는 해당 브랜치에서의 내역만 볼 수 있지만, 해당 명령어는 여러 브랜치의 정보를 모두 볼 수 있다.

image

  • SourceTree를 보면 다음과 같이 브랜치 별 작업 기록을 쉽게 볼 수 있다.

Branch 합치기 (merge vs rebase)

merge : 두 브랜치를 한 커밋에 이어 붙이는 방식

  • 브랜치 사용내역을 남길 필요가 있을 때 적합한 방식

rebase : 브랜치를 다른 브랜치에 이어 붙이는 방식

  • 한 줄로 깔끔히 정리된 내역을 유지하기 원할 때 적합한 방식
  • 협업 시 팀원들과 공유된 커밋들에 대해서는 rebase를 사용하지 않는 것이 좋다.

merge로 합치기

image

git merge add-coach
  • main 브랜치에서 해당 명령어로 add-coach 브랜치를 병합 (커밋 메시지에서 :wq로 자동입력된 커밋 메시지를 저장)
git branch -d add-coach
  • 병합 된 브랜치를 삭제

rebase로 합치기

image

git rebase main
  • new-teams 브랜치로 이동 후 (merge 와는 반대) 명령어로 병합한다. main 브랜치가 뒤쳐져 있는 것을 확인할 수 있다.

image

git merge new-teams
  • main 브랜치로 이동 후 명령어로 뒤쳐진 부분을 맞춰주고 new-teams 브랜치를 삭제하자.

Branch 간 충돌 상황

충돌 상황 만들기

image

  • conflict-1, conflict-2 브랜치 생성
  • main 브랜치
    • Tigers의 managerKenneth로 변경
    • Leopards의 coachNicholas로 변경
    • Panthers의 coachShirley로 변경
    • 커밋 메시지: Edit Tigers, Leopards, Panthers
  • conflict-1 브랜치
    • Tigers의 managerDeborah로 변경
    • 커밋 메시지: Edit Tigers
  • conflict-2 브랜치 1차
    • Leopards의 coachMelissa로 변경
    • 커밋 메시지: Edit Leopards
  • conflict-2 브랜치 2차
    • Panthers의 coachRaymond로 변경
    • 커밋 메시지: Edit Panthers

merge 충돌 해결하기

image

  • main 브랜치에서 conflict-1 브랜치를 merge 하면 Tigers 파일의 manager의 내용이 서로 다르기 때문에 충돌이 발생한다.

image

  • 충돌이 발생한 파일을 보면 다음과 같이 충돌이 발생한 부분을 확인할 수 있다.
  • 당장 충돌 해결이 어려울 경우 git merge --abort를 사용하여 merge를 중단할 수 있다.
  • 해결이 가능한 경우 충돌 부분을 수정하고 git add ., git commit 으로 병합
    • Accept Current Change : 현재 Head 기준으로 선택
    • Accept Incoming Change : merge 하려고 선택한 브랜치 기준으로 선택
    • Accept Both Changes : 두 브랜치 모두 선택

image

  • Incoming Change 를 채택하고 git add ., git commit 을 통해 병합하면 다음과 같이 버전 관리가 진행 된 것을 볼 수 있다.

rebase 충돌 해결하기

image

  • conflict-2 브랜치에서 git rebase main 을 사용하면 Leopards 폴더의 내용이 다르기 때문에 충돌이 발생한다. rebase는 merge와는 다르게 각 커밋마다 발생하는 충돌을 해결해야 한다.

image

  • 충돌 난 부분을 Incoming Change를 채택하고 git add .을 입력하고 git rebase --continue를 입력한다. 그 이유는 이후 파일에서 충돌난 부분을 해결하기 위함이다.
  • 다음과 같이 병합 후에도 새로운 충돌이 발생한 것을 볼 수 있다.

image

  • panthers 파일에서 발생한 충돌을 Accept Current Change로 채택하고 다음과 같이 명령어를 사용하면 rebase 성공 메시지를 확인할 수 있다.

image

  • 다음과 같이 main이 뒤쳐져 있으므로 main 브랜치로 이동 후 git merge conflict-2를 사용하여 병합을 하자.

image

  • 정상적으로 main에 병합된 것을 볼 수 있다.

SourceTree로 실습하기

충돌 상황 만들기

image

  • to-merge, to-rebase 브랜치 생성
    • 상단의 브랜치 버튼 클릭
    • 왼쪽의 브랜치 탭에서 클릭하여 이동

image

  • main 브랜치
    • Tigers의 managerBrenda로 변경
    • 커밋 메시지: Edit Tigers manager
  • to-merge 브랜치
    • Tigers의 coachRuth로 변경
    • 커밋 메시지: Edit Tigers coach
  • to-rebase 브랜치
    • Tigers의 memebersTyler 추가
    • 커밋 메시지: Edit Tigers members

image

  • 다음과 같이 브랜치 별 작업이 생성된 것을 확인할 수 있다.

image

  • main에 위치한 뒤 to-merge 브랜치를 병합

image

  • 다음과 같이 병합된 것을 확인할 수 있다.

image

  • rebase 를 사용하기 위해 merge와 반대로 to-rebase 브랜치에서 main 브랜치를 우클릭하여 재배치를 선택

image

  • 다음과 같이 브랜치가 생성되며, main은 뒤쳐져있기 때문에 다시 main에서 to-rebase 브랜치를 merge 하자.

image

  • 다음과 같이 정상적으로 main브랜치에 반영된 결과를 볼 수 있다. to-rebaseto-merge 브랜치는 사용하지 않기 때문에 삭제하자.

merge 충돌 해결해보기

image

  • conflict 브랜치 생성
  • main 브랜치
    • Tigers의 membersKim 추가
    • 커밋 메시지: Edit Kim to Tigers
  • conflict 브랜치
    • Tigers의 membersPark 추가
    • 커밋 메시지: Edit Park to Tigers

image

  • merge하여 충돌 해결해보기

image

  • conflict 브랜치 삭제

본 포스팅은 '인프런 - 제대로 파는 Git & GitHub - by 얄코' 강의를 보고 정리한 내용입니다.

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^