branch : 나뭇가지
🫂 : 브랜치파서 ㄱㄱ해
😑 : 그거 왜해야하는데?
협업을 하면 가장 기본적으로 듣는 이야기가 브랜치이다. 그럼 대체 이 브랜치라는게 대체 뭘까?
1. 코드를 통째로 복사한 후 원래 코드와 상관없이 독집적으로 개발이 가능하도록 도와줌.
2. 하나의 저장소에서 다양한 소스코드 버전으로 유지 / 관리 가 가능하다.
git branch 라는 명령어로 현재 존재하는 브랜치를 조회할 수있다.

현재 가지고 있는 브랜치는 main 브랜치 뿐이다.
그러나, 브랜치가 여러개 있을때 내가 사용하고있는 branch는 *와 색깔이 함께 표시되어 한눈에 알 수있다.
만약 원격저장소가 따로 존재한다면?
로컬 브랜치와 원격브랜치 한번에 확인할 수 있는 옵션이 존재한다.
git branch -a

git branch <브랜치 이름> 으로 생성할 수 있다.

1. git branch test - test 라는 이름의 브랜치를 생성한다.
2. git branch - 현재 어떤 브랜치가 있는지 확인한다.
위에서도 한번 언급했지만 이렇게 브랜치가 두개가 있을때 내가 현재 위치한 브랜치는
*main 과 같이 별 표시와 초록색으로 색이 바뀌게 된다.
우리가 브랜치를 만든 이유는?
해당 브랜치로 이동해서 작업을 하려고하기 때문이다.
나는 테스트 브랜치에서 하고싶은데 이럴땐 어떤방식으로 이동하면될까?
브랜치를 이동하는 방법은 크게 두가지이다.
사실 나는 평소에 checkout을 가장 많이 사용하지만
예전에는 checkout이라는 명령어로 거의 모든 작업을 진행했다고 한다. 그래서 생긴 명령어가 switch라고 한다.
그래서 되도록이면 switch 를 사용하는 것을 선호한다고 한다.

이렇게 브랜치를 이동하고 잘 이동되었는지 확인해보니
Test브랜치에 *과함께 색이 바뀐것을 볼 수 있다.
그러나, 생성하랴~ 이동하랴~ 확인하랴~ 이런 과정이 복잡하신분들을 위해
checkout -b 라는 옵션이 존재한다. 이는 생성과 동시에 이동해주는 명령어로 귀차니즘에게 딱이다.

짜잔~
사실 git checkout -b move 도 사용할 수 있고 git cehckout -c move 이 두가지를 사용할 수 있다.
사실 기능별로 브랜치를 제작하기때문에 해당 브랜치에서 작업이 끝났거나? 사용하지 않는 브랜치는 지워주는게 좋다고한다.
우선 블로그를 쓰기위해 만든 move브랜치와 test브랜치 이두개를 각각 다른 방법으로 지워보도록 하겠다.
git branch -d <branch name>


짜잔

❓ 음... 다른건 -d / -D인 거같은데 뭐가다른거야?
git branch -d <브랜치이름> : 소문자 d를 사용할 경우 문제가 있는 브랜치인 경우(머지가 안된상태 혹은 충돌이 해결되지 않았을 경우..) git 에서 에러를 발생하며 명령어가 실행되지않는다.
이럴때 사용하는 것이 git branch -D 명령어이다.
git branch -D <브랜치이름> : 앞에서 말했든 오류가 나든 말든 그냥 지워라~ 라는 뜻이다.
이렇게 각각 기능을 만들어 두었으면 이제 브랜치를 메인으로 합쳐야할 타이밍이다.
나는 보통 git rebase 를 사용하는데 여기선 두가지 명령어를 둘다 설명해보고자 한다.
1. git merge
merge : 병합하다.
가장 보편적인 방법이다.
git merge test : 메인브랜치와 test 브랜치를 병합하겠다~이렇게 하게되면 병합용 커밋이 따로 생긴다.
Merge branch 'test'라는 커밋이 생기게된다.
이같은 병합을 3-way-merge 라고한다.
자 그럼 반대로 생각해보자.
case : repo를 만들어서 main 브랜치가 생성되어있는 상황에 -> login 브랜치를 생성하여 login브랜치에서만 작업한 경우이다.
즉. main브랜치는 아무 작업도 하지않고, 새로운 브랜치를 하나 만들고 해당 브랜치에서만 작업했을때 어떤 일이 발생하는지 알아볼 것이다.
결론 먼저 말하자면 이렇게 된다면 앞서 말했던 병합용 커밋이 따로 생기지 않는다.
그 이유는 무엇일까?
main 브랜치에서 아무것도 작업하지 않았기에 main브랜치만 login브랜치가 있는 위치로 이동하면? 병합한것이랑 마찬가지이므로 커밋이 따로 생기지 않는 것이다.
이러한 병합은 fast-forward(빨리감기) 병합 이라고 한다.
그러나, 병합 이력을 남기고 싶다면 옵션을 추가하면 된다.
git merge --no-ff <브랜치 이름>
2. git rebase
git rebase <브랜치 이름>
위에서 말했듯 git merge는 3-way-merge가 된다.
얘를 fast-forward하기 위해 사용한다고 생각하면 된다.
여기서 문제점이 생기는데?
내 로컬에서만 작업했다면 상관이 없지만, 원격 저장소에 영향을 줄만한 애를 git rebase를 통해 재배치하게 된다면 commit 이 변경되어 문제가 생긴다.
즉? 원격에서는 사용하지말고 merge를 사용하는것을 권장한다.