프로젝트에 들어가기에 앞서 혼자 레포지토리를 파서 개발을 할 경우 main 브랜치에서 작업하는 경우가 많겠지만 여러 사람들과 프로젝트를 진행하기 위해서는 충돌을 막기 위해 브랜치를 새로 생성해서 작업을 진행해야한다.
브랜칭(branching)
기존 개발 중인 메인 개발 코드를 그대로 복사하여 새로운 기능 개발을 메인 개발 코드를 건드리지 않고 할 수 있는 버전 관리 기법
처음에 GitHub Repository를 생성하면 나오는 main 브랜치에서만 작업을 하다가 새로운 기능 개발을 위해 feature 브랜치를 새로 생성하는 경우, 기존 main 브랜치에서의 작업은 유지하고 새로운 feature 브랜치에서 자유롭게 코드를 추가 및 삭제할 수 있음 .
브랜치 생성하기 / 변경하기 (git switch)
이때, 새로운 브랜치로 Git이 바라보는 곳, HEAD를 변경하는 작업을 switch라고 부릅니다. 브랜치를 생성할 때는 생성(create)의 의미로 -c를 붙여줘야 하고, 기존에 있는 브랜치로 옮길 때는 붙이지 않아도 됩니다.
# feature라는 브랜치를 새로 생성하는 경우, -c를 붙입니다.
git switch -c feature
# checkout이라는 명령어도 사용할 수 있습니다.
git checkout -b feature
# 기존에 있던 main 브랜치로 HEAD를 변경하려면, -c를 붙이지 않습니다.
git switch main
git checkout main
브랜치 합치기 (git merge)
기능 개발이 끝나면 브랜치를 main 브랜치와 합칠 수 있습니다.
# 기능 개발이 진행되었습니다.
git commit -m "기능1의 세부 기능1"
git commit -m "기능1의 세부 기능2"
git commit -m "기능1 개발 완료"
# 머지를 위해 main 브랜치로 전환
git switch main
# main 브랜치로 feat/todo 브랜치를 병함
git merge feat/todo
실제로는 로컬에서 머지하는 것 보다 풀리퀘스트를 통해 변경사항을 확인하고 머지하는 것이 좋음
브랜치 삭제하기 (git branch -d)
머지된 feature 브랜치는 이미 dev 브랜치에 기록이 완벽하게 남아있기 때문에 굳이 남겨둘 이유가 없어 삭제를 권장합니다.
로컬 리포지토리에서 브랜치 삭제는 git branch -d <브랜치명>으로 할 수 있습니다.
git branch -d feat/todo
Git은 원활한 버전 관리를 위해서, 브랜치가 합쳐지지 않으면 삭제하지 못하도록 설정이 되어있습니다. 하지만 종종 다 만들지 못한 기능의 기록을 삭제하고 싶을 수 있습니다. 이때 -D 옵션을 쓰면 삭제할 수 있습니다.
git branch -D feat/todo
다만, 머지되지 않은 브랜치 삭제는 버전 기록 시스템의 사용 목적과는 잘 맞지는 않습니다. 잘 못 만들었던 기능이지만, 해당 기능으로 돌아가고 싶을 수도 있기 때문에 돌아갈 여지를 만들어두는 게 좋을 수도 있습니다.
Stage & Commit
스테이지 영역을 이용하여 커밋할 수 있습니다.
# 다음 커밋을 위해 현재 디렉토리에서 수정된 파일을 확인할 수 있습니다.
$ git status
# 다음 커밋을 위해 파일을 추가(스테이지)합니다. (stage)
$ git add [file]
# 추가한 파일을 언스테이징합니다. 변경 사항은 유지됩니다.
$ git reset [file]
# 스테이지되지 않은 변경 사항을 보여줍니다.
$ git diff
# 스테이지했지만 커밋하지 않은 변경 사항을 보여줍니다.
$ git diff --staged
# 스테이지된 콘텐츠를 메시지와 함께 커밋합니다. (스냅샷 생성)
$ git commit -m “[descriptive message]”
공유 및 업데이트
특정 리포지토리의 업데이트 사항을 검색하여 로컬 리포지토리를 업데이트할 수 있습니다.
# url을 통해 특정 리모트 리포지토리를 별칭으로 추가합니다.
$ git remote add [alias] [url]
# 별칭으로 추가한 리모트 리포지토리에 있는 모든 브랜치 및 데이터를 로컬로 가져옵니다.
$ git fetch [alias]
# 리모트 브랜치를 현재 작업중인 브랜치와 병합하여 최신 상태로 만들 수 있습니다.
$ git merge [alias]/[branch]
# 로컬 브랜치의 커밋을 리모트 브랜치로 전송합니다.
$ git push [alias] [branch]
# 리모트 리포지토리의 정보를 가져와 자동으로 로컬 브랜치에 병합합니다.
$ git pull