git으로 프로젝트를 관리하면, 기본적으로 main(과거에는 master)이라는 하나의 브랜치에서 커밋들이 생성된다.
git branch 브랜치명
EX. add-coach라는 이름의 브랜치 만들기
git branch add-coach
기존에는 *.yaml에 team, manager, members만 존재했다. 그런데, 새로운 branch를 만들면서 *.yaml에 coach를 추가하고자 한다.
git switch 브랜치명
EX. main 브랜치 -> add-coach 브랜치로 이동하기
git switch add-coach
add-coach 브랜치로 이동했기 때문에, 소스트리에서 add-coach가 main보다 앞에 오는 것이다.
참고. git 2.23 버전부터 checkout -> checkout, switch, restore로 분리되었다. (이전에는 checkout 명령어가 수행하는 기능이 너무 많았음)
2-2. branch 생성과 동시에 이동하기
git switch -c 브랜치명
참고. git 2.23 버전 이전에는 git checkout -b 브랜치명
EX) new-teams라는 브랜치를 생성하고, 이동하기
git switch -c new-teams
git branch
main, add-coach라는 2개의 브랜치가 존재하고, 현재 브랜치는 main이다.
git branch -d 브랜치명
EX) to-delete라는 브랜치를 삭제하기
git branch -d to-delete
참고1) 현재 브랜치가 to-delete일 때는 to-delete 브랜치를 삭제할 수 없다. 다른 브랜치에 있을 때, to-delete 브랜치를 삭제할 수 있다(다른 브랜치로 이동해야 함).
참고2)merge 또는 rebase가 된 브랜치(브랜치의 내용들이 다른 브랜치에 전부 적용되어 있음)를 삭제하는 것은 문제되지 않는다. 그런데, merge 또는 rebase되지 않은 브랜치를 삭제하려고 하면 기본적으로 삭제를 막는다(필요한 브랜치인데 사용자가 실수로 삭제하는 것일까봐). 이때, 브랜치를 삭제하려면,
git branch -D 브랜치명
이때, 소문자 d가 아닌 -D
git branch -m 기존브랜치명 새브랜치명
EX) 브랜치 이름을 to-branch -> to-erase로 변경하기
git branch -m to-branch to-erase
각 브랜치에서 커밋을 만들어보자.
현재 커밋 상태는 다음과 같다.
add-coach, new-teams라는 2개의 브랜치를 추가하였다.
git branch add-coach
git branch new-teams
main 브랜치에서 2개의 커밋을 추가하였다.
leopards.yaml의 members에 'Olivia' 추가
panthers.yaml의 members에 'Freddie' 추가
add-coach 브랜치에서 3개의 커밋을 추가하였다.
tigers.yaml에 'coach: Grace' 추가
leopards.yaml에 'coach: Oscar' 추가
panthers.yaml에 'coach: Teddy' 추가
new-teams 브랜치에 2개의 커밋을 추가하였다.
pumas.yaml 추가
jaguars.yaml 추가
최종) git의 시점에서 현재 프로젝트
참고) 'git log' 명령어는 위치한 브랜치에서의 커밋만 볼 수 있다.
예를 들어, 현재 new-teams 브랜치에 있기 때문에, new-teams 브랜치에서의 커밋만 볼 수 있다.
목표: add-coach 브랜치에서 coach를 추가한 것, new-teams 브랜치에서 팀을 추가한 것이 모두 채택되어, main branch에 추가하겠다.
add-coach branch는 merge, new-teams branch는 rebase해볼 것이다.
ⅰ. main 브랜치로 이동 -> 'git merge 합칠브랜치'
git switch main
git merge add-coach
ⅱ. 병합된 브랜치 삭제하기
git branch -d add-coach
ⅰ. new-teams 브랜치로 이동 > 'git rebase main'
git switch new-teams
git rebase main
주의! merge는 main 브랜치로 이동 후, 'merge 합칠브랜치'
ⅱ. 뒤쳐저 있는 main 브랜치를 new-teams 브랜치 위치로 옮겨주기
이 과정은 'merge' 명령어를 사용한다(자세한 내용은 branch 심화편에서 다룰 것).
git merge new-teams
ⅲ. new-teams 브랜치 삭제하기
git branch -d new-teams
branch 간 충돌이 발생하는 경우: 같은 파일의 같은 위치에 서로 다른 내용이 입력된 경우
branch 간 충돌이 발생하는, 충돌을 해결하는 과정을 살펴보자.
현재 상황: main, conflict-1, conflict-2 브랜치 존재
main, conflict-1, conflict-2 브랜치에 각각 커밋을 추가했다.
이때, 다음과 같은 conflict가 발생한다.
git switch main
git merge conflict-1
tigers.yaml의 manager에 'Deborah'를 입력하는 방향으로 conflict를 해결하겠다.
git add .
git commit
(vim 모드로 진입하면서, 자동으로 커밋 메시지가 생성됨)
참고) 발생한 conflict를 당장 해결할 수 없는 경우(EX. conflict가 너무 많이 발생함), merge를 중단한다.
git merge --abort
git switch conflict-2
git rebase main
git add .
git rebase --continue
conflict 2
conflict 2 해결: panthers.yaml의 coach에 'Shirley'를 입력하는 방향으로 conflict를 해결하겠다.
git add .
git rebase --continue
현재 히스토리는 다음과 같다.
참고. 2nd 커밋이 생성되지 않은 이유는, 2nd 커밋을 만들 필요가 없기 때문이다. 1st commit에서 panthers.yaml의 coach는 'Shirley'이다. conflict 2에서 panthers.yaml의 coach로 'Shirley'를 택했고, 따라서, 2nd 커밋은 1st 커밋과 동일하기에, 2nd 커밋을 만들 필요가 없는 것이다.
뒤져친 main 브랜치를 conflict-2 브랜치 위치까지 이동시키고,
conflict-1, conflict-2 브랜치 삭제하기
git switch main
git merge conflict-2
git branch -d conflict-1
git branch -d conflict-2
참고1) 발생한 conflict를 당장 해결할 수 없는 경우, rebase를 중단한다.
git rebase --abort
참고2) 다음에 대해 merge, rebase가 다른 방식으로 처리하는 것을 발견했다.
브랜치 생성하기
상단 '브랜치' > '새 브랜치' 필드에 브랜치명 작성 > '브랜치생성'
'새 브랜치 체크아웃'(스위치)이 클릭되어 있기 때문에, 브랜치 생성과 동시에 해당 브랜치로 이동되는 것이다.
브랜치 목록보기
브랜치 이동하기
브랜치 목록에서 이동하고 싶은 브랜치를 더블클릭
브랜치 삭제하기
브랜치 목록에서 브랜치 우클릭 > 브랜치 삭제
참고) merge 또는 rebase되지 않은 브랜치를 삭제하려고 하면 기본적으로 삭제를 막는다. 이때, 브랜치를 삭제하려면, 브랜치 삭제에서 '강제 삭제' 옵션을 체크하면 된다.
ⅰ. main 브랜치로 이동(main 브랜치 더블클릭)
ⅱ. to-merge 우클릭 > '현재 브랜치로 to-merge 병합'
ⅰ. to-rebase 브랜치로 이동(to-rebase 브랜치 더블클릭)
ⅱ. main 우클릭 > '현재 변경 사항을 main에 재배치'
ⅲ. 뒤져친 main을 ro-rebase 브랜치 위치까지 이동하고,
to-merge, to-rebase 브랜치 삭제하기:
main 브랜치로 이동
to-rebase에 대해 재배치(git merge to-rebase)
rebase는 conflict 발생 시, CLI로 진행하는 것을 권장한다.
현재 상황은 다음과 같다.
'Edit Tigers members' 커밋에서, main 브랜치에는 tigers.yaml의 members에 'Kim' 추가, conflict 브랜치에는 'Park' 추가하였고, tigers.yaml의 memebers에서 마지막 줄에서 conflict가 발생하였다.
conflict 발생 -> conflict 해결 후, add & commit