# git [git](https://git-scm.com/)은 소스 코드나 문서와 같은 파일의 변경 이력을 체계적으로 관리하는 **버전 관리 시스템(version control system, VCS)** 입니다. 코드의 변경 사항을 체계적으로 기록하고 관리할 수 있으며, 여러 명이 동시에 하나의 프로젝트를 효율적으로 관리하고 협업할 수 있게 돕습니다. 여기서는 git에 대한 모든걸 다루진 않고, [BlueBase](../index.md) 프로젝트에서 필요한것 위주로만 다룹니다. git에 대한 전반적인 이해는 다음의 링크를 참고해주세요: * [Git Book 공식 문서](https://git-scm.com/book/ko/v2) * [git - 간편 안내서 - 어렵지 않아요!](https://rogerdudler.github.io/git-guide/index.ko.html) ## 주요 기능 * 버전 관리: 코드의 변경 이력을 체계적으로 기록. * 협업 관리: 여러 사람이 동시에 하나의 프로젝트에서 독립적으로 작업 가능. * 변경 사항 병합: 다양한 브랜치에서 이루어진 작업을 하나로 결합(merge). * 원격 저장소: [GitHub](https://github.com/), [GitLab](https://gitlab.com/)과 같은 서버에 코드를 저장 및 공유. ## 핵심 개념 * repository: 파일 변경 이력을 저장하는 프로젝트의 메인 저장 공간. * commit: 특정 시점에서 변경된 내용을 저장하는 단위. 모든 commit은 고유한 id를 가지며 변경 이력을 추적할 수 있음. * branch: repository 내에서 독립적인 개발 흐름을 의미하며, 기본적으로 main branch에서 파생하여 작업함. * merge: 서로 다른 branch의 작업 내용을 하나로 합치는 과정. * remote: 로컬에서 관리하는 repository를 원격 서버에 연결하여 저장, 관리, 공유할 수 있는 공간. 또다른 중요한 개념인 rebase에 대해서는 차차 알게될 것입니다. ## 사용법 예시 ### 1. repository 초기화 프로젝트 폴더를 git repository로써 관리하게끔 합니다. 예: 프로젝트 `myrepository` ```bash # 폴더 생성 mkdir myrepository # 폴더로 이동 cd myrepository # git 초기화 git init ``` 혹은, 원격에 있는 repository를 내 로컬 환경에 가져옵니다. 예: GitHub의 `yourgithubid` 라는 계정에 있는 `myrepository` ```bash # 로컬에 복사 git clone https://github.com/yourgithubid/myrepository.git # 폴더로 이동 (git 초기화가 되어있음) cd myrepository ``` git repository로써 관리되는 폴더는 `.git`이라는 폴더가 내부에 있습니다. 여기에서 다양한 repository 정보를 확인할 수 있습니다: ```bash # 내용물 확인 cat .git/config ``` ### 2. 개발용 branch로 이동 기본적인 branch는 `main`입니다. 보통 개발 과정에서는 `dev`와 같은 새로운 branch를 만들어서 작업을 하고, 한 단위 작업이 끝나면 `main`에 merge하는 방식으로 개발을 합니다. 원격 저장소에 `dev가 있을경우: ```bash # `dev` branch를 origin(remote)에서 가져오면서 만듦 git checkout -b dev origin/dev ``` 원격에 없고 로컬에서 새로운 branch를 만들고 싶을때: ```bash # `dev` branch 생성 git branch dev # 현재 작업 branch를 `dev` branch로 변경 git switch dev ``` ### 3. 파일 수정 이제 원하는대로 파일을 수정하거나, 추가하거나, 삭제합니다. 예시로 `temp.txt`라는 파일을 만들어보겠습니다. ```bash # 새로운 파일 생성 touch temp.txt ``` ### 4. 변경 사항 추가 위에서 작업한 변경 사항을 git이 추적할 수 있도록 추가합니다. 이를 "stage에 올린다"라고 합니다. ```bash # 해당 변경 사항만 추가 git add temp.txt ``` 모든 변경 사항을 한번에 추가하려면 다음과 같이 하면 됩니다: ```bash # 모든 변경 사항을 추가 git add . ``` 이러면 파일이 삭제된 경우에도 (보통 `git rm`을 사용) 알아서 변경 사항으로 넣어줍니다. ### 5. 변경 사항 저장 위에서 추가한 변경 사항들을 하나의 변경 사항 단위인 commit으로 만듭니다. 이를 "commit 한다"라고 합니다. 이때 메시지를 같이 남길 수 있는데, 알아볼 수 있도록 적절하게 써주는게 좋습니다. ```bash # 메시지와 함께 commit git commit -m "temp.txt 파일 추가" ``` 그럼 이제 `dev` branch 기준으로는 commit이 하나 생겼습니다. 이를 확인하려면 log 기능을 사용하면 됩니다: ```bash # commit 기록 확인 git log ``` ### 6. branch 병합 이제 `dev` branch에서 작업한 내용을 `main` branch에 병합합니다. 이를 "merge 한다"라고 합니다. ```bash # 현재 작업 branch를 `main` branch로 변경 git switch main # 현재 작업 branch에 `dev` branch를 병합 git merge dev ``` ### 7. 원격 저장소에 반영 로컬에서 작업이 끝났으면 이제 원격 저장소에 업로드 합니다. 이를 "push 한다"라고 합니다. ```bash # origin(remote)의 `main` branch에 commit들을 업로드 git push origin main ``` ### 8. 요약 ```bash # 로컬에 복사 git clone https://github.com/yourgithubid/myrepository.git # 폴더로 이동 (git 초기화가 되어있음) cd myrepository # `dev` branch를 origin(remote)에서 가져오면서 만듦 git checkout -b dev origin/dev # `dev` branch 생성 git branch dev # 현재 작업 branch를 `dev` branch로 변경 git switch dev # 새로운 파일 생성 touch temp.txt # 해당 변경 사항만 추가 git add temp.txt # 메시지와 함께 commit git commit -m "temp.txt 파일 추가" # 현재 작업 branch를 `main` branch로 변경 git switch main # 현재 작업 branch에 `dev` branch를 병합 git merge dev # origin(remote)의 `main` branch에 commit들을 업로드 git push origin main ```