4. Git, Github 강좌
이번 강좌에서는 소프트웨어의 버전관리(SVC), 협업, 오픈소스 개발등에 필수적인 git, github를 이용하기 위한 환경을 설정하고 git 명령을 통해 실제 개발에 활용하는 방법을 배웁니다.
이 강의를 통해 git 과 github 를 이용해 자신만의 리파지토리를 구축하고 이클립스와 같은 개발도구와 연계해 버전관리와 협업등의 전반적인 과정을 이해하고 실무에 적용할 수 있습니다.
01: Git 시작하기
Git 이란?
Git은 소스코드를 효과적으로 관리하기 위해 개발된 분산형 버전 관리 시스템입니다.
CVS, subversion 과 같은 VCS(Version Control System)는 오래전부터 사용되었고 Git 역시도 VCS의 범주에 들어갑니다. 다만 기존의 시스템들과 달리 파일을 직접적으로 다루지 않고 변경된 방식의 링크를 저장하는 형식으로 운영되어 버전관리에 따른 용량이 크지 않고 빠른 속도로 운영이 가능한 차이가 있습니다.
또한 지금은 VCS의 기본 역할인 프로그램 소스의 버전 관리 이외에도 프로그램의 협업 개발과 통합, 빌드, 테스트, 배포등의 일련의 과정을 하나의 프로세스로 운영하는 DevOps 의 가장 기본이 되는 도구중 하나로 개발자들에게는 반드시 알아야 하는 필수적인 존재 입니다.
Git은 처음에 Linux 의 오픈소스 관리를 위해 2005년 처음 개발되었으며 다음과 같은 목적으로 출발 하였고 지금도 기본적인 철학을 유지하고 있습니다.
- 빠른 속도
- 단순한 구조
- 비선형적인 개발(수천 개의 동시 다발적인 브랜치)
- 완벽한 분산
- Linux 커널 같은 대형 프로젝트에도 유용할 것(속도나 데이터 크기 면에서)
Git을 통한 모든 작업은 Git 데이터베이스에 추가 됩니다. 기본적으로 되돌리거나 데이터를 삭제할 방법이 없으며 모든 기록이 남아있게 됩니다. 물론 다른 VCS처럼 Git도 커밋하지 않으면 변경사항을 잃어버릴 수 있지만, 일단 스냅샷을 커밋하고 나면 데이터를 잃어버릴 가능성은 거의 없습니다.
따라서 Git을 사용하면 프로젝트가 심각하게 망가질 걱정 없이 여러 가지 실험을 해 볼 수 있으며 문제가 있다면 다시 원래대로 되돌아 올 수 있습니다.
Git 학습자료
아래의 두 한글번역 자료는 Git 을 이해하는데 도움이 되는 자료들 입니다. 특히 git 에서 공식적으로 무료 배포하고 있는 Pro Git 도서의 ebook 에는 Git 의 모든 것이 담겨 있습니다.
주요 용어와 개념
처음 Git 을 시작할때 어려운 부분이 많은 용어와 개념의 이해 입니다. 핵심 용어와 주요 개념을 이해하고 나면 git을 사용하는 것이 그리 어렵지 않을것입니다. 물론 git 을 잘 사용하려면 어느정도의 경험과 시행착오가 있어야 합니다.
Working Directory
작업디렉토리로 Git 으로 관리할 프로그램의 소스나 파일등이 위치하는 곳이라고 생각하면 됩니다. git
명령을 이용해 초기화 작업을 실행하면 Repository 가 생성되게 됩니다.
Repository
우리말로 저장소라고 합니다. Working Directory에서 이루어지는 모든 작업들에 대한 정보가 저장되는 곳입니다. Working Directory 내에 .git
폴더안에서 관리 됩니다.
분산 작업을 하는 경우 local repository, remote repository 로 분리 됩니다.
Staging Area
Working Directory 에서 작업된 내용이 Repository로 저장되기 전에 보관되는 준비 영역으로 Index라고도 합니다. .git/index
파일로 관리 됩니다.
git add
Staging Area
git commit
Repository
Stash
작업이 마무리 되지 않은 파일들을 잠시 stack 에 저장해 두는 것으로 예를 들어 작업중 다른 요청을 처리하기 위해 branch 를 변경해야 하는 경우 현재 작업중인 상황을 git stash
로 저장해 두고 나중에 다시 불러와 마무리 하고 commit
을 진행할 수 있습니다.
Branch
버전을 관리하는 묶음을 말하는 것으로 마치 나무가치 처럼 분기해서 관리할 수 있다고 해서 붙여진 이름 입니다. 현재 작업에서 단순한 내용 수정이 아닌 구조적인 변화나 새로운 시도를 위해 다소 큰 규모의 수정이 필요한 경우 기존 작업 Branch 를 남겨두고 새로운 Branch 를 생성해 이동한 다음 작업을 하는 방식입니다. 만일 작업이 성공적이면 다시 기존과 병합(Merge) 하거나 Branch 를 버리고 기존의 작업 Branch 로 되돌아 갈 수 있습니다.
- HEAD: 자체로 branch는 아니며 현재 작업하는(가장 마지막 commit된) local branch 를 가리키는 특수한 포인터
- master: 기본이 되는 메인 branch로 기본적으로 생성됨
- origin: 특별히 지정하지 않으면 기본적으로 지정되는 remote repository를 가리키는 주소이름
commit, pull, push
Git을 통해 이루어지는 작업들에 대한 명칭이며 git 프로그램의 명령이기도 합니다.
- commit: 작업된 내용을 확정하는것을 말함. 간단한 메모와 함께 작업내용을 repository 에 저장.
- push: Local 에서 commit 된 내용을 remote 로 보내는 작업.
- pull: Remote 에서 변경된 사항을 local 에 반영하는 작업
Clone, Fork
Clone은 Git repository 를 복제하는것을 말합니다. Local 혹은 Remote Repository 를 모두 복제해 사용할 수 있습니다.
그런데 다른 사람의 repository 는 clone 을 해도 push 권한이 없기 때문에 수정사항등을 관리할 수 없습니다.
Fork는 Github에서 다른 계정의 Repository 를 내 계정의 Repository 로 복사해 오는 것을 말하는 것으로 원본과 연결되어 변경사항등이 반영 됩니다.
Fork된 repository 는 내 계정에 있으므로 Local 로 Clone을 만들 수 있습니다. 어렇게 되면 파일들의 push 권한이 내게 있으므로 수정사항을 관리할 수 있게 됩니다.
다만 원본 프로젝트로 반영되는 것은 아니며 원본에 대한 반영은 pull request 를 요청하면 권한이 있는 원본 소스 관리자가 코드 리뷰를 통해 반영하는 과정을 거치게됩니다.
Merge, Rebase
두 작업 모두 branch 에서 작업한 내용을 master 로 합치는 것을 말합니다. 다만 과정상에 차이가 있습니다.
대부분의 경우에는 merge 를 통해 branch 에서 작업한 내용을 master에 병합하게 됩니다. 이 과정에서 충돌나는 파일이 있다면 검토를 통해 확정본을 결정해야 합니다.
다만 새로운 branch 로 작업하는 과정에 master 역시 계속 변화가 있다면 병합하는 과정과 이후에 복잡한 히스토리 로그로 인해 관리가 어려운 문제가 있을 수 있습니다. 이 경우 branch 의 base 를 master 이후로 옮겨(re-base) 1차적으로 정리한 다음 병합을 진행하는 형식으로 변경 이력을 단순화할 수는 있지만 원래의 commit 이력이 사라지게 되므로 자세한 이력이 필요한 경우에는 신중하게 고려해야 합니다.
Github
Github는 기본적으로 git의 remote repository를 제공하는 일종의 클라우드 서비스로 github 이외에도 gitlab, gitbucket 등이 있습니다. 이들은 단순한 git repository 의 역할뿐만 아니라 협업을 위한 부가적인 도구들(wiki, project관리, Issue, 블로그)을 제공하고 있습니다.
Github의 경우 공개 프로젝트는 무료로 제공 되었기 때문에 많은 오픈소스 프로젝트들이 관리되기 시작한 배경 이기도 합니다. 비공개 프로젝트의 경우 비용을 지불해야 했으나 MS에 인수된 이후 2019년 1월 초부터 비공개 저장소를 무료로 제공하기 시작했습니다.
대신 무료 계정(개인 사용자)은 한 저장소당 최대 3명의 사용자까지만 무료로 등록할 수 있으며, 이 제한을 해제하려면 월 $7의 비용을 지불하는 유료 계정으로 전환해야 합니다.
02: git 설치 및 설정
git 설치
Git 을 사용하려면 로컬 컴퓨터에 git
을 설치해야 합니다. https://git-scm.com 사이트에 접속해서 자신이 사용하는 운영체제에 맞는 설치파일을 다운로드합니다.
git 을 비롯해 최근의 개발에 많이 사용되는 방식은 CLI(Command Line Interface)를 사용하는 것입니다. 즉 윈도우의 GUI 환경이 아니라 Terminal 혹은 cmd 와 같은 콘솔 화면에서 텍스트를 직접 타이핑해서 작업하는 방식을 말합니다.
어떻게 보면 매우 오래된 과거의 사용법이나 GUI를 사용하는 것 보다 훨씬 빠르고 편리한 부분이 있기 때문에 선호되고 있습니다.
Linux 나 Mac 의 경우에는 기본적으로 유닉스 운영체제를 기반으로 하고 있기 때문에 이러한 환경이 잘 갖추어져 있어 오랜전부터 이용된 방법이며 MS Windows 의 경우 Power Shell과 WSL(Windows Subsystem for Linux)을 통해 비슷하게 사용할 수 있습니다만 상대적으로 불편하다고 할 수 있습니다.
CLI 로 소프트웨어 관리를 위해 Linux의 경우 dnf
혹은 apt-get
을 사용하며 Mac은 Homebrew
가 대표적입니다. MS windows 의 경우 scoop
이나 Chocolatey
등을 사용할 수 있습니다.
여기서는 MS Windows 에 설치하는 과정을 살펴보도록 합니다.
git 사용하기
본격적인 git 사용에 대해서는 03:Github 실전 튜토리얼 에서 살펴보고 여기서는 기본적인 환경설정과 로컬 리파지토리 생성 과정을 알아 봅니다.
모든 명령의 실행은 Windows Powershell, Mac/Linux 의 터미널 프로그램에서 이루어 집니다.
환경설정
처음 git 을 사용할때 사용자 이름과 email 주소를 지정해야 합니다.
git config --global user.name "이름"
git config --global user.email "이메일주소"
Repository 생성
작업디렉토리를 생성하고 git repository 로 사용하도록 초기화 작업을 진행 합니다. 작업 디렉토리는 사용자의 홈디렉토리나 별도로 관리하는 경로에 디렉토리를 만들고 시작 합니다.
mkdir gitrepo
cd gitrepo
mkdir testproject
cd testproject
git init
작업 정보 보기
git status
: local repository 의 상태를 보여줌git show
: commit, merge 등의 정보를 보여줌git log
: 작업 히스토리 로그를 보여줌
Github 계정 생성
Github 사용을 위해서는 계정을 먼저 생성해야 합니다. 아이디 이메일등 정보를 입력하고 회원유형(유료/무료)를 선택한 다음 본인 이메일로 전달된 확인 메일의 링크를 클릭한 다음 로그인할 수 있습니다.
03: Git, Github 실전 튜토리얼
Github를 연동해 git 을 이용하는 경우 먼저 Github 에 리파지토리를 생성하고 시작하는 것이 좋습니다. 본 튜토리얼에서는 다음과 같은 절차를 차례로 실습하게 됩니다.
튜토리얼을 따라하기 전에 Github 계정을 생성해 두어야 합니다.
1단계: Github repository 생성 및 clone
- Github 로그인 및
testrepo
repository 생성 - repository를 로컬로 clone
2단계: 로컬 파일 생성 및 push
- 로컬에서 test.txt 생성
- add, commit 및 push
- Github 에서 확인
3단계: Github 에서 파일 생성 및 pull
- Github 에서 README.md 파일 추가
- 로컬에서 pull을 통해 remote 변경사항 가져오기
4단계: 로컬에서 branch 생성 및 push
- 로컬에서 새로운 branch_a 생성 및 전환
- branch_a 에서 test2.txt 추가
- add, commit
- master branch로 변경후 test2.txt 안보이는것 확인
- branch_a에서 push 를 통해 github에 branch 추가 및 동기화
- Github에서 branch 추가 확인
5단계: pull request 및 merge
- 로컬 branch_a 에서 README.md 수정
- add, commit, push
- Github 에서 pull request 검토 및 충돌 파일 확인
- Github 에서 merge 수행
- Github 에서 branch_a 삭제
- 로컬에서 branch_a 삭제
- 로컬 master 에서 pull 을 통해 최종본 가져옴
# Cloning from repository
git clone https://github.com/dinfree/testrepo.git
cd testrepo
vi test.txt
git add test.txt
git commit -m "add test.txt"
git push (push -u origin master)
# 서버에서 README.md 추가한 다음.
git diff HEAD origin/master
git pull
# branch 작업
git checkout -b branch_a // branch 생성 및 새로운 branch 로 전환
git status
vi test2.txt
git add test2.txt
git commit -m "add test2.txt"
ls
git checkout master
ls // test2.txt 보이지 않음.
git status // 변경할 사항 없음
git push origin branch_a
git branch -d branch_a
04: 개발도구 연동
대부분의 개발도구에서 Git
및 Github
사용이 가능합니다. 개발도구에 따라 기본적으로 기능이 제공되는 경우도 있고 별도의 플러그인 이나 확장프로그램을 설치해야 하는 경우도 있습니다.
메뉴 구성이나 화면은 개발도구에 따라 차이가 있지만 앞에서 배운 기본적인 용어와 개념들을 이해한다면 어느 개발도구에서나 Git을 사용하는데 아무런 문제가 없을것입니다. 여기서는 Eclipse와 Visual Studio Code에서 Git 및 Github 연동을 살펴 봅니다.
시작에 앞서
- 사용자 컴퓨터에 git 이 설치되어 있어야 합니다.
- Github 계정이 생성되어 있어야 합니다.
- 앞의 실습을 통해 Github에 생성한 repository 가 있어야 합니다.
Eclipse 에서 사용하기
Eclipse 에는 기본적으로 git 관련 기능이 내장되어 있습니다. Github 는 remote repository 개념으로 Github 이외 Gitlab 등의 사용도 가능 합니다.