Git, Github
git은 분산 버전 관리 시스템(Version Control System)이다. git을 사용하면 동료들과 협업하기가 매우 수월해지고 버전을 관리하는데 용이하다
git을 사용하기 전에 설정을 하고 보다 정확하고 편리하게 사용하자!
git config --global user.name "name"
git config --global user.email "email"
git config --global core.pager "cat"
git config --global core.editor "vim"
git config --list
로 제대로 설정이 되었는지 확인하기
user.email=gghkdu2@gmail.com
user.name=JJongBin
core.editor=vim
core.pager=cat
config를 수정한 부분이 정상적으로 수정되었는지 확인한다!
▶️ 정방향으로 git을 사용하는 방법
1. git init
사용자가 remote repository까지 밀어넣는법은 다음과 같다
git init
: 현재 폴더를 git을 사용할 수 있도록 만든다git branch -M main
: git의 branch가 master에서 main으로 변경되었기 때문에 branch를 main으로 변경한다git remote add [alias] [repository 주소]
: 사용자의 git 저장소와 연결시켜준다- 파일을 작업한 후에
git add [file-name]
으로 stage에 파일을 올려준다 git commit
: local repository로 stage에 있는 파일을 commit message와 함께 올려준다git push origin main
: remote repository로 commit 된 내역들을 밀어넣는다 이때 만약 commit이 처음 이라면 싱크를 맞춰주기 위해-u
flag를 사용한다
2. clone
git페이지에서 저장소를 생성한 후에 주소를 복사하고 다음의 명령어를 입력한다
git clone [repository주소]
이하 과정은 remote 이후의 과정과 동일하다!
- 참고
추가적으로 권장하지 않는 사항이 있다
git add .
: 모든 파일들이 모두 stage로 올라가기 때문에 관리 측면에서 어렵고 꼬일 수 있는 경우가 많다git commit -m ""
: 간단하게 vi를 이용하지 않고 commit message를 작성할 수 있는 방법이지만 여러줄을 이용해서 제목, 내용을 commit message로 작성하는 것을 권장하고, 여러줄을 작성할때 -m을 사용한 commit은 이전줄의 수정이 어렵기 때문에 처음부터 다시 해야될 수 있다
▶️ commit 작성 요령
- 영어로 commit message를 작성한다
- commit 제목만 보고도 작업의 유형을 유추할 수 있도록 적어주는 것이 좋다
- 작업단위가 다른 경우에는 commit을 따로 해줘야한다
- commit의 제목은 40자를 넘기지 않도록 한다
- 제목과 내용 사이에는 한줄의 공간을 준다
commit message의 첫 부분에 type을 명시하는 것이 좋다고 하는데 어떤 작업을 했는지 유추할 수 있기 때문이다 type은 다음과 같이 정해져있다
type | 설명 |
---|---|
feat | 새로운 기능에 대한 커밋 |
fix | 버그 수정에 대한 커밋 |
build | 빌드 관련 파일 수정에 대한 커밋 |
chore | 그 외 자잘한 수정에 대한 커밋 |
ci | CI관련 설정 수정에 대한 커밋 |
docs | 문서 수정에 대한 커밋 |
style | 코드 스타일 혹은 포맷 등에 관한 커밋 |
refactor | 코드 리팩토링에 대한 커밋 |
test | 테스트 코드 수정에 대한 커밋 |
▶️ commit 시 주의 사항
- 동작하는 최소단위로 커밋한다 -> 동작한다는 것을 전제로 하고 있기 때문에
- 영어를 사용해서 commit message를 작성한다
- 제목은 축약, 내용은 문장형으로 작성한다
- 내용에서는 제목에서 작성하지 못한 세부적인 부분을 작성한다
▶️ README.md
프로젝트와 저장소를 설명하는 문서로 repository를 보는 다른 사람들을 위한 표지의 역할을 한다
▶️ .gitignire
.gitignore는 git에 올리지 않도록 하는 역할을 한다. 폴더나 파일명을 적어주면 된다
쉽게 작성할 수 있는 사이트: https://gitignore.io
▶️ LICENSE
많이 사용되는 라이센스는 다음과 같다
- MIT License: 오픈소스로 자유롭게 사용
- Apache License2.0: 무료로 사용해도 되지만 소유권을 주장할 수 있다
- GNU General Public License v3.0: 해당 코드를 참조하면 GNU가 됨 -> 의무적(MIT로 풀 수 없다)
만약 무엇이든 가져다 사용하는 경우가 있는 경우 라이센스를 확인해야한다 (라이센스가 보이지 않아도 메일을 보내는 등 꼭! 확인해봐야 한다)
▶️ branch
git은 동일한 코드를 다른 동료들과 함께 공유하고 다룰 수 있는데 branch라는 개념이 있기 때문이다 branch는 가지라는 뜻으로 현재 줄기에서 가지를 새로 뻗는다고 생각하면 된다
현재 git은 main branch를 사용한다 이 main에서 새로운 branch를 생성하여(branch를 친다라고 한다) 수정하고 merge해서 main에 반영할 수 있다
git branch [branch-name]
으로 새로운 branch를 생성한다- 아직 현재 branch는 main이므로 새로운 branch로 이동해줘야 한다 →
git switch [branch-name]
orgit checkout [branch-name]
만약 새로운 branch에서 파일을 수정하고 merge하기전에 기존의 main에서 수정한 파일이 수정되어 있다면 무언가 잘못된 것이다 → 각각의 branch에서 작업한 내용은 merge하기전에 반영되지 않는다
▶️ merge
별도의 branch에서 파일을 작성하거나, 수정하고 기존의 branch로 반영하기 위해서는 git merge [branch-name]
라는 명령어를 이용한다
기존의 branch에서 별도의 branch에서 수정한 파일을 동시에 수정하지 않았다면 그냥 병합된다
하지만 동시에 똑같은 파일을 수정했을 경우를 충돌했다고 하는데 협의 후 진행하도록 기존 branch의 파일 내용과 별도 branch의 파일 내용이 같이 존재하는 파일이 생성된다
test.py파일을 생성하고, 새로운 branch를 만들어서 테스트해봤다
- main branch test.py
print("This is main branch!!!")
- stem branch test.py
print("This is stem branch!")
git merge stem
을 한 결과 다음과 같은 메세지를 볼 수 있었다
Auto-merging test.py
CONFLICT (content): Merge conflict in test.py
Automatic merge failed; fix conflicts and then commit the result.
merging이라는 메세지를 보니 merge가 아직 진행중이며 완료되지 않았음을 알 수 있었다
main의 test.py를 보면 다음과 같다
<<<<<<< HEAD
print("This is main branch!!!")
=======
print("This is stem branch!")
>>>>>>> stem
두 파일이 합쳐져있었다 여기서 협의를 해서 최종적인 코드를 작성하면 된다
print("This is main branch but stem plused main branch!")
이후 add, commit , push 해주면 정상적으로 remote repository에 반영이 된다
▶️ git flow
git을 이용해 여러명이 개발을 할때 거의 표준처럼 사용되는 방법이다
git flow에서는 branch를 5가지를 사용한다
branch | 설명 |
---|---|
main | 기준이 되는 브랜치로 제품을 배포하는 브랜치 |
develop | 개발 브랜치로 개발자들이 이 브랜치를 기준으로 각자 작업한 기능들을 합친다 |
feature | 단위 기능을 개발하는 브랜치로 기능 개발이 완료되면 develop 브랜치에 합친다 |
release | 배포를 위해 main 브랜치로 보내기 전에 먼저 검사 하기위한 브랜치 |
hotfix | main 브랜치로 배포를 했는데 버그가 생겼을 떄 긴급 수정하는 브랜치 |
git flow를 하기 위해서는 준비가 필요하다
macos의 경우 다음의 명령어를 이용해서 git-flow를 다운받는다(brew를 이용하므로 brew 필요!)
brew install git-flow-avh
window의 경우 git bash를 이용하는 경우 받지 않아도 된다
참고 https://danielkummer.github.io/git-flow-cheatsheet/index.ko_KR.html
- feature
feature는 개발하기 위한 branch이다
Git flow feature start [branch 이름] // branch를 생성하고 해당 branch로 이동
Git flow feature finish [branch 이름] // branch를 종료하고 원래 branch로 이동
기존에는 branch를 생성하고 switch를 이용해서 이동까지 해야하지만 자동으로 해준다
이렇게 생성된 branch는 feature/입력한 branch이름
이 된다
만약 잘못 생성한 경우 main branch로 이동한 후 해당 branch를 삭제해주면 된다 (git branch -D [branch-name]
)
- release
relaese는 main으로 반영하기 전에 검사를 할 수 있는 branch이다
Git flow release start [버전]
Git flow release finish [버전]
finish를 하게 되면 세번의 vi을 마주하게 된다 첫번째는 main, 두번째는 release note(tag) 세번째는 develop에 반영이 되는 commit이다
이후 각각 main, develop, tag에 push를 해주면 된다
git push origin main
git push origin develop
git push --tag
# 버전의 표현
버전은 보통 v0.0.0 처럼 표현한다 만약 다음과 같이 세자리로 구성되어 있다면
Release Number . Major Number . Minor Number
- Release Number: 1로 시작해서 큰 변화가 발생했을 때 이 수치를 올린다
- Major Number: 0으로 시작해서 주요 기능의 추가나 변경 등 사용상 혹은 컨텐츠의 주요 변화가 발생했을 때 1 또는 무작위로 증가한다. 간혹 알파벳이 붙기도 하는데 예를 들어 Beta(테스트버전)의 경우 b를 숫자 뒤에 붙이는 경향이 있다.
- Minor Number: 0으로 시작해서 버그 수정 등 미미한 변화가 발생하면 1씩 혹은 무작위로 증가한다. 역시 개발사 정책에 따라 특정 알파벳이 붙을 수도 있다.