[Git & GitHub의 실무 활용]
협업의 목적 - Silo 극복, 비즈니스 효율, 커뮤니케이션
팀구성
PM/PMO, 업무 기획, 개발/아키텍트, 디자인
관리 문서, 설계서, 소스코드, UI 가이드 관리
IT에서의 협업이란 -> 버전관리, 형상관리가 되어있어야 파이프라인을 통해서 git, GitHub로 관리가능
버전(형상)관리 - Source Configuration Management
- SDLC 상 코드 및 산출물의 체계적 관리 위해 가시성, 추적성, 무결성을 확보하는 품질보증 기법
버전관리 구성
기준선(Baseline) - Ex) 기능적 기준선, 설계 기준선 등
형상 항목(Configuration Item) - Ex) 문서, 소스코드
형상 버전(Configuration Version) - Ex) V1.2.3, _a
형상 제품(Configuration Product)
버전(형상) 관리 시스템(Version Control System)의 개념
버전관리 시스템이 갖춰야 할 요소 - 변경점 관리, 버전 관리, 백업 & 복구, 협업
버전(형상)관리 시스템 종류
1. 로컬 버전관리 시스템
- 서버 없이 로컬 컴퓨터 내에서 버전을 관리하는 시스템
- 단순한 개인적 프로젝트에 적합, 협업에서는 쓰기 힘듦
- SPOF에 취약하며, 내부 정보 관리가 중요
ex) RCS(Revision Control System) ..
2. 중앙집중식 버전관리시스템
- 다수 인원이 작업하는 경우 생기는 문제들을 해결하기 위해 개발된 도구로 서버에 최종본 한 벌이 존재하며 사용자들은 이 중 수정을 원하는 파일만 로컬에 받아 수정한 후 서버에 올리게 된다.
- 사용자 관리가 용이하며, 중앙의 VCS 하나만 관리하면 됨
-협업의 규모가 커지면 수정 충돌 문제 발생 가능
ex) Subversion(SVN), CVS ..
3. 분산 버전관리시스템
- 파일에 저장하는 서버가 있는 것은 중앙집중식과 동일하나 프로젝트에 관련된 저장소와 히스토리 전체가 로컬에 존재함
- 저장소와 히스토리를 전부 복제
- 서버에 문제가 생겨도 복구 가능, clone은 모든 데이터를 가짐
- 원격저장소가 존재, 다양한 그룹과 협업 가능
ex) Git, Mercurial
Git의 개념 - 2005년에 리누스 토르발스에 의해 개발된 분산 버전관리 시스템
Git의 장점
- 분산형: 인터넷 연결이 되지 않은 곳에서도 개발을 진행할 수 있으며, 분산 버전관리이기 때문에 중앙 저장소가 삭제되어도 원상복구 가능
- 대규모 프로젝트: 각각의 개발자가 Branch에서 개발한 뒤, 본 프로그램에 합치는 merge 방식을 통한 병렬 개발 기능
Git의 구조
Git 기본 용어
- Working Directory: 개발자의 현재 시점으로 소스코드를 수정하며 개발하는 공간을 의미
- Staging Area: Working Directory에서 작업한 파일을 Local Repository에 전달하기 위해 파일들을 분류하는 공간
- Local Repository: 로컬 저장소이며 작업한 파일들을 저장해두는 내부 저장소 (.git 폴더)
- Remote Repository: 원격 저장소이며 인터넷으로 연결되어 있어 있는 외부 저장소 (웹 페이지에서 보이는 공간)
- Branch: Remote Repository의 현재 상태를 복사하여 master 브랜치와 별개의 작업을 진행할 수 있는 공간 (보통 브랜치를 생성하여 개발을 진행하고 개발을 완료하면 master 브랜치에 병합하여 개발 완료된 소스코드를 합침)
- Head: 현재 작업중인 브랜치의 최근 커밋된 위치
- Index: Staging Area를 의미
Branch 종류 - master, develop, feature, release, hotfix
Git 기본 흐름 - 로컬 저장소 + Staging -> 원격저장소
로컬 저장소와 Staging을 Working Directory라고 부름
Git 기본 명령어
sungho@DESKTOP-3FNP38D MINGW64 ~
$ git --version
git version 2.39.1.windows.1
sungho@DESKTOP-3FNP38D MINGW64 ~
$ git config --global user.name "sungho" // User 생성
sungho@DESKTOP-3FNP38D MINGW64 ~
$ git config --global user.email ratel.sho@gmail.com
---
sungho@DESKTOP-3FNP38D MINGW64 ~
$ mkdir git_a
sungho@DESKTOP-3FNP38D MINGW64 ~
$ cd git_a
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a
$ git init //저장소 생성 명령어
Initialized empty Git repository in C:/Users/sungho/git_a/.git/
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git checkout master
error: pathspec 'master' did not match any file(s) known to git
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ vim hello.txt //text파일 생성 -> Esc -> shift + : -> wq
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git status // 상태확인
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git add hello.txt //staging으로 전송
warning: in the working copy of 'hello.txt', LF will be replaced by CRLF the next time Git touches it
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git commit // staging -> master commit할 때 text로 수정한 부분 기재
[master (root-commit) c2d6575] 2023-05-26 AM 11:40 MODIFY
1 file changed, 2 insertions(+)
create mode 100644 hello.txt
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git branch
* master
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git branch notfix //notfix라는 이름으로 브랜치 생성
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git branch
* master
notfix
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git checkout notfix //notfix 브렌치로 이동
Switched to branch 'notfix'
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (notfix)
$ ls
hello.txt
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (notfix)
$ vim hello.txt
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (notfix)
$ git checkout master
Switched to branch 'master'
M hello.txt
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ ls
hello.txt
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ cat hello.txt
sungho git
change
2 change
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git merge notfix //notfix Branch와 merge
Already up to date.
프로젝트 상황에서 자주 발생하는 충돌 해결 -> 충돌 내용 확인 후 수정하고, 커밋하여 충돌 해결
용어 | 내용 |
Repository (저장소) |
|
git clone |
|
git add |
|
git status |
|
git commit |
|
git push |
|
git merge |
|
get checkout |
|
GitHub
- 분산 버전 관리 툴인 Git 저장소 호스팅을 지원하는 웹서비스로 영리 목적 서비스와 오픈소스를 위한 무상 서비스를 모두 제공(2019년부터 private 소스들도 무료 업로드 가능)
GitHub의 특징 (오픈소스 성지, 자체 Git 서버보다 GitHub 선호 추세)
- GUI: Git이 텍스트 명령어 입력 방식인데 반해, GitHub는 GUI를 제공
- 오픈 소스 기여, 소스 제공 편의
GItHub 용어
- Fork : 다른 사람이 저장소를 복사하는 기능
- Pull Request : 포크한 저장소를 수정해 원본 저장소에 병합해달라는 요청을 보내 사용자 사이의 상호작용을 일어나게 하는 기능
- Issues : 저장소 안에서 사용자들 사이의 문제를 논의하는 기능
- Wiki : 저장소에 관련된 체계적인 기록을 남기는 기능
GitHub 특징
Git과의 상호작용
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master) //github 저장소에 있는 소스코드
$ git clone https://github.com/sun9ho/GitTest.git
Cloning into 'GitTest'...
warning: You appear to have cloned an empty repository.
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git remote -v // git remote 연결
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master) //저장소 추가
$ git remote add remotesho https://github.com/sun9ho/test2.git
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git remote -v
remotesho https://github.com/sun9ho/test2.git (fetch)
remotesho https://github.com/sun9ho/test2.git (push)
sungho@DESKTOP-3FNP38D MINGW64 ~/git_a (master)
$ git push remotesho --all //만든 remote에 push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 245 bytes | 245.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/sun9ho/test2.git
* [new branch] master -> master
* [new branch] notfix -> notfix