📚 코딩애플의 '매우 쉽게 알려주는 git & github'을 수강하며 배우거나 추가적으로 찾아본 것들을 정리한 내용입니다.
git에서 branch 만들기
branch 만들기
하나뿐인 원본 파일에 끊임없이 코드를 추가하다가 파일이 망가진다면 어떻게 해야 할까? 이런 걱정 없이 새로운 기능을 추가하고 싶다면, 프로젝트의 복사본을 만들어서 그곳에 먼저 개발해 보는 것도 좋은 방법이다.
git에서는 위와 같은 기능을 branch를 이용해 복사본을 손쉽게 만들 수 있다.
# 프로젝트 사본 만들기
git branch 브랜치이름
# 브랜치로 이동하기
git switch 브랜치이름
# 메인 브랜치로 돌아가기
git switch main
# 설정에 따라 main이 아니라 master일 수도 있음
# 어떤 브랜치에 있는지 까먹었을 때 알아보기
git status
# [추가] branch 하자마자 해당 브랜치로 바로 이동하기
git checkout -b 브랜치이름
merge 하기 (branch 합치기)
브랜치를 합치는 것을 merge라고 한다.
# merge하기 1. main/master 브랜치로 이동한다.
git switch main
# merge하기 2. git merge 브랜치명 입력한다.
git merge 브랜치명
이때, main 브랜치와 merge할 브랜치에서 같은 파일, 같은 줄을 수정했을 경우 merge conflict 에러가 발생한다. 이 경우 에디터(VSCode 등)로 해당 파일을 열어보면 충돌사항이 적혀있다. 해당 부분을 수정한 뒤 다시 git add, git commit을 진행한다.
협업 시의 branch
같은 프로그램을 만드는데 10명이서 동시에 동일한 소스코드를 수정하고 저장해 버리면 큰 에러가 발생할 것이다. 따라서 기능을 하나 추가하고 싶으면,
- 우선 branch로 프로젝트 사본을 만들어 거기서 먼저 개발을 진행한다.
- 테스트를 해봤는데 잘 된다면 main branch에 다시 합친다.
위와 같은 방식으로 진행하면 좀 더 안정적으로 개발을 할 수 있다.
다양한 merge 방법
3-way
- 브랜치에 각각 신규 commit이 1회 이상 있을 때 merge 명령을 내리면 두 브랜치의 코드를 합쳐서 새로운 commit을 자동으로 생성해 준다. 이를 3-way merge라고 한다.
- merge의 기본 동작 방식이다.
fast-foward
- 새로운 브랜치에만 commit이 있고 기준이 되는 브랜치에는 신규 commit이 없을 때 merge를 하게 되면, fast-forward merge가 되었다는 알림이 뜬다.
- 딱히 합칠 내용이 없었기 때문에 main 브랜치로 바로 merge하는 것을 말한다.
- 기준이 되는 브랜치에 신규 commit이 없으면 자동으로 fast-forward merge가 발동되게 되며, 이렇게 진행하고 싶지 않다면 아래와 같이 강제로 3-way merge를 진행한다.
# fast-forward merge하지 않고 강제로 3-way merge 하기
git merge --no-ff 브랜치명
브랜치 삭제하기
브랜치를 merge했다고 남은 브랜치가 자동으로 삭제되지는 않는다. 따라서 아래와 같이 브랜치 삭제를 진행해 준다.
# 병합이 완료된 브랜치 삭제 시에는 아래 하나만 진행
git branch -d 브랜치이름
# 병합하지 않은 브랜치 삭제 에는 위와 아래 명령어 모두 진행
git branch -D 브랜치이름
rebase
브랜치의 시작점을 다른 commit으로 옮겨주는 것을 rebase라고 한다.
- rebase를 이용해 신규 브랜치의 시작점을 main 브랜치의 최근 commit으로 옮긴다.
- fast-forward merge한다.
왜 rebase를 사용할까?
- 3-way merge가 아니라 강제로 fast-forward가 필요할 때가 있다. 브랜치가 몇십 개, 몇백 개가 되면 main log가 지저분해지기 때문에 간단한 기능 수정 같은 경우는 rebase로 깔끔하게 이어 붙이기도 한다.
- 또는 랜치 필요 없이 코드를 잘 짜는 고수 같은 느낌을 주고 싶을 때 사용한다고 한다 😄
rebase하는 방법
# 1. 새로운 브랜치로 먼저 이동한다.
git switch 새로운브랜치
# 2. rebase main 한다.
git rebase main
# 3. 그럼 브랜치가 main 브랜치 끝으로 이동하는데, 그걸 fast-forward merge 한다.
git switch main
git merge 새로운브랜치
브랜치끼리 차이가 너무 많은 경우 rebase하면 충돌이 많이 발생할 수 있는 단점이 있으니 유의해야 한다.
squash
모든 브랜치를 3-way merge하면 안 된다! 3-way merge한 것들은 위와 같이 매우 복잡해 보이며, main 브랜치의 log를 출력해 보면 3-way merge된 브랜치들의 commit 내역도 다 같이 출력되기 때문에 파악이 어려워진다.
위와 같은 단점을 해결하는 방법은 rebase 또는 squash and merge이다.
# squash(순간이동) 하기
git merge --squash 새브랜치
- squash and merge를 하게 되면 3-way merge처럼 선으로 이어주지 않고, 새 브랜치에 있던 코드 변경 사항들이 main 브랜치로 텔레포트 한다.
- 또한 main 브랜치의 git log를 출력했을 때 merge가 완료된 브랜치의 commit같은 것들은 출력되지 않는다.
어떤 merge를 하는 게 가장 좋은가?
✨ 기록을 남겨야 하는 중요한 브랜치를 merge할 때는 3-way merge
✨ 기록을 남길 필요 없는 브랜치를 merge할 때는 squash, rebase
[관련 글 함께 보기]
[참고 자료]
https://codingapple.com/course/git-and-github/
'Etc.' 카테고리의 다른 글
[코딩애플 / git] git & github(4)_push, clone, pull, fetch 사용법 (0) | 2023.03.28 |
---|---|
[코딩애플 / git] git & github(3)_restore, revert, reset 사용법 (0) | 2023.03.27 |
[코딩애플 / git] git & github(1)_add, commit, diff 사용법 (ft. VSCode) (0) | 2023.03.26 |
[Node.js / AWS Lambda / Discord] 시간 자동 알림 디스코드 웹 훅 만들기 (2) | 2023.03.24 |
[Frontend Developer Roadmap] 프론트엔드 로드맵 2023 (0) | 2023.02.07 |