Git branch 넘나들기
1. 여러 branch 만들어보기
Git에서 프로젝트를 하나 이상의 모습으로 관리해야 할 때, 혹은 여러 작업들이 각각 독립되어 진행될 때
여러 branch를 생성하여 하나의 프로젝트 폴더에서 관리할 수 있도록 만들 수 있다.
먼저 branch를 만드는 방법은 git branch "branch name" 이고, 브랜치 목록은 git branch를 입력하면 된다.
여기에서 branch 앞에 * 표시가 되어있거나 것이 현재 내가 보고 있는 branch 인데
git switch "branch name" 를 입력하여 보고있는 branch가 main 에서 add-branch 로 변경되었다.

SourceTree 를 살펴보면 branch 가 분리되지는 않았는데 그 이유는 두개의 브랜치가 같은 버전에 있기 때문이다.

그렇다면 git branch를 생성하면서 동시에 이동할 수 있는 명령어는 무엇일까?
git switch -c "branch name" 명령어를 통해 브랜치 생성과 이동을 동시에 할 수 있다.

이렇게 생성된 branch 중 삭제하고 싶은 branch 가 있다면, git branch -d "branch name" 을 입력하면 되는데,
지워질 브랜치에만 있는 내용의 commit 이 있는 경우, -d 대신 -D 를 사용하여 강제 삭제해야 한다.
브랜치 이름을 변경하는 방법은 git branch -m "before branch name" "after branch name" 이다.

이렇게 여러 branch를 만든 상태에서 각각의 branch마다 새로운 commit 을 추가하는 경우,
SourceTree 에서 확인하면 아래와 같이 branch가 나뉘는 것을 확인할 수 있다.
위 상태로 git switch 를 진행하는 경우, 해당 branch의 마지막 상태로 내용들이 변경된다.

추가로 git log는 내가 현재 보고있는 branch의 내용만 확인할 수 있다.
그래서 여러 branch의 내역을 확인하고 싶을 때는 git log --all --decorate --oneline --graph 를 사용한다.

2. 여러 branch 를 합쳐보기
이렇게 분리된 branch를 main branch에 합칠 때 두가지 방법이 있는데, merge 와 rebase 이다.
두개의 차이는 merge는 두개의 branch를 합치기 때문에 commit 이 새로 생기게 된다.
rebase는 branch의 commit 을 대상 branch에 옮겨 붙이는 것을 의미한다.
따라서 프로젝트 성격에 따라 branch 사용내역을 남길 필요가 있다면 Merge,
히스토리를 깔끔하게 만드는 것이 중요하다면 Rebase를 사용하는 것이 더 적절하다.
다만, 팀원에게 공유된 commit 에 대해서는 Rebase를 사용하는 것보다 Merge를 사용하는 것이 더 낫다.

main branch로 switch 한 상태에서 git merge "branch name"을 통해 merge를 진행할 수 있는데,
되돌리고 싶다면 reset을 사용하여 merge 하기 전 branch의 마지막 시점으로 돌아갈 수 있다.

rebase를 하고 싶은 branch로 이동한 상태에서 git rebase "branch name"을 통해 합칠 수 있다.
그런데 여기서 rebase 된 branch는 끝까지 가는데 .rebase 대상 branch는 끝까지 가지 않는다.
아래와 같은 경우, main branch 로 이동한 뒤 git merge new-branch 를 통해 다시 한 번 merge 를 해야 한다.

3. branch 충돌 해결하기
위에서 merge 할 때 conflict 가 발생했는데, 이는 서로 다른 branch에서 같은 부분을 수정하면
둘 중 어떤 부분을 채택해야 할지 모르기 때문에 충돌이 발생하고, 이를 해결해야 한다.
예를 들어서 main branch 에서 test1.py 내 test1 변수 값을 100으로 변경하고,
sub1 branch에서 test1 변수 값을 10으로 변경했을 때, 두개의 branch를 merge 하거나 rebase 하면
같은 변수에 대해 어떤 branch의 값을 반영해야 할지 알 수 없으므로 충돌이 발생한다.

위와 같은 경우라고 예상하고 이때 main과 sub1을 merge하면 아래와 같이 나온다.
Accept Current Change 를 누르면 현재 branch에서 설정한 값으로 변경한다.
Accept Incomming Change 는 merge 하는 branch에서 설정한 값으로 변경한다.
Accept Both Changes 를 누르면 두개의 내용을 모두 다 입력하고,
Compare changes 는 새로운 에디터로 이동되어 비교할 수 있다.
이후에는 반드시 git add . git commit 을 사용하여 변경사항을 저장해야 한다.

만약 충돌한 값을 당장 해결하기 어려울것 같다면, git merge --abort 로 merge를 중단할 수 있다.
그렇다면 rebase는 어떻게 될까? merge는 branch 의 최종 commit 과 비교를 진행하는 반면,
rebase는 각각의 commit을 옮겨오기 때문에 각각의 충돌을 따로따로 해결 해야한다.
이때에도 당장 해결하기 어렵다면 git rebase --abort 로 rebase 를 중단시킬 수 있다.
반면에 해결을 할 수 있다면, 해결한 뒤에 git add . 그리고 git rebase --continue 를 하면 되고
이후 충돌된 내용이 있다면 계속해서 Conflict 에러가 발생하므로, 이를 해결해 나가면 된다.

4. SourceTree 로 진행해보기
첫번째로 branch를 추가하는 방법은 상단에 브랜치를 클릭한 뒤 브랜치 생성을 누르면 된다.

그런 뒤 원하는 branch를 더블클릭하여 커밋 버튼을 눌러 변경사항이 있을 때마다 commit을 진행한다.
그럼 아래와 같이 3갈래로 나뉘는데 왼쪽 branch 목록 우클릭 시 나오는 버튼목록 중
현재 브랜치로 병합은 merge 현재 변경사항을 재배치는 rebase를 의미한다.
조심해야 할 부분은 merge는 병합하고자 하는 branch에서 진행, rebase는 병합이 될 branch에서 진행해야 한다.

만약 merge나 conflict 과정에서 conflict 가 발생한다면, CLI 를 통해서 수정하는것이 좋지만
SourceTree에서 수정하고 싶다면 VS Code에서 해당 내용을 수정한 뒤 Commit 을 진행하면 된다.

이렇게 기본적인 Git 사용방법을 알아봤는데, 이제 GitHub 을 활용하여
다음 포스팅부터는 원격 저장소를 사용하고 push pull을 진행하는 방법을 알아보려고 한다.