본문 바로가기
  • RATEL.SHO
[Git]

[Git & GitHub의 실무 활용]

by ratelsho 2023. 5. 26.

협업의 목적 - 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
(저장소)
  • 파일이나 디렉토리를 저장하는 장소
  • local repository : 개인 PC에 존재하는 저장소.
  • remote repository : 원격 저장소. 파일을 원격 저장소 전용 서버에서 관리하고 공유가 가능하다.
git clone
  • remote repository의 내용을 통째로 다운로드 한다.
  • git clone repository addresss
git add
  • git add 작업 디렉토리(working directory) 의 변경 내용을 스테이징 영역(staging area)에 추가하기 위해서 사용하는 Git 명령어이다.
  • git add 명령어는 다음 변경(commit)을 기록할 때까지 변경분을 모아놓기 위해서 사용한다.
    따라서,  git commit 명령어를 통해 명시적으로 기록을 남기기 전까지는 아무리 git add 명령어를 많이 실행해도 Git 저장소의 변경 이력에는 어떤 영향도 주지 않는다.
  • git add <파일/디렉토리 경로>
    작업 디렉토리의 변경 내용의 일부만 스테이징 영역에 넘기고 싶을 때는 수정한 파일이나 디렉토리의 경로를 인자로 넘긴다.
  • git add .
    작업 디렉토리의 변경 내용의 일부만 스테이징 영역으로 넘기고 싶을때는 .을 인자로 넘긴다.
  • git add -A
    작업 디렉토리 내의 모든 변경 내용을 몽땅 스테이징 영역으로 넘기고 싶을 때는 -A 옵션을 사용한다
git status
  • git add 명령어를 사용할 때, 항상 함께 사용하게 되는 명령어가 git status 이다.
    git status 명령어는 작업 디렉토리(working directory)와 스테이징 영역(staging area)의 상태를 확인하기 위해서 사용한다.

  • Changes to be committed: 이 영역은 스테이징 영역에 넘어가 있는 변경 내용을 보여준다.
  • Changes not staged for commit: 이 영역은 아직 워킹 디렉토리에 있는 변경 내용을 보여준다.
  • Untracked files: 이 영역도 아직 워킹 디렉토리에 있는 아직 한 번도 해당 Git 저장소가 관리한 적이 없는 새로운 파일을 보여준다.
git commit
  • 파일 및 폴더의 추가/변경 사항들을 저장할 때 사용한다.
    git commit -m"커밋할 내용"
git push
  • commit한 내용 (head의 변경내용)을 remote repo(원격 저장소)에 올린다.
  •  local에서 변경한 내용을 원격 저장소로 업로드한다.
    git push <branch name>
git merge
  • branch의 변경사항을 다른 branch (예를 들어 feature와 develop)의 반영할 때 사용한다.
  • 현재 branch를 기준으로 병합된다.
  • 만약 두 branch가 같은 파일의 같은 곳을 수정하면 Conflict(충돌)이 발생한다.
    git merge <합칠 branch name>
get checkout
  • branch를 변경한다.
    git checkout <branch name>

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

 

 

 

출처 - https://haenny.tistory.com/338