아래 글은 'いまさらだけどGitを基本から分かりやすくまとめてみた'을 번역하여 정리한 글입니다.
출처: https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0
Git이란?
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
-https://git-scm.com/
- 소스코드 등을 관리할 수 있는 분산형 버전 관리 시스템
- github, gitlab, gitbucket, bitbucket 등 git을 이용한 서비스가 다수 존재
- 로컬에 리모트 repository의 복제해 여러 명이 각각의 로컬에서 자유롭게 파일의 편집이나 로컬 커밋이 가능하다는 것이 특징
Clone
- 리모트 repository를 로컬에 다운로드
- 리모트 branch 상에 복수의 브랜치가 존재하는 경우는 모든 브랜치를 일괄 다운로드
- 리모트 Repository의 URL은 아래 화면처럼 웹 화면에서 취득 가능
$ git clone <취득한 URL>
Branch
- 브랜치는 작업이력의 가지를 나눠서 기록해주는 역할
- 브랜치 상의 변경은 통합(merge)될 때 까지 다른 브랜치에 영향을 끼치지 않고, 받지도 않음
Branch model
- 브랜치 모델은 브랜치를 어떻게 운용할 것인가에 대한 것
- git-flow와 github flow가 일반적으로 유명
git-flow model
- 세세하게 브랜치를 나눈 엄격한 운용 모델
- 브랜치는 master, develop, release, feature, hotfix, support 6개로 운용
1. master branch
- 배포 가능한 퀄리티를 보증하는 브랜치
- release 브랜치로 부터 머지되어 갱신
- master 브랜치 상의 직접 작업한다거나 커밋하는 것은 NG
- tag는 master 브랜치상에서만 존재
참고: tag
2. develop 브랜치
- 개발의 주축이 되는 브랜치
- master 브랜치로 부터 파생
- master 브랜치와 마찬가지로 develop 브랜치 상의 직접 작업한다거나 커밋하는 것은 NG
- develop 브랜치로 부터 feature 브랜치나 release 브랜치를 만듦
3. feature 브랜치
- 기능 추가 또는 수정작업을 하기 위한 브랜치
- develop 브랜치로부터 파생
- 작업 완료하고 리뷰가 통과되면 develop 브랜치에 머지(merge)
- 어떤 작업이 이루어진 브랜치인지 한 눈에 알 수 있도록 브랜치 이름을 작명
- 머지되면 해당 feature 브랜치는 삭제
4. hotifx 브랜치
- 배포가 끝난 것을 긴급 수정하기 위한 용도의 브랜치
- master 브랜치로 부터 파생
- 수정작업 완료 후에는 master 브랜치와 develop 브랜치에 머지
- master 브랜치에 머지할 때의 커밋은 배포할 때의 태그를 사용
- 머지된 hotfix 브랜치는 삭제
5. support 브랜치
- 구 버전을 서포트하기 위한 브랜치
- 필수는 아니지만 구 버전을 서포트하는 필요가 있는 경우에는 master 브랜치의 tag로부터 support 브랜치를 파생
- 구 버전에서 버그가 발생한 경우에는 support 브랜치 상의 직업 디버깅 작업을 하고 커밋 실시
- 버그가 과거의 여러 버전에 걸쳐있는 경우에는 수정 커밋은 대상의 모든 버전의 support 브랜치에 cherry-pick 실시
- 서포트가 완료되면 해당 support 브랜치는 삭제
참고: cherry-pick
github flow model
- 간략화 된 브랜치 운용 모델
- master, topic 2개의 브랜치로 운용
1. master 브랜치
- 배포 가능한 퀄리티를 보증하는 브랜치
- git-flow 모델에서의 master + develop
- master 브랜치상에서 직접 작업을 하거나 커밋하는 것은 NG
- 배포 작업은 master 브랜치 상에서 실시
- release 브랜치는 사용 x
2. topic 브랜치
- 기능 추가나 버그 수정을 하는 브랜치
- 파일 편집작업은 여기에서 실시
- master 브랜치로 부터 가지가 나뉘어 지는 유일한 브랜치
- git-flow 모델에서의 feature + hotfix
- master 브랜치에 머지된 topic 브랜치는 삭제
브랜치(branch) 생성/조회
브랜치 생성
$ git branch study
브랜치 조회
$ git branch
* master
study
브랜치 변경(이동)
$ git checkout study
Switched to branch 'study'
$ git branch
master
* study
브랜치 생성 + 변경(이동)
- 신규 브랜치의 생성과 변경(이동)을 동시에 실시
$ git checkout -b study2
Switched to a new branch 'study2'
$ git branch
master
study
* study2
브랜치 이름 변경
$ git branch -m study2 study3
$ git branch
master
study
* study3
브랜치 삭제
$ git branch
* master
study
study3
$ git branch -d study3
Deleted branch study3 (was b1eca08).
$ git branch
* master
study
Remote repository
Remote repository 조회
$ git remote
origin
Remote repository 조회(URL 표시)
$ git remote -v
origin http://XXXXX (fetch)
origin http://XXXXX (push)
Remote repository 추가
$ git remote add sample_remote https://XXXXX
$ git remote -v
origin http://XXXXX (fetch)
origin http://XXXXX (push)
sample_remote https://XXXXX (fetch)
sample_remote https://XXXXX (push)
Remote repository 삭제
$ git remote rm sample_remote
$ git remote -v
origin http://XXXXX (fetch)
origin http://XXXXX (push)
Working directory에서 remote repository까지의 흐름
- Working directory
- 파일을 편집하는 장소
- 여기에서 파일의 편집, 추가, 삭제 등 실시
- Staging area
- 커밋하기 위해 파일을 기록하는 곳
- Working directory에서 편집한 파일은 add 명령어로 Staging area에 이동
- Local repository
- remote repository에 업로드하기 위해 커밋(commit) 이력과 파일을 기록하는 곳
- Staging area 상의 파일을 commit 명령어로 local repo에 커밋 실시
- Remote repository
- 복수의 사람이 공유하는 곳
- 로컬에서 커밋한 파일을 push 명령어로 Remote repository에 업로드
git status
$ git status
git add
- working director 상의 편집, 추가한 파일을 Stage area에 추가
$ touch study.txt
$ git add study.txt
$ git status
On branch sample
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: study.txt
git commit
- 보통 git commit -m "커밋 내용"의 형태로 CLI에서 실시
- commit message를 적는 방법은 팀에 따라 상이
$ git commit -m "Add study.txt"
[sample a8a060c] [add]refs
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 study.txt
참고자료: 좋은 git commit 메시지를 위한 영어 사전
git push
- local repo의 브랜치를 remote repo에 업로드
- git push -f 옵션으로 강제 push도 가능 (rebase 후에는 -f 옵션 필요)
$ git branch
master
* study
$ git push origin study
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 512 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2)
remote: Updating references: 100% (1/1)
To http://XXXXX
* [new branch] study -> study
추가적인 학습을 위한 참고자료
- https://git-scm.com/docs
- https://git-scm.com/book/ko/v2
- https://opentutorials.org/module/3963/24442
- https://www.holaxprogramming.com/2018/11/01/git-commands/