브랜치란?
하나의 프로젝트에는 여러 개발자들이 참여하게 된다. 기능 A와 B가 서로 연관이 없다면, A 개발이 끝날 때 까지 기다렸다가 그 이후에 B 개발을 진행하는 것은 비효율적이다. A와 B 개발을 병렬적으로 진행한 뒤 합치는 것이 가장 효율적인 작업이다.
브랜치는 독립적인 작업 공간이라고 볼 수 있다. 메인 작업 공간의 코드를 복사한 개별적인 작업 공간을 만들고 기능별로 각각 다른 브랜치에서 작업하면, 서로 다른 독립적인 공간에서 작업하는 것이기 때문에 서로에게 영향을 주지 않고 작업할 수 있다.
브랜치 확인과 생성
#현재 브랜치 목록과 현재 브랜치 확인
git branch
#브랜치 생성
git branch [branch name]
git branch [branch name] main #이렇게 입력할 경우 main에서 파생되는 브랜치를 만든다
기본 브랜치 (main, master)
기본 브랜치는 git 저장소를 초기화할 때 자동으로 만들어지며 기본 브랜치를 부르는 명칭은 main(github), master(git) 이다. master라는 단어가 노예제를 떠올리게 한다는 이유로 많은 코드에서 master 대신 main을 채택하고 있고, 명령어를 통해 기본 브랜치 이름을 변경할 수 있다.
#기본 브랜치 이름이 master인 git의 브랜치명을 main으로 바꾸려면
git config --global init.defaultBranch main
HEAD라는 특수한 포인터가 지금 작업중인 브랜치를 가리킨다.
checkout
checkout을 통해 브랜치 변경 또는 작업 파일 복원을 할 수 있고, 사용할 브랜치를 지정하여 이동하는 것도 가능하다.
(기존 checkout이 가진 기능이 너무 많기 때문에 Git 2.23에서 checkout 기능을 나누어 switch와 restore가 도입되었다.)
main 브랜치 기반으로 새로운 브랜치 생성 후 해당 브랜치에 특정 파일을 추가한다면, main 브랜치와 새 브랜치 사이를 번갈아 체크아웃하면서 파일이 보였다 사라지는 것을 확인할 수 있다.
* 참고
#모든 커밋을 그래프로 보려면
git log --all --decorate --oneline --graph
#로컬에서 브랜치 생성 후 push할 때 에러가 발생한다면 upstream 브랜치 설정
git push --set-upstream origin [branch_name]
git push -u origin [branch_name]
#git push : 현재 연결된 곳에 push
#git push -u origin [branch_name] : 원격 저장소에 해당 브랜치가 없는 경우, 원격 저장소에도 해당 브랜치를 생성한 뒤 push
switch
기존 checkout의 기능 중 '브랜치 변경' 기능이 switch로 분리 되었다.
#브랜치 변경
git switch A
#브랜치 새로 만들어서 변경
git switch -c B
restore
파일의 수정 내용 복원과 add를 통해 스테이지에 올린 파일을 빼 때 사용한다.
현재 git status가 clean한 상태에서 특정 파일의 내용을 수정한 뒤, 다시 git status를 확인해보면 해당 파일이 'modified' 상태임을 확인할 수 있다. 이 때, 파일 변경 내역을 modified에서 unmodified로 되돌리는 방법은 두가지가 있다.
git restore [file_name]
git checkout -- [file_name]
수정된 파일 중 커밋할 것을 add하고(=스테이지에 올리고) 한번에 커밋하게 되는데, 스테이지에 올린 것을 빼는 방법에도 두가지가 있다.
git restore --staged [file_name]
git reset HEAD [file_name]
브랜치 삭제
브랜치를 삭제한 후 전체 브랜치 목록을 확인해보면 삭제가 잘 되었는지 확인할 수 있다.
#특정 브랜치 삭제
git branch -d [branch_name]
#전체 브랜치 목록 확인
git branch
브랜치 복구
삭제한 브랜치를 어느 시점으로 복구할 것인지 찾아서 커밋 해시값을 알아야 한다.
#모든 참조목록 확인(원하는 시점의 커밋해시값 확인)
git reflog
#브랜치 복구
git checkout -b [branch_name] [commit hash]
#복구 예시
git checkout -b Gary 4e55c00
브랜치 합병 (merge)
두 브랜치로 나누어 작업했던 것을 병합하는 명령어이며, merge가 완료되면 push까지 해야 원격 저장소에 반영된다.
#main으로 브랜치 변경
git checkout main
#메인 브랜치에 A브랜치 병합
git merge A
#병합 후 원격 저장소에 반영
git push origin main
브랜치 충돌 (conflict)
두 브랜치에서 같은 파일을 다르게 작업한 뒤 merge하면 충돌이 일어난다. 이 때 충돌 시점을 찾아 수동으로 고쳐주어야 한다. conflict는 두가지 변경 내역을 비교한 다음에 원하는 코드를 남기는 것이다.
confict가 나면 소스가 다음과 같이 보이는데, 이 중 하나만 남기고 저장한 뒤 add, commit, push까지 진행해주면 된다.
<<<<<<< HEAD (Current Change)
hello world A
=======
hello world B
>>>>>>> [branch_name] (Incoming Change)
VSC와 같은 IDE에서는 충돌이 났을 때 어떤 코드를 유지할지 클릭으로 처리할 수 있다.
이 포스팅은 알잘딱깔센 GitHub 강의를 수강하며 작성되었습니다.
[무료] 30분 요약 강좌 시즌4 : 알잘딱깔센 GitHub - 인프런 | 강의
알아서! 잘! 딱! 깔끔하고! 센스있게! 정리하는 GitHub 핵심 개념 책의 무료강의입니다. 해당 책과 Notion 링크도 무료로 다운로드 받을 수 있습니다. 비영리 프로젝트로 교재활용도 허락없이 가능합
www.inflearn.com
'Git' 카테고리의 다른 글
[Git] 기타 명령어 (0) | 2024.03.23 |
---|---|
[Git] fork / pull request(PR) (0) | 2024.03.21 |
[Git] git clone vs pull (0) | 2024.03.12 |
[Git] repository README.md 수동 생성 및 하위 폴더 생성 방법 (0) | 2024.03.11 |
[Git] Git vs. GitHub (0) | 2024.03.10 |