1. 브랜치(Branch)
브랜치는 독립된 개발 환경을 제공하는 기능이다. 브랜치는 여러 명이 동시에 개발할 때 각각의 작업을 분리하여 진행하거나, 새로운 기능을 테스트할 때 유용하게 사용할 수 있다. Git의 강력한 기능 중 하나로, 소스코드의 주 버전(main/master)과는 독립된 작업 공간을 만든다.
- 기본 브랜치는 보통
main 혹은 master 브랜치로 사용된다.
- 새 브랜치 생성: 새로운 브랜치를 만들어 독립적으로 기능을 개발할 수 있다.
git branch 브랜치명
- 브랜치 전환: 현재 작업 중인 브랜치를 변경한다.
git checkout 브랜치명
- 브랜치 생성 및 이동: 브랜치를 생성하고 바로 이동한다.
git checkout -b 브랜치명
브랜치 실습 예시
- 새로운 기능을 개발하거나 버그를 수정할 때 새 브랜치를 만들어 작업하고, 완료되면 merge를 통해 주 브랜치에 반영하는 방식이다.
2. Merge와 충돌 해결
Merge는 하나의 브랜치를 다른 브랜치와 병합하는 과정이다. 일반적으로 기능 개발을 완료한 후 개발 브랜치를 main 브랜치에 병합할 때 사용된다.
- Fast-forward Merge는 두 브랜치의 내용이 충돌하지 않을 때 사용하는 방식으로, 하나의 브랜치가 다른 브랜치에 병합되면서 히스토리가 직선으로 이어진다.
- 3-Way Merge는 브랜치의 변경 내용이 서로 다를 때 사용되며, 여러 갈래로 나뉜 기록들을 하나로 합친다.
- 충돌(conflict) 해결: 서로 다른 브랜치에서 동일한 파일의 같은 부분을 수정하면 충돌이 발생할 수 있다. 충돌이 발생한 경우 Git에서 자동으로 해결하지 못하기 때문에 개발자가 직접 코드를 수정하여 해결해야 한다.
Merge 실습
- Merge 명령어:
git merge 브랜치명
- 충돌 해결: 충돌이 발생한 파일은 Git에서 자동으로 표시된다. 이 파일들을 수동으로 수정하고 저장 후, add와 commit을 통해 병합을 완료한다.
3. Rebase
Rebase는 브랜치의 히스토리를 변경하여 더 깔끔하게 유지하는 방법이다. 브랜치에서 진행된 커밋들을 다른 브랜치의 최신 커밋 뒤로 옮기면서 하나의 직선형 히스토리를 만들 수 있다.
- Rebase vs Merge: Merge는 브랜치 간의 히스토리를 유지하며 병합하지만, Rebase는 히스토리를 다시 작성해 마치 브랜치가 한 줄로 이어진 것처럼 만든다.
Rebase 실습
- 브랜치의 작업 내용을 다른 브랜치 위에 재배치할 때 사용한다.
git rebase 브랜치명
- 주의점: 이미 push한 커밋을 Rebase하는 경우, 팀원과 협업 시 혼란을 초래할 수 있으므로 신중하게 사용해야 한다.
4. Stash
Stash는 현재 작업 중인 내용을 임시로 저장해 두고 나중에 다시 적용할 수 있도록 하는 기능이다. 갑자기 다른 브랜치로 전환해야 할 때, 현재의 변경 사항을 커밋하지 않고 저장할 수 있다.
- Stash 저장: 현재의 변경 내용을 임시로 저장한다.
git stash
- Stash 불러오기: 임시로 저장해 둔 변경 사항을 다시 불러온다.
git stash apply
- Stash 목록 확인: 저장해둔 변경 사항의 목록을 확인한다.
git stash list
Stash 실습 예시
- 긴급하게 브랜치를 변경해야 할 때, 아직 완료되지 않은 작업을 stash로 임시 저장하고 다른 브랜치로 이동한 후, 다시 돌아와 apply를 통해 복원할 수 있다.
5. Remote와 Tracking Branch
Remote는 원격 저장소를 의미하며, 보통 GitHub, GitLab, Bitbucket 같은 서비스에 저장된 리포지토리를 가리킨다.
실습 예시
6. Git Reset
Git Reset은 로컬 저장소의 상태를 이전 커밋으로 되돌릴 때 사용한다. 이를 통해 특정 커밋 이후의 변경 사항을 취소할 수 있다.
- Soft Reset: 특정 커밋으로 돌아가지만, 변경 사항은 그대로 스테이징 영역에 남겨둔다.
git reset --soft HEAD~1
- Mixed Reset (기본 옵션): 특정 커밋으로 돌아가며, 변경 사항을 스테이징 영역에서 제거하지만 워킹 디렉토리에는 남겨둔다.
git reset --mixed HEAD~1
- Hard Reset: 특정 커밋으로 돌아가며, 변경 사항을 모두 삭제한다.
git reset --hard HEAD~1
Reset 실습 예시
- 실수로 잘못된 커밋을 했을 경우 해당 커밋을 취소하고 다시 작업을 이어나가고자 할 때 reset을 사용한다.
7. Git Log와 Diff
Git Log는 커밋 히스토리를 확인하는 명령어로, 현재 리포지토리의 모든 커밋 내역을 볼 수 있다.
- git log: 모든 커밋의 로그를 출력한다.
- git log --oneline: 간결하게 한 줄로 로그를 확인한다.
Git Diff는 변경 사항을 확인하는 명령어로, 파일이 어떻게 변경되었는지 비교할 수 있다.
- git diff: 현재 변경된 파일의 차이점을 확인한다.
- git diff 브랜치1 브랜치2: 두 브랜치 간의 차이점을 확인한다.
8. Git Tag
Tag는 특정 커밋을 가리키는 표시로, 보통 중요한 시점(예: 릴리즈 버전)을 나타내기 위해 사용된다.
- 태그 생성: 특정 커밋에 태그를 추가한다.
git tag 태그명
- 태그 푸시: 원격 저장소에 태그를 푸시한다.
git push origin 태그명
9. Git Flow
Git Flow는 Git을 이용한 브랜치 전략으로, 협업 프로젝트에서 브랜치를 효율적으로 관리하는 방법론이다. 일반적으로 다음과 같은 브랜치를 사용한다.
- master: 배포 가능한 코드만 존재하는 안정적인 브랜치.
- develop: 개발 중인 코드가 존재하며, 새로운 기능이 추가되고 테스트된다.
- feature: 새로운 기능을 개발하기 위한 브랜치로, 개발 완료 후 develop 브랜치에 병합된다.
- release: 배포 준비를 위한 브랜치.
- hotfix: 긴급한 버그 수정을 위한 브랜치로, master와 develop에 병합된다.
10. Git Alias
Git Alias는 자주 사용하는 Git 명령어를 별명으로 등록하여 더 간편하게 사용할 수 있게 한다. 예를 들어, git checkout을 git co로 간단하게 사용할 수 있다.
git config --global alias.co checkout
git config --global alias.br branch