[문과 코린이의 IT 기록장] Git Branch 다루기 (Branch란?, Branch 생성 / 이동 / 삭제하기, 서로 다른 브랜치를 합치는 두 방식, 브랜치 간 충돌 해결하기, SourceTree로 진행해보기)
[ 참고 영상 ]
1. Branch란?
- 한 프로젝트가 여러 모습으로 관리되어야 할 때 ex. 실배포용 / 테스트 서버용 / 새로운 시도용
- 여러 작업들이 각각 독립되어 진행될 때 (역할을 분담해서 사람들이 프로그래밍을 해갈 때)
ex. 신기능 1. 신기능, 2. 코드개선 및 긴급수정... (각각의 차원에서 작업한 뒤 확정된 것을 메인 차원에 통합)
2. Branch 생성 / 이동 / 삭제하기
1) Brnach 생성
$git branch add-coach
# add-coach란 이름의 브랜치 생성
2) 브랜치 목록 확인
$git branch
3) 해당 브랜치로 이동
$git switch add-coach
4) 브랜치 생성과 동시에 이동하기
$git switch -c 브랜치명
5) 브랜치 삭제하기
$git branch -d 삭제할 브랜치명
* 지워질 브랜치에만 있는 내용의 커밋이 있는 경우(즉, 다른 브랜치로 가져오지 않은 내용이 있는, 브랜치를 지울 때)는 , -d 대신 -D(대문자)로 강제 삭제 해야 한다.
$git branch -D 강제삭제할 브랜치명
6) 브랜치 이름 바꾸기
$git branch -m 기존 브랜치명 새 브랜치명
[ git으로 여러 브랜치의 내역 확인 ]
$git log --all --decorate --oneline --graph
[ 소스트리로 여러 브랜치의 내역 확인 ]
* 각각 main / add-coach / new-teams 브랜치로 이동해 커밋 후 만든 결과 (각각의 내용들이 서로 달라짐)
3. 서로 다른 브랜치를 합치는 두 방식
1) merge
- 두 개의 가지(브랜치)를 한 커밋에 이어붙이는 것이다.
- 이 과정에서 커밋은 새로 생겨나는 것이며, 즉 새로 생기는 커밋에는 원래 브랜치랑 병합될 브랜치의 변화들이 모두 담기게 된다.
- 이는 브랜치 사용내역(history)을 남길 필요가 있을 때 적합한 방식이다.
[ 사용 방법 ]
a. 합쳐져서 사용될 주 대상의 브랜치로 이동
b. 아래의 명령어 입력
$git merge 병합할 브랜치명
[ merge는 reset으로 되돌릴 수 있다. ]
- merge도 하나의 커밋이다. 따라서 reset으로 merge하기 전 브랜치의 마지막 시점으로 이동 가능하다.
- main에서 merge하기 바로 전 상태로 reset을 진행하면 됨.
[ 병합된 브랜치 삭제 방법 ]
$git branch -d 삭제할 브랜치명
2) rebase
- 브랜치의 마디(커밋)들을, 다른 대상 브랜치에 이어붙이는 것이다.
- 이는 한 줄로 깔끔히 정리된 내역을 유지하기 원할 때 적합한 방식이다. 즉 브랜치 사용 내역(history)을 깔끔하게 정리하는 역할을 한다.
- 그러나 이미 팀원과 공유된 커밋들에 대해서는 rebase를 사용하지 않는 것이 좋다.
[ 사용 방법 ]
- 붙여넣을 내용이 들어있는 브랜치로 이동
$git switch 이동할 브랜치명
- main으로 붙여넣기
$git rebase main
- main 브랜치로 이동 후, main을 내용이 들어있는 브랜치가 반영되도록 이동시키기
$git switch main
$git merge 이동된 브랜치명
- 이동된 브랜치 삭제하기
$git branch -d 이동된 브랜치명
4. 브랜치 간 충돌 해결하기
- 서로 다른 브랜치더라도, 서로 다른 부분을 각 브랜치들이 수정하게 되면, merge / rebase시 문제가 발생하지 않는다.
- 그러나, 만약 서로 다른 브랜치에서, 같은 파일의 같은 부분에 대해, 서로 다르게 수정하게 된다면 병합할 때, 둘 중 어떤 것을 선택해야 하는지에 대한 충돌 문제가 생겨나게 될 것이다.
- 그러면 컴퓨터는 프로그래머에게 어떤 것을 선택할지에 대한 창을 띄우게 되며, 프로그래머는 이를 해결해줄 필요가 있다.
1) merge 충돌 해결하기
$git merge 해당 브랜치
# 충돌이 발생하면, 해당 내역 중 어떤 것을 선택해야하는지와 관련해 오류가 뜸
* Accept Current Change : 현재 브랜치 내용 선택
* Accept Incoming Change : 해당 브랜치 내용 선택
* Accept Both Changes : 둘 다 선택
만약 충돌한 부분이 너무 많아, 당장 모두 선택하지 못할 때, 즉 merge를 중단해야 할 경우엔 아래의 명령어를 사용한다.
$git merge --abort
충돌 부분을 해결 뒤, git add . , git commit으로 병합을 완료해야 한다.
$git add .
$git commit
# 이후 나오는 것은 :wq로 저장하면 완료됨
2) rebase 충돌 해결하기
rebase는 하나하나 모든 커밋마다 충돌 과정을 따로 분리해 해결해 줘야 한다. (merge는 한번에 가능)
$git switch 해당 브랜치
# 해당 브랜치로 이동
$git rebase main
$git status
# 오류 충돌 부분을 보여줌. 선택하도록 유도
충돌한 부분이 너무 많아, 당장 모두 선택하지 못할 때, 즉 rebase를 중단해야 할 경우엔 아래의 명령어를 사용한다.
$git rebase --abort
충돌 부분을 해결 뒤, git add . , git commit으로 병합을 완료해야 한다.
$git add .
$git rebase --continue
이후 main을 제대로 병합시켜주기 위해, git switch, git merge를 진행해야 최종적으로 완료된다.
$git switch main
$git merge 해당 브랜치
다 사용된 브랜치는 바로 삭제해줘야 한다.
$git branch -d 해당 브랜치
5. SourceTree로 진행해보기
1) 브랜치 생성
* sourcetree에서 브랜치를 옮겨다닐 때마다, VS Code에서 내용이 해당 브랜치에 맞게 변화하는 것을 확인할 수 있음.
2) merge 진행
* main에서 해당 브랜치를 우클릭해 marge(현재 브랜치로 to-merge 병합) 진행
3) rebase 진행
* 해당 브랜치로 이동 후, main을 우클릭해 rebase(현재 변경사항을 main에 재배치) 진행
* 이후, main으로 이동해, 해당 브랜치를 우클릭해 병합을 눌러주면 rebase 완료
* 완료가 되었다면, 마무리로 오른쪽 클릭해 더 이상 필요 없는 해당 브랜치들 삭제하기
cf) conflict 발생 시, sourcetree로 merge는 진행하기 편리하지만, rebase는 진행하기 어려움
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |