git branch

jiyoung·2022년 3월 8일
0

branch는 메인 차원뿐만 아니라 다른 차원으로 넘나들 수 있다. 예를 들어 프로젝트를 하나 이상의 모습(실배포용, 테스트서버용, 새로운 시도용)으로 관리해야 하거나 여러 작업들이 각각 독립되어 진행될 때 각각의 차원에서 작업한 뒤 확정된 것을 메인 차원에 통합한다.

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 (삭제할 브랜치명)
지울 branch에 다른 branch로 적용되지 않은 내용의 커밋이 있을 시에는 -D(대문자)옵션으로 강제 삭제한다.

ex) git branch -D (브랜치명)

branch 이름 바꾸기

git branch -m (기존 브랜치명) (새 브랜치명)

소스트리 보면 가지 끝에 4개의 branch가 있는 모습을 볼 수 있다. 여기서 각 브랜치에다 커밋을 하면 가지가 뻗어나간다.

branch가 add-coach일때

branch가 main일때

이처럼 프로젝트는 한폴더 안에 있지만 branch를 어디에다 switch하는지에 따라 나타나는 코드가 다르다.


위치한 브랜치에서의 내역 확인 : git log
여러 브랜치의 내역 편리하게 보기 : git log --all --decorate --oneline --graph

(근데 사실 이렇게 볼바엔 소스트리로 보는게 훨씬 보기 좋음)


branch 합치기

총 2가지 방법이 있다.

1. merge

병합이라는 말 뜻처럼 가지를 서로 이어붙인다는 뜻이다. 그과정에서 커밋 하나가 더 생기게 되고 이 새로운 커밋은 원래 브랜치랑 병합될 브랜치의 모든 변화들이 싹 다 담기게 되는 것이다. 브랜치 사용내역을 남길 필요가 있을 때 적합한 방식이다.

add-coach 브랜치를 main 브랜치로 merge한다고 가정해보자
->main 브랜치로 이동
-> git merge add-coach

merge는 새로운 하나의 커밋이기 때문에 reset으로 되돌리는게 가능하다. (merge하기 바로 전 상태로)

소스트리로 살펴보면 merge하기 바로 전 커밋에 오른쪽 마우스 > 이 커밋까지 현재 브랜치를 초기화 > hard 클릭함

그리고난뒤, merge한 브랜치는 삭제한다.

git branch -d add-coach

2. rebase

브랜치의 마디인 커밋들을 다른 브랜치에 이어붙이는 것이다. 한 줄로 깔끔히 정리된 내역을 유지하기 원할 때 적합하다. 예를 들어 main 브랜치에다 new-teams라는 브랜치의 커밋들을 하나하나 추가한 것처럼 보인다.

new-teams 브랜치를 main 브랜치로 rebase한다고 가정해보자
-> new-teams 브랜치로 이동
-> git rebase main

병합할 브랜치를 main 브랜치로 rebase한다
1. main에다 병합하고 싶은 브랜치로 이동
2. 아래 명령어로 병합

git rebase main
  1. main 브랜치로 이동 후 아래 명령어로 new-teams의 시점으로 fast-forward
git merge [병합할 branch명]

즉, rebase할 대상 브랜치로 가서 main브랜치로 가지를 이어붙이고 그 다음에 main브랜치의 싹을 끝으로 옮겨주면 된다.
4. 병합이 되었으니 이제 그 브랜치는 삭제해주면 된다.

git branch -d [병합한 브랜치]

진행하는 프로젝트의 성격에 따라 브랜치의 사용 내역들을 남겨둘 필요가 있다면 merge를, 그보다 히스토리를 깔끔하게 만드는게 중요하다면 rebase를 해야한다. 이미 팀원들간에 공유된 커밋들에 대해서는 rebase를 사용하지 않는게 좋다,,


branch 충돌 해결하기

1) merge

merge가 충돌하게 되면 위와 같이 된다.
초록색: 현재 브랜치 ==> 현재 main에 있는 브랜치의 내용을 고수하겠다
파랑색: merge할 브랜치

이와 같이 충돌이 난 곳의 여러개를 한꺼번에 찾고싶다면 에디터에서 검색 기능을 통해 '<<<'를 쳐보면 된다.

당장 충돌 해결이 어려울 경우 아래 명령어로 merge 중단

git merge --abort

그럼 merge가 중단되고, 평온하게 main으로 돌아간다. 해결 가능 시 충돌 부분을 모두 수정한 뒤 git add ., git commit으로 병합 완료한다.

2) rebase

rebase는 병합하고 싶은 브랜치의 커밋 내용들을 그대로 main브랜치 뒤에다 병합하는 것이기 때문에 병합할 브랜치 안에 있는 모든 커밋마다 그 충동과정을 따로따로 차례로 해결해줘야한다.

빨간글씨 both modified 부분에서 충돌이 나고 있으니 우리가 해결하라는 의미다.

당장 충돌 해결이 어려울 경우 아래 명령어로 merge 중단한다.

git rebase --abort

해결이 가능하면,
충돌 부분을 수정한 뒤 git add . 하고
아래 명령어로 계속한다.

git rebase --continue

그런데도 아래와 같이 오류 명령어가 나온다면?


파란줄 부분이 아직 제대로 병합이 되지 않은거임ㅇㅇ
저 파일로 다시 가서 오류를 수정해보자

이제 모두 충돌 오류 해결을 했으니 위와 같이 success 명령어가 나온다. 근데 소스트리 사진에 잘보면 main이 뒤처져있음
merge를 다시한번 해주면 됨


그럼 이제 main과 conflict-2 브랜치가 가지 끝에 있는걸 알 수 있다. 이제 병합은 다 끝났으니 main을 제외한 나머지 브랜치들은 다 지운다. 다 사용한 브랜치는 제때제때 지워주는게 혼란방지에 좋다!

[소스트리 버전]

상단에 브랜치 버튼을 누르면 브랜치 생성이 된다. 브랜치 생성을 다하면 왼쪽에 브랜치 목록들이 있을텐데 특정 브랜치를 더블클릭하면 checkout 된다.

1) merge

  • main 브랜치로 이동
  • 병합할 브랜치 우클릭 > '현재 브랜치로 [병합할 브랜치명] 병합' 클릭

2) rebase

  • 병합할 브랜치로 이동
  • main 브랜치 우클릭 > '현재 변경사항을 main에 재배치' 클릭

위와 같이 main이 뒤처져있다면 main에서 to-rebase를 rebase해야함

그럼 이제 main이 to-rebase와 같이 최신 브랜치로 위치해있다. 병합 작업이 끝났으면 브랜치 삭제하면 됨ㅇㅇ

삭제는 해당 브랜치 선택 후 우클릭하면 삭제 버튼 따로 있음ㅇㅇ

<충돌 해결하기>

1) rebase는 충돌시 소스트리로 해결하는게 복잡하기 때문에 CLI로 진행 권장함

2) merge
똑같이 main으로 가서 merge할 브랜치 선택 후 우클릭해서 병합 버튼을 누르면 error 메세지가 뜬다. 그럼 vscode로 가서 코드 수정 후 다시 소스트리가서 커밋 화면으로 가면 된다. 아래와 같이 커밋 메세지가 자동으로 뜬다.

그럼 아래에 있는 파일도 스테이지에 올리고 바로 커밋 버튼을 누르면 된다.

0개의 댓글