티스토리 뷰

Git & Github

[개발공부] Git과 GitHub의 개념

kr98gyeongim 2022. 4. 6. 18:01

지금 근무하고 있는 회사에서는 GitHub를 사용하지 않고, 

Visual Studio Team Services와 Visual Source Safe(VSS)를 사용하고 있어서

GitHub를 개인적으로 공부를 할 필요가 있기 때문에 작성한다.


■ 버전 관리란?

소스코드를 비롯한 파일의 변경 내역(버전)을 관리하는 것을 "버전 관리"라고 한다.

파일의 추가나 변경의 이력 정보를 관리하면 과거의 변경 부분을 확인하거나

특정 시점의 내용으로 다시 되돌리는 등의 "버전 관리" 작업이 가능하다.

 

이 버전 관리라는 개념이 존재하지 않는 상황에서 개발 작업을 고려할 경우,

버그가 발생했을 때 언제 수정을 했는지 등으로 인해 수정이 늦어지거나

발생한 버그로 인한 영향도가 불명확해지거나 결과적으로 사용자의 만족도 저하로 이어지는 등의 리스크가 높아진다.

또한 신규 개발이 끝난 후 유지보수 개발을 하는 팀에서 개발 내용을 연계하는 것이 어려워져 개발의 효율이 떨어진다.

■ Git이란?

위에서 설명한 버전 관리를 하기 위한 시스템이 Git이다.

다른 버전 관리 시스템과 비교한 Git의 특징은 분산형 버전 관리 시스템이라는 점을 들 수 있다.

버전 관리 시스템은 크게 '집중형'과 '분산형'으로 나뉜다.

'집중형' 버전 관리 시스템특정 위치에 있는 *저장수(repository)에 있는 접속이 필수적이지만,

'분산형' 버전 관리 시스템개개인의 머신상에 *저장소(repository)를 작성하고 개발을 할 수 있어

팀 단위로 개발을 할 때 주류가 되고 있다.

 

* 저장소(repository)

: 소프트웨어의 소스와 정보, 프로토타입 시스템, 기술 정보 등을 저장하는 데이터베이스

 구체적인 내용은 아래와 같음

 

저장소(repository) 란?

버전 관리를 통해 관리되는 파일 및 이력 정보를 저장하는 영역을 저장소(repository)라고 한다.

리포지토리 아래에서 파일이나 디렉터리를 조작함으로써 우리는 버전 관리를 할 수 있다.

분산형 버전 관리 시스템인 Git에서는 먼저 개개인의 머신상에 있는 리포지토리상에서 작업을 실시한 후,

작업 내용을 네트워크처의 서버상 등에 있는 저장소에 집약하는 흐름으로 개발을 진행한다.

 

저장소에는 2가지의 종류가 있다.

하나는 각각의 프로젝트 공간인 '로컬 저장소(Local Repository)'가 있다.

쉽게 말해 내 PC에 파일이 저장되는 개인 전용 저장소를 뜻한다.

또 하나는 집약처가 되는 '원격 저장소(Remote Repository)'가 있다.

즉, 파일이 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소이다.

 

Git을 사용하는 개발에서는 이 두 가지를 구별하는 것이 중요하기 때문에 확실히 이해를 할 필요가 있다!

 

[디렉토리 -- 커밋(commit) --> 로컬 저장소(local) ]--<--commit/pull--->--원격 저장소(Remote)

■ GitHub란?

여러명의 엔지니어가 원격 저장소로 활용하고 팀 개발을 위한 기능을 제공하는 WEB 서비스가 GitHub이다.

저장소로서의 기능을 가지는 것 이외에도 코드 리뷰 기능이나 Wiki 등의 커뮤니케이션 툴로서의 기능을 가지고,

조직 규모에 관계없이 많은 기업/단체가 소프트웨어 개발로 이용을 하고 있다.

 

■ 1. Git과 GitHub의 기본 사용법

・Git 설치

・Git 초기 설정

・GitHub 계정 만들기

・원격 저장소 만들기

・로컬 저장소 만들기

・로컬 저장소에 커밋(commit)

・원격 저장소에 푸시(push)

 

1-1. Git 설치

Mac이므로 Git은 설치되어 있기때문에 패스.

 

1-2. Git의 초기 설정

※ Mac - 터미널에서 작업

소스코드의 변경내용을 확인할 수 있지만 '누가' 변경했는지를 확인하기 위한 정보가 필요하다.

이 작업자를 식별하기 위한 정보로서, 사용자 이름과 메일 주소를 등록하는 작업을 실시

 

・사용자 이름 설정

git config -- global user.name 임의의 사용자 이름

・메일주소 설정

git config --global user.email 임의의 메일주소

마지막으로 다음 명령을 입력하면 위에서 설정한 사용자 이름과 이메일 주소가 등록되었는지 확인할 수 있다.

$ git config --list
core.symlinks=false
core.autocrlf=false
color.diff=auto
・
・
중략
・
・
user.name=설정한 사용자 이름
user.email=설정한 이메일 주소
・
・

1-3. GitHub 계정 생성

https://github.com/

 

GitHub: Where the world builds software

GitHub is where over 73 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

 

GitHub 사이트에 접속해서  Username, Email, Password를 입력한 후 "Sign up for GitHub" 버튼을 클릭.

"Verify your account" 설문에 응답한 후 Join a free plan을 선택.

[Welcome to GitHub]라고 표시된 화면으로 이동한 후 [Complete setup] 버튼을 클릭.

마지막으로 입력한 메일 주소에 인증용 메일이 오면 해당 메일 내용에서 인증을 실시하면 GitHup계정 생성 끗!

 

1-3. 원격 저장소 생성

GitHub에 액세스하여 원격  저장소를 만들자.

상단 화면에서 "Create Repository" 버튼을 클릭해서 저장소 생성화면으로 이동한다.

원격 저장소 생성화면

 

다음 화면에서 저장소 이름란에 저장소 이름을 입력한다.

나는 일단 "test"라는 이름을 입력했다.

그런 다음 생성자 유형으로 Public 또는 Private를 선택한다.

GitHub에서는 오랫동안 유료회원만 'Private'를 선택할 수 있었지만, 2019년부터는 

Free 플랜에서도 'Private'를 선택하여 만들 수 있게 되었다.

만드는 연습이기때문에 어느 쪽을 선택해도 상관없다.

・'Public'을 선택한 경우 : 다른 사용자가 소스코드를 탐색할 수 있다.

・'Private'를 선택한 경우 : 비공개. 즉 나만 볼 수 있음.

다음에 「Initialize this repository with a README」에 대해서인데, 이건 저장소의 설명이나 사용법을 기술하는 README파일을 사전 작성해두는 경우에는 체크를 ON으로 설정한다.

마지막으로 「.gitignore」이나 「license」는 None을 선택해도 상관이 없다.

마지막으로 Create repository 버튼을 누르면 저장소가 생성된다.

 

1-5. 로컬 저장소 생성

원격 저장소를 위에서 생성했으니까 이번에는 로컬 저장소를 생성한다.

이번에도 "test"라는 디렉토리를 만들려고 한다.

그런 다음 git init 명령을 입력하여 test 디렉토리를 저장소로 초기화한다.

※ 명령은 test 디렉토리에서 수행해야하므로 주의하기!

git init

1-6. 로컬 저장소에 커밋하기

커밋(commit)은 로컬 저장소에 파일 추가 및 변경을 반영하는 작업을 의미한다.

실제로 로컬 저장소에 파일을 추가해보자.

먼저 1-5에서 "test" 디렉토리 아래에 "index.html"이라는 파일을 만든다.

텍스트 편집기 등으로 파일을 만든다.

이 상태에서는 파일만 만들었기 때문에 아직 저장소에는 추가되지 않은 상태이다.

index.html

그 다음에 아래의 명령어를 입력하고 인덱스에 index.html을 추가한다.

인덱스는 커밋전에 변경내용을 임시로 저장하는 영역을 말하며 인덱스에 추가된 파일만 커밋대상이 된다.

git add index.html

마지막으로 인덱스에 추가한 파일을 커밋한다.

아래 명령을 입력하면 인덱스에 존재하는 파일이 로컬 저장소로 추가된다.

git commit -m "[Add] index"

여기서 -m은 커밋 메시지를 입력하기 위한 옵션이다.

커밋 메시지를 남기면 보다 상세한 이력 정보를 남길 수 있기때문에 나중에 로그에서 커밋 내용을 확인할 때 

도움이 되기 때문에 웬만하면 메시지 내용을 입력하는 것을 추천한다.

 

또 커밋 메시지를 포함한 변경이력(로그)는 이하의 git log 명령을 입력하는 것으로 아래와 같이 확인할 수 있다.

$ git log
commit 6a8e257...커밋해시.....642e3 (HEAD -> master)
Author: 사용자명 <메일주소>
Date:   Tue April 16 18:45:56 2022 +0900

    [Add] index

1-7. 원격 저장소에 푸쉬

마지막으로 로컬 저장소의 변경 사항을 GitHub상의 원격 저장소에 반영하는 푸쉬(push)를 실시한다.

우선 로컬 저장소와 원격 저장소를 연결하기 위해 로컬 저장소(test)밑에서 아래 명령을 입력한다.

git remote add origin https://github.com/사용자명/test.git

이로써 원격 저장소 정보가 로컬 저장소로 등록이 되었다.

 

그런 다음 로컬 저장소의 변경 내용을 원격 저장소에 반영시키기 위해 아래의 명령엉를 입력하여 푸시를 실시한다.

GitHub 사용자 이름과 비밀번호를 입력해야하는데 계정을 등록했을 때 설정한 값을 입력하면 된다.

git push origin master

이로써 원격 저장소에 반영시킬 수 있다.

GitHub에서도 변경내용이 반영되어 있는 것을 확인할 수 있다.

※ GitHub에서 공개키 정보를 등록하면 푸쉬를 할 때 사용자명과 패스워드를 매번 입력할 필요가 없다.

이거는 귀찮으니까 생략쓰,,!

 

■ 2. Git과 GitHub의 이용한 팀 개발 방법

여기까지가 Git과 GitHub의 기본적인 사용법을 소개했고,

팀에서 다른 멤버와 개발을 할 때의 사용법에 대해서도 기본적인 조작을 소개하고자 한다.

Git에서는 브런치(branch)라는 구조가 있어, 팀 개발을 할 때는 브런치를 잘 다루어야 한다.

 

2-1. 저장소 복제하기

새롭게 개발 현장에 참여하게 될 경우, 이미 존재하는 원격 저장소에서 소스코드를 얻게 된다.

이쪽의 작업을 실시해보자.

앞의 "test"와는 다른 디렉토리 "test2"를 작성하고, 아래의 명령을 실행하자.

git clone https://github.com/사용자명/test.git

"test" 디렉토리 상에 방금 푸시했던 index.html이 떴을 것이다.

이와 같이 저장소로부터 프로젝트를 복제하는 작업을 클론(clone)이라고 한다.

 

2-2. 브랜치 만들기

소프트웨어 개발에서는 동시 진행으로 여러 버전의 개발이 이루어지는 것은 드문 일이 아니다.

또 갑작스러운 버그 대응이 발생하는 일도 있어 이 제품도 새롭게 출시하는 버전과는 다른 축으로 대응할 필요가 있다.

이것들을 병행하면서 개발을 실현하기 위한 구조로서 Git에는 브랜치(branch:가지, 분리)라고 하는 기능을 제공한다.

아래와 같이 브랜치를 사용하면 각자 독립적인 작업 영역(저장소)에서 변경 이력을 분리해서 작업을 할 수 있다.

 

커밋1 -> 커밋2 -> 커밋3 => 릴리즈용 : 브런치1

        -> 커밋4 -> 커밋5 => 기능A의 보수개발용 : 브런치2

        -> 커밋6 -> 커밋7 => 기능B의 버그대응 : 브런치3

 

브랜치를 작성하려면 git branch 명령을 사용한다.

예를 들어 현재 작업중인 브랜치(디폴트로 존재하는 브랜치를 「master」라고 부른다.)를 가지고

「feature1」이라고 하는 브랜치를 작성해보자.

아래의 명령어를 입력하면 된다.

git branch feature1

 

이걸로 master에서 feature1 브랜치가 작성되었다.

다음으로 feature1 브런치상에서 작업을 수행하기 위해 checkout 명령어를 입력하고 브랜치를 이동한다.

git checkout feature1

여기서 git branch 명령을 입력하면 현재 로컬 저장소 상에 존재하는 「master」와 「feature1」이라는 브랜치가 표시된다.

「*」는 작업을 하고 잇는 브랜치를 의미한다.

$ git branch
* feature1
  master

2-3. 브랜치로 커밋하기

feature1 브랜치를 사용하여 이번에는 login.html이라는 파일을 만든다.

작성한 login.html을 feature1 브랜치에 커밋한다. 

git add login.html
git commit -m "[Add] login"

2-4. 원격 저장소에 푸쉬하기

원격 저장소(GitHun)에도 feature1 브랜치의 내용을 반영한다.

1-7의 순서와는 다르게 push처의 브랜치가 feature1으로 되어있으므로 주의바람!

git push origin feature1

GitHub에 접속하면 2개의 브랜치(master와 feature1)이 존재하는 것을 확인할 수 있다.

GitHub 접속 후

feature1 브랜치에는 변경 내용이 푸쉬된 것을 확인할 수 있다.

feature1 브랜치

반대로 푸시처가 아닌 master에는 변경내용이 반영되어 있지 않은 것도 확인할 수 있다.

master 브랜치

2-5. 코드 리뷰 통합

브랜치에서 개발 작업이 완료되면 메인이 되는 브랜치(일반적으로는 master가 기본)에

변경 내용을 받아들여 개발 내용을 통합한다.

이와 같이 특정 브랜치의 변경 내용을 다른 브랜치에 넣는 것머지(merge)라고 한다.

머지를 할 때 GitHub상에서는 풀리퀘스트(pull request)라고 불리는 기능을 사용해 코드리뷰를 할 수 있다.

지적할 부분이 있는 경우에 의견을 추가해서 작업자에게 수정을 하라고 촉구할 수 있다.

 

개요에 대해서 설명하자면

・리뷰 의뢰

먼저 GitHub상에서 feature1 브랜치를 열고 "New Pull Request"를 클릭.

그 다음 풀 리퀘스트를 작성한다.

아래 사항을 확인한 다음 "Create pull request" 버튼을 클릭

①머지 전 브랜치(Source Branch)/ 머지 대상 브랜치(Target Branch) : 즉, Source Branch를 Target Branch에 merge

②리뷰어(reviewer):리뷰를 실시하는 사람

③리뷰내용

④리뷰, 머지 대상의 소스코드

・리뷰 실시

풀리퀘스트를 받은 리뷰어는 "Pull requests"탭을 열고 "Files changed"에서 받은 소스코드를 확인한다.

지적이 있을 경우엔 소스코드 뷰 위에 코멘트를 추가하고 개발자에게 수정을 하도록 지시한다.

내용에 문제가 없다면 "Conversation"의 "Merge pull request"를 클릭해서 리뷰를 완료한다.

이 타이밍에 브랜치 머지도 실시되며, feature1의 내용이 master에도 반영된다.

머지를 실시한 것으로 login.html이 master 위에도 표시되는 것을 확인할 수 있다.

실제 리뷰에서는 개발하는 기능이나 버그 수정의 여러소스코드를 풀리퀘스트에서 확인한다.

또한 지적이 발생하고 여러 번 개발자와 리뷰어의 왕복이 발생하는게 기본적이다.

이게 기본적인 흐름이니까 실무에서 코드리뷰에서도 참고하면 좋을듯,,,?

 

2-6. 리모트 저장소에서 풀하기

원격 저장소의 master에는 머지가 이루어졌지만 개발자의 로컬 저장소 상의 master에는 아직 머지를 한 내용이 반영되지 않았다.

앞으로도 개발 작업을 진행해 나가려면 Marge한 내용(여기서는 login.html)을 로컬 저장소의 master로 취득하고 최신화를 할 필요가 있다.

이 경우, 풀(pull)이라고 하는 조작을 실시하는 것으로 원격 저장소에서 변경 내용을 가져올 수 있다.

 

일단 브랜치를 master로 바꿔보면

아직 이 시점까지는 조금 전에 머지를 했던 login.html이 확인이 안될 것이다.

git checkout master

그런 다음 git pull 명령을 실행해서 원격 저장소의 master에서 최신 변경 내용을 가져온다.

git pull
remote: ・・・・
・
・
・
From https://github.com/ユーザ名/rakus
   f5・・27 e4・・0f  master     -> origin/master
Updating f5・・27 e4・・0f
Fast-forward
 login.html | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 login.html

이제 로컬 저장소의 master에서는 원격 저장소의 최신 내용이 반영되어있을 것이다.

Is 명령어를 실행하면 login.html을 확인할 수 있고

git log 명령어로 이전 작업들의 변경 이력을 확인할 수 있따.

$ ls
index.html  login.html
$ git log
commit 99c9637・・・・5281c0e (HEAD -> master, origin/master, origin/HEAD)
Merge: f5・・27 e4・・0f
Author: 사용자명
Date:   Fri May 29 19:28:48 2020 +0900

    Merge pull request #1 from 리포지토리명/feature1
    
    [Add] login

commit e4ccb0fa2・・・・・3e33b983c0 (origin/feature1, feature1)
Author: 사용자명 <메일주소>
Date:   Fri May 29 19:26:08 2020 +0900

    [Add] login

commit f5dbc270a・・・・・735f93a53d90a1c1068
Author: 사용자명 <메일주소>
Date:   Tue May 26 18:45:56 2020 +0900

    [Add] index

 

 

일단..이런식으로 다른 개발자랑 현업해서 팀내 개발을 진행하고 있다 탕탕

■ 요약

Git과 GitHub 기본 개념과 사용법에 대해 작성

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함