Notice
Recent Posts
Recent Comments
Today
Total
04-30 00:02
Archives
관리 메뉴

Jeongchul Kim

깃(Git) 가이드 본문

COMPUTER

깃(Git) 가이드

김 정출 2016. 2. 17. 11:34


깃(Git) 가이드

깃(Git) 이란?


깃(Git)은 소스 코드 관리를 위한 분산 버전 관리 시스템으로 프로젝트의 어떤 부분도 겹치지 않게 변경을 관리하는 소프트웨어이다.


Git은 원래 Linux 소스 코드를 관리할 목적으로 개발되었다.

Git에서는 소스 코드가 수정, 편집된 이력을 확인하고, 특정 시점에 저장된 version과 비교하거나 돌아갈 수 있다.


또한 개발자가 작성한 파일이 다른 개발자와 내용이 충돌된다면, 원격저장소에 upload 할 때 경고 메세지가

발생된다.


SVN(SubVersion)은 서브버전이라 불리며, 자유 소프트웨어 버전 관리 시스템 명령행 인터페이스에서 사용하는 명령어를 따서 SVN이라고 불리기도 한다.


기하학적 불변 이론을 바탕으로 설계됐고, 빠른 수행 속도에 중점을 두고 있는 것이 특징이다. 최초에는 리누스 토르발스가 리눅스 커널개발에 이용하려고 개발하였으며, 현재는 다른 곳에도 널리 사용되고 있다.


깃의 작업 폴더는 모두, 전체 기록과 각 기록을 추적할 수 있는 정보를 포함하고 있으며, 완전한 형태의 저장소이다. 네트워크에 접근하거나 중앙 서버에 의존하지 않는다.


깃 저장소 Git repository

저장소(repository)란 소스 파일이나 디렉터리를 저장하는 고이다.

Git repository이 제공하는 좋은 점은 소스 파일이 수정, 편집 이력 별로 구분되어 저장된다는 점이다.


svn은 보통 저장소가 서버에 있다. git은 저장소가 내 컴퓨터에 있다.

git은 다른 사람들과 작업을 하기 위해 원격 저장소(remote repository)를 생성한다.


개발자가 자신 컴퓨터의 로컬저장소에 소스 코드를 커밋(commit)하고,

다른 사람과 공유할 때는 원격저장소에 푸시(push)합니다.


원격 저장소(Remote repository)

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


로컬 저장소(Local repository)

개발자 PC에 소스 파일이 저장되는 개인 전용 저장소이다.


SVN과 Git의 차이점


저장소 만들기 Create repository

개발자 컴퓨터에 로컬 저장소를 만드는 방법은 두 가지가 있다.


1. 저장소를 새로 생성한다.

2. 이미 만들어진 원격 저장소를 로컬 저장소로 복사해온다.



Git은 원격 저장소와 연결이 끊겨도 계속 버전 관리가 가능하다.

또한 원격 저장소가 폭파 되어도 로컬 저장소로 복원이 가능하다.

- 원격 저장소와 연결된 모든 로컬 저장소는 복사본을 보유한다.

SVN은 서버에 문제가 생기면 모든 버전 관리가 중단된다.


스테이지 영역 = 인덱스(index)

git에는 로컬 저장소에로 커밋(commit) 전, 이전 단계가 하나 있는데, 스테이지 영역이라고 하며,

인덱스(index)라고 부른다.

즉 commit 작업은 worktree에 있는 변경 내용을 저장소에 바로 이력을 기록하는 것이 아니라, index에

파일 상태를 기록하게 된다. 즉 원하는 일부 변경 사항만 등록해 커밋할 수 있다.


스테이지 영역에서는 커밋할 파일들을 추가 합니다.


스테이지 영역의 역할

1. 빌드 목표: 로그인 기능 추가, A 파일 수정

2. 파일 수정:

login.php -> 로그인 기능 추가

menu.php

head.php

body.php

tail.php

style.css (A 파일 수정)


3. 로그인 기능 추가가 다음 빌드로 미루어짐

git은 커밋 할 파일들만 staging area에 추가

로컬저장소로 커밋

<->

SVN은 수정된 login.php를 어딘가로 백업

SVN revert를 이용해 원래 상태로 복귀

수정 내용 전체를 커밋

백업해두었던 login.php를 다시 복구

=> 변경된 파일들을 무조건 커밋 대상이 되기 때문에 문제가 생김

스냅샷 snapshot

git은 각각의 버전(version)을 스냅샷으로 저장한다. 그러므로 이전에 만들어진 모든 변경사항의 “스냅샷”을 통해 이전 시점의 어떤 버전으로 되돌릴 수 있다.


git은 가장 최근의 스냅샷들로만 특정 버전을 빠르게 만들 수 있으며, 네트워크를 거치지 않는다.



브랜치 branch

브랜치는 git의 스냅샷 snapshot 덕에 구현이 가능하다.


svn은 디렉토리 구조이다. 서버는 단지 변경사항만 저장하며, 최소한의 자료구조를 유지하지만,

개발자가 작업을 위해 브랜치를 내려받으면, 그 변경 내역들을 순차 적응해 실제 파일을 생성한다.

브랜치를 만들면 전체 파일을 네트워크를 통해 전체를 다운받아 해서 느리다.


반면에, git은 서버에 논리적 디렉터리 구조를 만들지 않고, 연속된 스냅샷이 순차적으로 이어지다가

가지(branch)를 생성하며 이어진다.

git branch branch이름



개발자는 작업 중에 branch와 master를 자유롭게 이동할 수 있다.

브랜치를 선택하는 명령어

checkout master

checkout branch1


개발자들은 메인 프로젝트의 master를 따와서(branch off), 자신이 변경하고 싶은 자신만의 버전을 생성한다.

작업이 끝나고, master 브랜치에 다시 merge한다

git checkout master (master로 이동 후 merge 명령어 실행)

git merge branch이름


merge 중에 충돌은 언제나 발생할 수 있다.

master와 branch 영역 중 하나를 선택하여 새로 작성한다.

<<<<, >>>>, ===== 구분자를 삭제

변경내역을 add 후, commit


branch 제거하기

git branch -d branch이름


리베이스 rebase

rebase는 merge와 비슷하게 하나의 브랜치(Branch)를 다른 branch로 병합하는 기능을 한다.

단 merge는 두 브랜치의 결과를 병합하나, rebase는 한 브랜치에서 이루어진 작업 히스토리(History)를 다른 브랜치에 차례대로 적용한다. 즉 병합 히스토리를 간결하게 남겨준다.

공동 작업에서 깔끔한 히스토리를 위해 rebase를 사용합시다.

https://git-scm.com/book/ko/v1/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-Rebase%ED%95%98%EA%B8%B0


태그 tag

git도 tag를 지원합니다. 보통 릴리즈(release)할 때 사용한다. (v 1.0 등등)


태그 만들기

git tag tag이름


태그 지우기

git tag -d tag이름


태그 목록

git tag



커밋 commit

소스 파일 및 폴더의 추가/변경 사항을 로컬 저장소에 기록하려면 commit을 해야 한다.

commit을 하면 이전 커밋 상태부터 현재 까지의 변경 이력이 기록된 commit(revision)이 생성된다.

commit은 시간순(타임라인)으로 저장된다. 각 commit은 영어와 숫자로 이루어진 40자리 고유 이름이 붙는다.


commit은 이력을 남기는 작업이기 때문에 메시지를 필수로 입력해야 한다. 메시지가 없으면 실행되지 않는다.


특별히 파일들을 구분할 필요가 없을 경우에는 -a 옵션으로 스테이지 추가와 커밋(commit)을 동시에 할 수 있다.

git commit -a


커밋을 마치면, 다른 개발자에게 작업물을 공유한다

원격저장소에 올리는 명령어 push

git push



내 작업을 올리는데 오류가 발생했다면, 다른 사람들이 작업한 내용을 먼저 받아야 한다.

원격 저장소로부터 내려 받기 fetch

내려 받은 데이터를 병합 하기 merge


이 두 개의 작업을 한 번에 처리하는 원격 저장소에 내려받고 병합하는

git pull






Comments