branch는 메인 차원뿐만 아니라 다른 차원으로 넘나들 수 있다. 예를 들어 프로젝트를 하나 이상의 모습(실배포용, 테스트서버용, 새로운 시도용)으로 관리해야 하거나 여러 작업들이 각각 독립되어 진행될 때 각각의 차원에서 작업한 뒤 확정된 것을 메인 차원에 통합한다.
branch 생성
git branch
*는 현재 branch를 뜻한다.
branch 변경
git switch (branch명)
원래 branch 변경은 주로 checkout을 이용했는데 checkout 명령어가 Git 2.23 버전부터 switch, restore로 분리되었다. 따라서
switch
를 사용하도록 하자.
브랜치 생성과 동시에 이동하기
git switch -c (새로운 branch명)
기존에는 git checkout -b [새 브랜치명]
였다.
브랜치 삭제하기
git branch -d (삭제할 브랜치명)
ex) git branch -D (브랜치명)
branch 이름 바꾸기
git branch -m (기존 브랜치명) (새 브랜치명)
소스트리 보면 가지 끝에 4개의 branch가 있는 모습을 볼 수 있다. 여기서 각 브랜치에다 커밋을 하면 가지가 뻗어나간다.
이처럼 프로젝트는 한폴더 안에 있지만 branch를 어디에다 switch하는지에 따라 나타나는 코드가 다르다.
위치한 브랜치에서의 내역 확인 : git log
여러 브랜치의 내역 편리하게 보기 : git log --all --decorate --oneline --graph
(근데 사실 이렇게 볼바엔 소스트리로 보는게 훨씬 보기 좋음)
add-coach 브랜치를 main 브랜치로 merge한다고 가정해보자
->main 브랜치로 이동
-> git merge add-coach
merge는 새로운 하나의 커밋이기 때문에 reset으로 되돌리는게 가능하다. (merge하기 바로 전 상태로)
소스트리로 살펴보면 merge하기 바로 전 커밋에 오른쪽 마우스 > 이 커밋까지 현재 브랜치를 초기화
> hard 클릭함
그리고난뒤, merge한 브랜치는 삭제한다.
git branch -d add-coach
new-teams 브랜치를 main 브랜치로 rebase한다고 가정해보자
-> new-teams 브랜치로 이동
-> git rebase main
병합할 브랜치를 main 브랜치로 rebase한다
1. main에다 병합하고 싶은 브랜치로 이동
2. 아래 명령어로 병합
git rebase main
git merge [병합할 branch명]
즉, rebase할 대상 브랜치로 가서 main브랜치로 가지를 이어붙이고 그 다음에 main브랜치의 싹을 끝으로 옮겨주면 된다.
4. 병합이 되었으니 이제 그 브랜치는 삭제해주면 된다.
git branch -d [병합한 브랜치]
진행하는 프로젝트의 성격에 따라 브랜치의 사용 내역들을 남겨둘 필요가 있다면 merge를, 그보다 히스토리를 깔끔하게 만드는게 중요하다면 rebase를 해야한다. 이미 팀원들간에 공유된 커밋들에 대해서는 rebase를 사용하지 않는게 좋다,,
merge가 충돌하게 되면 위와 같이 된다.
초록색: 현재 브랜치 ==> 현재 main에 있는 브랜치의 내용을 고수하겠다
파랑색: merge할 브랜치
이와 같이 충돌이 난 곳의 여러개를 한꺼번에 찾고싶다면 에디터에서 검색 기능을 통해 '<<<'를 쳐보면 된다.
당장 충돌 해결이 어려울 경우 아래 명령어로 merge 중단
git merge --abort
그럼 merge가 중단되고, 평온하게 main으로 돌아간다. 해결 가능 시 충돌 부분을 모두 수정한 뒤 git add ., git commit으로 병합 완료한다.
rebase는 병합하고 싶은 브랜치의 커밋 내용들을 그대로 main브랜치 뒤에다 병합하는 것이기 때문에 병합할 브랜치 안에 있는 모든 커밋마다 그 충동과정을 따로따로 차례로 해결해줘야한다.
빨간글씨 both modified 부분에서 충돌이 나고 있으니 우리가 해결하라는 의미다.
당장 충돌 해결이 어려울 경우 아래 명령어로 merge 중단한다.
git rebase --abort
해결이 가능하면,
충돌 부분을 수정한 뒤 git add . 하고
아래 명령어로 계속한다.
git rebase --continue
그런데도 아래와 같이 오류 명령어가 나온다면?
파란줄 부분이 아직 제대로 병합이 되지 않은거임ㅇㅇ
저 파일로 다시 가서 오류를 수정해보자
이제 모두 충돌 오류 해결을 했으니 위와 같이 success 명령어가 나온다. 근데 소스트리 사진에 잘보면 main이 뒤처져있음
merge를 다시한번 해주면 됨
그럼 이제 main과 conflict-2 브랜치가 가지 끝에 있는걸 알 수 있다. 이제 병합은 다 끝났으니 main을 제외한 나머지 브랜치들은 다 지운다. 다 사용한 브랜치는 제때제때 지워주는게 혼란방지에 좋다!
상단에 브랜치 버튼을 누르면 브랜치 생성이 된다. 브랜치 생성을 다하면 왼쪽에 브랜치 목록들이 있을텐데 특정 브랜치를 더블클릭하면 checkout 된다.
1) merge
2) rebase
위와 같이 main이 뒤처져있다면 main에서 to-rebase를 rebase해야함
그럼 이제 main이 to-rebase와 같이 최신 브랜치로 위치해있다. 병합 작업이 끝났으면 브랜치 삭제하면 됨ㅇㅇ
삭제는 해당 브랜치 선택 후 우클릭하면 삭제 버튼 따로 있음ㅇㅇ
1) rebase는 충돌시 소스트리로 해결하는게 복잡하기 때문에 CLI로 진행 권장함
2) merge
똑같이 main으로 가서 merge할 브랜치 선택 후 우클릭해서 병합 버튼을 누르면 error 메세지가 뜬다. 그럼 vscode로 가서 코드 수정 후 다시 소스트리가서 커밋 화면으로 가면 된다. 아래와 같이 커밋 메세지가 자동으로 뜬다.
그럼 아래에 있는 파일도 스테이지에 올리고 바로 커밋 버튼을 누르면 된다.