반응형
Branch
Branch란 분기된 가지 즉, 여러 차원을 의미한다.
프로젝트에서 하나 이상의 모습으로 관리할 때 (배포용, 테스트용 등)
여러 작업들이 독립되어 진행될 때 (신기능, 코드 개선, 긴급 수정 등)
다음과 같은 작업들을 하나의 프로젝트 폴더에서 진행하여 메인 브랜치에서 통합하는 방식을 사용할 수 있다.
Branch 생성 / 이동 / 삭제
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의 members
에 Olivia
추가
- 커밋 메시지:
Add Olivia to Leopards
Panthers의 members
에 Freddie
추가
- 커밋 메시지:
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
)
결과 살펴보기
git log --all --decorate --oneline --graph
git log
는 해당 브랜치에서의 내역만 볼 수 있지만, 해당 명령어는 여러 브랜치의 정보를 모두 볼 수 있다.
- SourceTree를 보면 다음과 같이 브랜치 별 작업 기록을 쉽게 볼 수 있다.
Branch 합치기 (merge vs rebase)
merge : 두 브랜치를 한 커밋에 이어 붙이는 방식
- 브랜치 사용내역을 남길 필요가 있을 때 적합한 방식
rebase : 브랜치를 다른 브랜치에 이어 붙이는 방식
- 한 줄로 깔끔히 정리된 내역을 유지하기 원할 때 적합한 방식
- 협업 시 팀원들과 공유된 커밋들에 대해서는 rebase를 사용하지 않는 것이 좋다.
merge로 합치기
git merge add-coach
- main 브랜치에서 해당 명령어로
add-coach
브랜치를 병합 (커밋 메시지에서:wq
로 자동입력된 커밋 메시지를 저장)
git branch -d add-coach
- 병합 된 브랜치를 삭제
rebase로 합치기
git rebase main
new-teams
브랜치로 이동 후 (merge 와는 반대) 명령어로 병합한다. main 브랜치가 뒤쳐져 있는 것을 확인할 수 있다.
git merge new-teams
- main 브랜치로 이동 후 명령어로 뒤쳐진 부분을 맞춰주고
new-teams
브랜치를 삭제하자.
Branch 간 충돌 상황
충돌 상황 만들기
conflict-1
,conflict-2
브랜치 생성- main 브랜치
- Tigers의
manager
를Kenneth
로 변경 - Leopards의
coach
를Nicholas
로 변경 - Panthers의
coach
를Shirley
로 변경 - 커밋 메시지:
Edit Tigers, Leopards, Panthers
- Tigers의
conflict-1
브랜치- Tigers의
manager
를Deborah
로 변경 - 커밋 메시지:
Edit Tigers
- Tigers의
conflict-2
브랜치 1차- Leopards의
coach
를Melissa
로 변경 - 커밋 메시지:
Edit Leopards
- Leopards의
conflict-2
브랜치 2차- Panthers의
coach
를Raymond
로 변경 - 커밋 메시지:
Edit Panthers
- Panthers의
merge 충돌 해결하기
main
브랜치에서conflict-1
브랜치를 merge 하면 Tigers 파일의 manager의 내용이 서로 다르기 때문에 충돌이 발생한다.
- 충돌이 발생한 파일을 보면 다음과 같이 충돌이 발생한 부분을 확인할 수 있다.
- 당장 충돌 해결이 어려울 경우
git merge --abort
를 사용하여 merge를 중단할 수 있다. - 해결이 가능한 경우 충돌 부분을 수정하고
git add .
,git commit
으로 병합- Accept Current Change : 현재 Head 기준으로 선택
- Accept Incoming Change : merge 하려고 선택한 브랜치 기준으로 선택
- Accept Both Changes : 두 브랜치 모두 선택
- Incoming Change 를 채택하고
git add .
,git commit
을 통해 병합하면 다음과 같이 버전 관리가 진행 된 것을 볼 수 있다.
rebase 충돌 해결하기
conflict-2
브랜치에서git rebase main
을 사용하면Leopards
폴더의 내용이 다르기 때문에 충돌이 발생한다. rebase는 merge와는 다르게 각 커밋마다 발생하는 충돌을 해결해야 한다.
- 충돌 난 부분을 Incoming Change를 채택하고
git add .
을 입력하고git rebase --continue
를 입력한다. 그 이유는 이후 파일에서 충돌난 부분을 해결하기 위함이다. - 다음과 같이 병합 후에도 새로운 충돌이 발생한 것을 볼 수 있다.
panthers
파일에서 발생한 충돌을Accept Current Change
로 채택하고 다음과 같이 명령어를 사용하면 rebase 성공 메시지를 확인할 수 있다.
- 다음과 같이 main이 뒤쳐져 있으므로 main 브랜치로 이동 후
git merge conflict-2
를 사용하여 병합을 하자.
- 정상적으로 main에 병합된 것을 볼 수 있다.
SourceTree로 실습하기
충돌 상황 만들기
to-merge
,to-rebase
브랜치 생성- 상단의
브랜치
버튼 클릭 - 왼쪽의 브랜치 탭에서 클릭하여 이동
- 상단의
main
브랜치- Tigers의
manager
를Brenda
로 변경 - 커밋 메시지:
Edit Tigers manager
- Tigers의
to-merge
브랜치- Tigers의
coach
를Ruth
로 변경 - 커밋 메시지:
Edit Tigers coach
- Tigers의
to-rebase
브랜치- Tigers의
memebers
에Tyler
추가 - 커밋 메시지:
Edit Tigers members
- Tigers의
- 다음과 같이 브랜치 별 작업이 생성된 것을 확인할 수 있다.
- main에 위치한 뒤
to-merge
브랜치를 병합
- 다음과 같이 병합된 것을 확인할 수 있다.
- rebase 를 사용하기 위해 merge와 반대로
to-rebase
브랜치에서main
브랜치를 우클릭하여 재배치를 선택
- 다음과 같이 브랜치가 생성되며, main은 뒤쳐져있기 때문에 다시 main에서
to-rebase
브랜치를 merge 하자.
- 다음과 같이 정상적으로 main브랜치에 반영된 결과를 볼 수 있다.
to-rebase
와to-merge
브랜치는 사용하지 않기 때문에 삭제하자.
merge 충돌 해결해보기
conflict
브랜치 생성
main
브랜치- Tigers의
members
에Kim
추가 - 커밋 메시지:
Edit Kim to Tigers
- Tigers의
conflict
브랜치- Tigers의
members
에Park
추가 - 커밋 메시지:
Edit Park to Tigers
- Tigers의
merge
하여 충돌 해결해보기
conflict
브랜치 삭제
본 포스팅은 '인프런 - 제대로 파는 Git & GitHub - by 얄코' 강의를 보고 정리한 내용입니다.
반응형