커밋하면서 계속 코드짜다보면 갑자기 새로운 기능을 추가하거나 그래야하는 경우가 있다.
그럴 때는 원본파일에 코드를 추가하고 커밋해도 되겠지만
혹시나 잘못해서 지금까지 짰던 프로그램이 망가지는
그럴 걱정 없이 안전하게 새로운 기능을 추가하고 싶으면
프로젝트 원본을 변경하지 않고 복사본을 만들어 거기에 먼저 개발을 해보기 위해 branch를 사용하자. 협업할때도 유용함.
branch가 뭐냐면 그냥 프로젝트 복사본임
git branch 브랜치이름
branch 생성
git switch 브랜치명
branch 이동
git checkout 브랜치명
입력했음 switch
는 신문법임git status
입력하자. git log --graph --oneline --all
branch 와 commit 내역을 한 눈에 그래프로 보고 싶으면 이거 입력해보면 된다.
git log
하면 나오는 HEAD는 나의 현재 위치다.
branch에서 짰던 코드가 맘에들면 원본코드가 있는 main 브랜치에 합치면 된다.
브랜치를 합치는걸 전문용어로 merge라고 한다.
그럼 브랜치에서 개발했던 내용을 main 브랜치에 더해줄 수 있다.
git switch main
으로 main 브랜치로 이동 후
git merge 브랜치명
으로 메인에 합칠 브랜치명을 입력한다.
⬆️ 근데 합칠 때 주의사항이 있는데
main 브랜치와 merge한 브랜치에서 같은 파일, 같은 줄을 수정했을 경우
merge conflict
가 발생한다.
⬆️ 둘 중 어떤 코드를 적용할지 고르면 되는데
<<<< / >>>> / ==== 이런 쓸데없는 것들은 다 지우고 원하는 코드만 남기면 된다.
어떤 코드를 남길지 결정했으면
git add 파일명
git commit -m '메세지'
입력하면 새로운 commit 을 생성해주며 merge conflict 해결 + 브랜치 합치기 완료.
브랜치에 각각 신규 commit이 1회 이상 있는 경우
merge 명령을 내리면 두 브랜치의 코드를 합쳐서 새로운 commit을 자동으로 생성해주는데
이걸 3-way merge 라고 부른다.
이게 merge의 기본 동작방식!!!
🔼 하지만 대충 모든 브랜치를 3-way merge 해버리면 나중에 참사가 일어날 수 있다.
- 3-way merge 된 것들은 매우 복잡해보임
- main 브랜치 git log 출력해보면 3-way merge된 브랜치들의 commit 내역도 다 같이 출력되어서 더러워짐
가끔은 새로운 브랜치에만 commit 이 있고
기준이 되는 브랜치에는 신규 commit 이 없는 경우가 있다.
이 경우 merge 하게 되면 터미널에서 fast-forward
라고 알려준다.
fast-forward merge가 뭐냐면
딱히 합칠게 없어서 그냥 신규브랜치 보고
"지금부터 니 이름은 main 브랜치다" 하는 것.
그래서 "기준이 되는 브랜치에 신규 commit이 없으면" 자동으로 fast-forward merge가 발동됨
싫으면 git merge --no-ff 브랜치명
해서 강제로 3-way merge 할 수도 있다.
3-way, fast-forward 아무렇게나 merge 해도
브랜치를 merge 하고 나면 브랜치가 자동으로 삭제되진 않는다.
git branch -d 브랜치이름
git branch -D 브랜치이름
둘 중 하나 사용하면 이제 필요없는 브랜치를 삭제할 수 있다.
병합이 완료된 브랜치 삭제시엔
-d
이것만 해도 되는데
병합하지 않은 브랜치 삭제시엔-D
이거 해야함
rebase는 브랜치의 시작점을 다른 commit으로 옮겨주는 행위입니다.
- rebase를 이용해서 신규브랜치의 시작점을 main 브랜치 최근 commit으로 옮긴 다음
- fast-forward merge하는 것.
왜 이렇게 귀찮게 함?
3-way merge 말고 강제로 fast-forward 하고 싶을 때
브랜치 그딴거 필요없이도 코드 잘짜는 고수같은 느낌을 주고 싶을 때
commit 내역을 한 줄로 계속 이어서 남기고 싶을 때
그러고 싶으면 일반 3-way merge 대신 rebase & merge 해도 된다.
git switch 새로운브랜치
git rebase main
git switch main
git merge 새로운브랜치
차례로 입력하면 rebase 끝
rebase & merge를 한 줄로 쉽게 비유하자면 강제 fast-forward merge 임
당연히 main 말고 다른 브랜치끼리도 가능
물론 단점도 있는데
브랜치끼리 차이가 너무 많은 경우 rebase하면 충돌이 많이 발생할 수 있는데 그거 하나하나 해결하기 어렵다.
3-way merge처럼 선으로 이어주지 않고
새 브랜치에 있던 코드변경사항들이 main 브랜치로 텔레포트 한다.
그럼 이제 main 브랜치의 git log
출력해볼 때
merge 완료된 브랜치의 commit 같은 것들은 출력되지 않는다.
그게 왜 좋음?
커밋 로그가 깔끔해지고, 가독성이 상승한다.
단점으론
기록이 다 안 남아서 어디서 문제였는지 확인하기 어려워 진다.
git switch main
git merge --squash 브랜치명
git commit -m '메세지'
squash and merge 하는 법은 그냥 --squash 옵션을 추가하면 끝.
브랜치에서 만들어놨던 많은 commit 을 다 합쳐서
하나의 commit으로 main 브랜치에 생성해준다.