1. Git 소개
Git은 전세계에서 가장 많이 사용되는 버전 관리 시스템입니다. 파일의 변화를 시간에 따라 기록하게 해주어 여러명의 사용자가 동시에 작업하는 과정에서 발생할 수 있는 문제를 효과적으로 관리합니다.
Git의 기본 명령어
$ git init
위 코드는 git 저장소를 초기화합니다. 이 명령어를 실행하면 ‘.git’ 이름의 숨김 폴더가 생성되고, 여기에 git의 데이터가 저장됩니다. 이 명령은 프로젝트의 루트 디렉토리에서 실행해야 합니다.
$ git add .
‘git add .’ 명령어는 현재 디렉토리의 모든 파일과 디렉토리를 git의 관리하에 둡니다. 이 명령이 실행되면 변경사항들이 Staging Area라는 곳에 저장됩니다.
$ git commit -m "Commit message"
‘git commit’ 명령은 staging area에 있는 모든 파일들의 스냅샷을 캡처합니다. ‘-m’ 옵션은 커밋 메세지를 지정하는데 사용됩니다.
2. Git의 기본 구조
Git의 핵심 구성 요소는 저장소(Repository), 커밋(Commit), 그리고 브랜치(Branch)가 있습니다.
2.1 저장소(Repository)
Git 저장소는 파일이나 폴더를 변경 내역을 추적하고, 이력을 저장하는 공간입니다. 간단하게 파일이나 폴더를 git 저장소로 만들기 위해서는 ‘git init’ 명령어를 사용합니다.
$ git init
2.2 커밋(Commit)
커밋은 파일 또는 폴더의 변경사항을 저장하는 git의 개념입니다. 각 커밋은 해당 시점에 대한 프로젝트의 스냅샷으로, 이전 모든 커밋과 관련 혹은 비교될 수 있습니다.
$ git commit -m "Description of commit"
2.3 브랜치(Branch)
Git의 브랜치는 특정 커밋에 대한 참조(Reference)입니다. 브랜치를 사용하면 여러 작업을 독립적으로 진행할 수 있으므로 동시 다발적인 개발이 가능합니다.
$ git branch branch_name
$ git checkout branch_name
위의 명령어는 새로운 브랜치를 생성하고 그 브랜치로 이동하는 데 사용됩니다.
3. Git 설치와 환경 설정
Git을 사용하기 위해서는 먼저 시스템에 Git을 설치해야 합니다. 가장 간단한 방법은 공식 Git 웹사이트(https://git-scm.com/downloads)에서 적절한 운영체제 버전의 Git을 다운로드하고 설치하는 것입니다.
$ git --version
위 명령어는 Git이 성공적으로 설치되었는지 확인하는데 사용됩니다. 출력된 버전 정보를 통해 현재 설치된 Git의 버전을 확인할 수 있습니다.
환경 설정
Git을 처음 설치했다면 사용자 정보를 설정해야 합니다. 이 정보는 커밋할 때 사용자 이름과 이메일 주소에 사용되며, 다음과 같이 설정할 수 있습니다.
$ git config --global user.name "Your Name"
$ git config --global user.email "your@email.com"
각각의 명령어는 Git의 사용자 이름과 이메일을 설정하는데 사용됩니다. 이 정보는 Git의 커밋 로그에 올바르게 기록되기 위해 필요합니다.
4. Git 기본 명령어
4.1 git init
‘git init’ 명령어는 새로운 git 저장소를 초기화하는 데 사용됩니다. 이 명령어를 실행하면 현재 디렉터리에 “.git”이라는 숨겨진 폴더가 생성되며, 이 폴더에는 공통 로그, 설정 파일 등이 저장됩니다.
$ git init
4.2 git add
‘git add’ 명령어는 작업 디렉터리의 변경 내용을 인덱싱하는 데 사용됩니다. 이 명령어를 사용해 변경사항을 인덱스에 추가한 후 ‘git commit’ 명령어를 사용해 저장소에 커밋할 수 있습니다. 아래의 명령어는 모든 변경사항을 인덱싱합니다.
$ git add .
4.3 git commit
‘git commit’ 명령어는 인덱스의 현재 상태를 기반으로 새로운 커밋을 생성합니다. ‘-m’ 옵션 다음에 따옴표 안에 커밋 메시지를 적어서 커밋에 대한 설명을 추가할 수 있습니다.
$ git commit -m "commit message"
5. 브랜칭과 병합(merge)
Git의 브랜칭은 동일한 소스 코드에 대해 다른 작업을 동시에 수행할 수 있는 효과적인 기능입니다. 브랜치를 만들면 원본 코드와 독립적으로 코드를 수정하고 실험할 수 있습니다.
브랜칭
새로운 브랜치를 생성하는 것은 ‘git branch’ 명령어를 사용하여 수행됩니다. 아래의 명령어는 새 브랜치를 생성하며 ‘branch-name’은 원하는 브랜치 이름입니다.
$ git branch branch-name
브랜치를 전환하는 데는 ‘git checkout’ 명령어를 사용하고 ‘branch-name’은 전환하려는 브랜치의 이름입니다.
$ git checkout branch-name
병합(merge)
브랜치에서 작업을 완료하였다면, 그 변경사항을 메인 브랜치로 병합할 수 있습니다. 병합은 ‘git merge’ 명령어를 사용하여 수행됩니다.
아래의 명령어는 ‘branch-name’ 브랜치를 현재 작업 중인 브랜치로 병합하는 것이며 ‘branch-name’은 병합하려는 브랜치의 이름입니다.
$ git merge branch-name
이렇게 하면 브랜치에서의 모든 변경사항이 현재 브랜치에 적용됩니다.
6. 원격 저장소
6.1 GitHub 소개
GitHub는 Git을 사용하여 소스 코드를 관리하는 웹 기반 호스팅 서비스입니다. 이는 개발자들이 공동으로 코드를 작성하고 수정할 수 있는 중심 장소를 제공하며, 프로젝트가 커짐에 따라 필요한 다양한 도구를 사용할 수 있게 해줍니다.
6.2 원격 저장소 연동
‘git remote add’ 명령어를 사용하면 원격 저장소를 연동할 수 있습니다.
$ git remote add origin {repository URL}
이 명령어에서 ‘origin’은 원격 저장소의 별칭이며, {repository URL} 부분은 연결하려는 원격 저장소의 URL을 입력해야 합니다.
‘git push’ 명령어를 사용하면 로컬의 커밋 내역을 원격 저장소에 업로드할 수 있습니다.
$ git push origin master
이 명령어에서 ‘origin’은 원격 저장소의 별칭이며, ‘master’는 원격에 푸시하려는 브랜치의 이름입니다.
7. Git 협업 전략
Git을 이용한 협업에는 크게 두 가지 전략이 있습니다. 중앙 집중식 협업 방식과 분산형 협업 방식입니다.
7.1 중앙 집중식 협업
중앙 집중식 협업은 한 명의 개발자가 ‘master’ 브랜치에서 작업을 하고, 그 변경사항을 바로 ‘master’ 브랜치에 커밋하는 방식입니다.
$ git checkout master
$ git pull origin master
이 방식의 단점은 ‘master’ 브랜치가 언제든지 변경될 수 있고, 브랜치에서의 작업이 다른 사람의 작업에 의해 쉽게 덮어쓰여질 수 있다는 점입니다.
7.2 분산형 협업
반면에 분산형 협업은 각 개발자가 자신만의 브랜치에서 작업을 하고, 그 작업이 끝나면 ‘master’ 브랜치로 병합하는 방식입니다.
$ git checkout -b feature-branch
$ git push origin feature-branch
이 방식의 장점은 작업 중인 코드가 ‘master’ 브랜치에 영향을 주지 않으며, 최종적으로 안정적인 코드만 ‘master’ 브랜치로 병합되는 것을 보장한다는 점입니다.
8. Pull Request와 코드 리뷰
Pull Request(이하 PR)는 개발자가 자신이 작성한 코드를 병합하길 요청하는 것을 말합니다. 이는 다른 개발자들이 그 코드를 검토하고, 가능하다면 병합하도록 요청하는 것인데 이를 통해 코드의 안정성을 유지하고 서로의 코드를 이해하는 데 도움이 됩니다.
$ git checkout -b feature-branch
$ git push origin feature-branch
위 코드에서 ‘feature-branch’라는 별도의 브랜치를 생성하여 이곳에서 작업을 진행합니다. 작업이 완료되면 Github에서 “Pull Request”를 생성하게 됩니다.
PR이 생성되면 이제 다른 팀원들이 코드 리뷰를 진행합니다. 코드 리뷰는 PR에 대해 다른 개발자들이 자신의 의견을 제시하고, 필요하다면 수정을 요청하는 상호작용 과정입니다. 코드 리뷰를 통해 코드의 질을 보장하고, 여러 가지 문제를 사전에 방지할 수 있습니다.
PR이 충분히 검토되고 수정 사항이 반영되면, 마지막으로 ‘merge’ 버튼을 눌러 main 브랜치와 합칩니다. 이 과정에서 충돌이 발생한다면, 해당 충돌을 해결한 후에 병합을 진행하게 됩니다.
9. Git의 활용 사례
Git은 몇 가지 유용한 기능들을 통해 다양한 활용 사례를 제공합니다.
오류 수정
Git의 가장 강력한 도구 중 하나는 ‘git bisect’라는 명령어입니다. 이 명령어는 오류를 추적하고 해당 오류를 해결하는 데 유용하게 사용됩니다.
$ git bisect start
$ git bisect bad
$ git bisect good v1.0
이 명령은 코드에 오류가 생긴 시점을 찾아줍니다. ‘good’과 ‘bad’로 표시된 커밋 사이에서 이분법을 사용하여 오류가 발생한 시점을 찾습니다.
코드 이력 관리
Git의 주요 기능 중 하나는 프로젝트의 전체 이력을 관리하는 것입니다. ‘git log’ 명령어를 사용하면 전체 커밋 이력을 확인할 수 있으며, 특정 파일에 대한 변화만을 볼 수 있습니다.
$ git log
$ git log --oneline
$ git log -- file-name
이 명령어를 통해 특정 시점의 코드 상태를 확인하거나, 언제 누가 어떤 변화를 주었는지를 쉽게 파악할 수 있습니다.
10. Git의 Best Practice와 Tip
Best Practice
1. 명확한 커밋 메시지 작성: 커밋 메시지는 코드 변경에 대한 명확한 의도를 전달해야 합니다. 이 통해 다른 개발자들이 변경사항을 쉽게 이해할 수 있습니다.
$ git commit -m "Add user login feature"
2. 한 번에 하나의 기능만 개발: 가능한 한 한 번의 커밋에는 하나의 기능만을 포함해야 합니다. 이는 코드 리뷰를 할 때, 개별 기능을 이해하기 쉽게 만들어줍니다.
3. 정기적인 코드 푸시: 자주 코드를 푸시함으로써 소실되는 작업을 방지하고, 다른 팀원들과 코드 상태를 최신으로 유지할 수 있습니다.
$ git push origin branch-name
Tips
1. Git Alias 설정: 자주 사용하는 git 명령어에 대해 alias를 설정하면 매번 긴 명령어를 입력할 필요가 없게 됩니다.
$ git config --global alias.ci commit
$ git config --global alias.st status
2. .gitignore 파일 활용: .gitignore 파일을 설정함으로써, git이 관리해야 할 파일과 그렇지 않은 파일을 명확하게 구분할 수 있습니다.