Git?
Git이란 여럿이서 모여서 작품을 만들거나, 텀프로젝트를 하는 등 ‘협업 코딩’을 할 때 필요한 형상관리 또는 버전관리 시스템을 말한다.
Git은 속도에 중점을 둔 분산형 버전관리 시스템이며, 대형 프로젝트에서 효과적이다.
Git은 commit
이라는 명령어를 통해 로컬 저장소에 변경된 내용을 저장할 수 있고, 이렇게 로컬 저장소에 저장된 내용을 push
명령어를 통해 원격저장소에 업로드 할 수 있다.
전체 동작과정
Github
Github는 이런 Git 시스템을 사용하여 협업코딩을 진행할 수 있는 저장소를 말한다. Github는 공개용 저장소(무료)와 개인 저장소(유료)로 사용가능하며, 공개용 저장소의 경우 Github사이트에 노출이 되어 다른 사람들과 쉽게 공유 할 수 있다.
Github의 주소는 아래와 같다.
http://github.com
Github 가입하기
위의 주소로 접속하면 아래와 같은 화면이 나오게된다. 오른쪽의 Sign up for GitHub를 통해 가입을 진행하도록 하자.
Repository 만들기
Github에 로그인을 하면 처음에는 만들어놓은 저장소가 없기 때문에 아무것도 나오지 않을 것이다.
저장소를 만들기 위해 오른쪽에 + New Repository
를 클릭한다.
클릭하면 저장소의 이름을 입력하는 페이지가 나오게되고 공용(Public)으로 저장소를 만들 것인지 개인(Private)으로 만들 것인지를 선택한다.
아래의 Initialize this repository with a README
를 선택하여 README.md 파일을 생성하자.
README.md은 이 저장소에 소개글이나 간단한 설명을 써놓은 파일을 말한다. .md
는 MarkDown을 말한다.
Create Repository
를 클릭하여 새 원격 저장소를 생성하자.
이제 Github를 사용할 준비가 되었다.
Window는 Git bash프로그램을, Mac은 terminal을 사용하여 git 명령어를 입력해 파일을 push
, pull
할 수 있다.
Git 명령어
git config
--global user.name 사용자이름
옵션을 통해 사용자의 이름을 설정할 수 있다.--global user.email email@example.com
옵션을 통해 사용자의 이메일을 설정할 수 있다.
1 |
|
list
옵션으로 설정한 내용을 확인할 수 있다.
1 |
|
git remote
- 내 Local에서 바라보고자 하는 저장소를 추가해주는 것.
- Origin은 Alias임.
- –v옵션은 현재 만들어져 있는 저장소를 볼 수 있음.
git push
- Local 저장소에 반영된 내용을 Remote 저장소, 원격 저장소에 업로드하는 명령어이다.
- 정확히는 blob, tree, commit 이 세가지를 push한다.
git clone
- git clone ~~인자 = 인자값으로 디렉토리 생성
- git fetch를 통해 받아옴.(아직까지는 새로운 파일이 working directory에 추가되지 않음)
- git merge origin/master로 working directory에 새 파일 추가.
git pull(fetch+merge)
- 권장되지 않는 방법(중간 확인과정이 없기때문에 파일이 덮어씌워질 수 있음).
- fetch와 merge를 한번에 진행하는 방법.
remote -> clone -> pull(fetch+merge) -> push의 순으로 진행됨.
git branch
- branch = commit에 대한 pointer
- master branch가 있을 경우 git branch develop을 하면 develop이 head가 가르키는 곳에 브랜치가 생김.
- 그냥 git branch입력하면 현재 있는 브랜치들 보여줌(
*
가 있는거는 현재 작업중인 브랜치) - git checkout branch명은 브랜치 이름으로 작업공간을 옮겨가는것.
- cat .git/HEAD로 현재 작업중인 브랜치가 어디인지를 확인할 수 있음.
- 브랜치는 40바이트 Hash값으로 표현됨. 따라서 각각의 브랜치를 몇가지의 Hash값으로 구분한다.
- 같은 commit을 가르키는 경우 같은 해쉬값을 가짐(따로 commit을 안햇을 경우에)
git merge
- fast forward 방식
- 분기가 하나만 되어있을 경우에 사용하는 merge방법.
- master가 가르키는 pointer만을 옮김
$git merge --no-ff
옵션을 통해 fast forward 옵션을 막을 수 있음. - no fastforward를 통해 어디서부터 브랜치를 나누고 작업을 했는지를 알 수가 있음(강제로 merge commit을 생성해 master로 가져옴). 항상
--no-ff
옵션을 통해 merge를 할 것. - three way merge
- 나뉘어진 분기들이 모두 수정된 경우,
checkout
을 통해 master로 HEAD를 이동하고$git merge branch
명령어를 통해 merge를 할 수 있음. - 나누어진 분기의 최신
commit
들과 공통commit
하나를 가지고서 merging을 함.
git rebase
- commit객체를 깔끔하게 유지하는 방법(history를 선형적으로 유지)
$git rebase <base>
를 통해 사용가능- base commit을 바꾸는 것(branch가 나온 시작부분을 현재 master부분으로 가져옴). 하나의 작업처럼 보이도록 함.
- rebase는 모두 fastforward 방식.
rebase
와merge--no-ff
를 통해 merging을 하는 과정을 하나의 선으로 유지할 수 있음. rebase없이 진행하면 한 부분에서 여러개의 merging이 진행되어 겹쳐 보일 수 있음.- rebase는 merge를 하는 것이아니라 그냥 눈에 보기좋도록 바꾸는 것.
- rebase는 로컬에서 작업을 다 끝내고 올려야함(commit을 rebase하면 해쉬값이 바뀌게 됨)
git flow
- branching model: 이렇게 쓰면 좋다~ 제시 모델.
- merge commit(자신에게들어오는 화살표가 2개이상)
- master branch에는 절대로 commit을 하면 안됨. merge commit만을 해야함.
- develop branch에서는 master로 merge commit도 하지 않도록 권장함.
- feature branch: 기능하나만을 개발할 때 develop에서 나와서 사용.
- feature branch는 로컬에서만 사용. 기능별로 feature branch를 나눔.
- hotfix branch: bug를 고치거나 오타수정을 할 경우에 급하게 사용하는 branch.
- 위의 브랜치들을
$git flow init
명령어를 통해 다 만들수 있음(/가 있는거는 버전이나 기능이 여러개가 있기 때문). $git flow feature start 기능이름
을 통해 브랜치로 이동 가능. checkout도 해줘야 함($git checkout -b feature/myfeature develop
을 통해 checkout 명령어 없이 분기가능).- 완료 후
$git flow feature finish myfeature
를 통해 기능 merge, 브랜치 삭제 해줌. - realease는 develop에서 출발, hotfix는 master에서 출발.
SourceTree 설치하기
Git 사용에 앞서 git 저장소를 쉽게 관리하기 위한 Tool을 다운받도록 한다.
Git bash에서 위의 명령어들을 입력해도 되지만 SourceTree를 사용하면 한결 쉬운 저장소관리를 할 수 있다.
https://www.sourcetreeapp.com
위 주소로 들어가면 아래와 같은 화면이 나오게 된다. 자신의 PC환경에 맞게 설치를 하도록 하자.
설치를 완료하고나서, github 홈페이지에서 자신이 만든 repository로 들어간다.
들어간 repository의 주소를 복사한다.
SourceTree를 실행시키고 상단 메뉴 아래에 위치한 복제/생성
버튼을 클릭한다.
버튼을 클릭하면 아래와 같은 화면이 나오게된다.
방금 전에 복사한 url을 소스경로/URL
에 붙여넣기하고 원격저장소에 위치한 Repository를 자신의 로컬 저장소에 저장할 목적지 경로를 설정해주고 클론을 선택하면 원격 저장소를 자신에 로컬 저장소에 복제하게 된다.
이제 프로젝트를 진행할 준비가 끝났다.