Skip to content
This repository has been archived by the owner on May 28, 2019. It is now read-only.

Korean Translation. #7

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 18 additions & 4 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def update_toc(lang, toc)
index += "</ul>"
pages << "index.html"

layout = lang == 'en' ? 'master' : 'translation'
layout = ['en', 'ko'].include?(lang) ? 'master' : 'translation'

html = "---
layout: #{layout}
Expand All @@ -41,15 +41,29 @@ title: Table of Contents
</center>
<p>Support this site by buying a print version of
<a href="http://www.amazon.com/gp/product/1430218339?ie=UTF8&tag=prgi-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1430218339">Pro Git</a><img src="http://www.assoc-amazon.com/e/ir?t=prgi-20&l=as2&o=1&a=1430218339" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<p><a href="http://twitter.com/chacon"><img src="/images/twitterbird.png"></a><a href="http://twitter.com/chacon">Follow the author</a> on Twitter for updates and Git tips</p>
<p><a href="http://twitter.com/chacon"><img src="/images/twitterbird.png"></a><a href="http://twitter.com/chacon">Follow the author</a> on Twitter for updates and Git tips</p>'
if lang == 'ko'
html += '
<p>
<h3>Also available in:</h3>
<ul>
<li><a href="http://dogfeet.github.com/progit/progit.ko.pdf">Korean PDF</a></li>
<li><a href="http://dogfeet.github.com/progit/progit.ko.mobi">Korean Mobi</a></li>
<li><a href="http://dogfeet.github.com/progit/progit.ko.epub">Korean Epub</a></li>
</ul>
</p>'
else
html += '
<p>
<h3>Also available in:</h3>
<ul>
<li><a href="/ebook/progit.pdf">PDF</a></li>
<li><a href="https://github.s3.amazonaws.com/media/pro-git.en.mobi">Mobi</a></li>
<li><a href="https://github.s3.amazonaws.com/media/progit.epub">Epub</a></li>
</ul>
</p>
</p>'
end
html += '
</div>
'
html += index
Expand Down Expand Up @@ -199,7 +213,7 @@ def generate_pages(lang, chapter, content)
end

full_title = section_match ? "#{chapter_title} #{section_title}" : chapter_title
layout = lang == 'en' ? 'master' : 'translation'
layout = ['en', 'ko'].include?(lang) ? 'master' : 'translation'
html = "---
layout: #{layout}
title: Pro Git #{chapter}.#{section} #{full_title}
Expand Down
5 changes: 3 additions & 2 deletions _layouts/master.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ <h2>professional version control</h2>
Book translated into
<a href="/book/de">German</a>,
<a href="/book/zh">Chinese</a>,
<a href="/book/ja">Japanese</a> and
<a href="/book/nl">Dutch</a>.<br/>
<a href="/book/ja">Japanese</a>,
<a href="/book/nl">Dutch</a> and
<a href="/book/ko">Korean</a>.<br/>
Partial translations available in
<a href="/book/ar">Arabic</a>,
<a href="/book/cs">Czech</a>,
Expand Down
5 changes: 3 additions & 2 deletions _layouts/translation.html
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ <h2>professional version control</h2>
Book translated into
<a href="/book/de">German</a>,
<a href="/book/zh">Chinese</a>,
<a href="/book/ja">Japanese</a> and
<a href="/book/nl">Dutch</a>.<br/>
<a href="/book/ja">Japanese</a>,
<a href="/book/nl">Dutch</a> and
<a href="/book/ko">Korean</a>.<br/>
Partial translations available in
<a href="/book/ar">Arabic</a>,
<a href="/book/cs">Czech</a>,
Expand Down
11 changes: 11 additions & 0 deletions book/ko/ch1-0.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
layout: master
title: Pro Git 1.0 시작하기
---
<h1>Chapter 1</h1><h1 id='id199'>시작하기</h1>

<p>이 장에서는 처음 접하는 사람들에게 Git을 설명한다. 먼저 버전 관리 도구에 대한 이해를, 그리고 Git을 설치하는 방법을, 마지막으로 Git 서버를 설정하고 사용하는 방법을 설명한다. 이 장을 다 읽고 나면 Git의 탄생 배경, Git을 사용하는 이유, Git을 설정하고 사용하는 방법을 터득할 것이다.</p>

<div id='nav'>
<a href='index.html'>prev</a> | <a href='ch1-1.html'>next</a>
</div>
41 changes: 41 additions & 0 deletions book/ko/ch1-1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
layout: master
title: Pro Git 1.1 시작하기 버전 관리란?
---
<h2 id='_'>버전 관리란?</h2>

<p>버전 관리는 무엇이고, 우리는 왜 이것을 알아야 할까? 버전 관리는 파일들의 변화를 시간에 따라 기록하는 것이다. 이 책에 있는 모든 예제는 모두 버전 관리 시스템을 사용한다. 실제로 컴퓨터에서 사용하는 거의 모든 파일의 버전을 관리할 수 있다.</p>

<p>그래픽 디자이너나 웹 디자이너도 이미지나 레이아웃의 모든 버전(변경 이력 혹은 수정 내용)을 관리하기 위해 버전 관리 시스템 (VCS - Version Control System)을 사용하는 것이 현명하다. VCS를 사용하면 각 파일을 이전 상태로 되돌릴 수 있고, 프로젝트를 통째로 이전 상태로 되돌릴 수 있고, 시간에 따라 수정 내용을 비교해 볼 수 있고, 누가 문제를 일으켰는지도 추적할 수 있고, 누가 언제 만들어낸 이슈인지도 알 수 있다. VCS를 사용하면 파일을 잃어버리거나 잘못 고쳤을 때도 쉽게 복구할 수 있다. 이런 모든 장점을 큰 노력 없이 이용할 수 있다.</p>

<h3 id='___'>로컬 버전 관리 시스템</h3>

<p>많은 사람은 버전을 관리하기 위해 Directory로 파일을 복사하는 방법을 쓴다(똑똑한 사람이라면 Directory 이름으로 시간을 쓸 거다). 이 방법은 간단하므로 자주 사용한다. 그렇지만, 정말 뭔가가 잘못되기 쉽다. 작업하는 Directory를 지워버리거나, 실수로 파일을 잘못 고칠 수도 있고, 잘못 복사할 수도 있다.</p>

<p>이런 이유로 프로그래머들은 오래전에 로컬 VCS를 만들었다. 그 VCS는 관리 중인 파일의 변경 정보를 저장하려고 아주 간단한 데이터베이스를 사용했다.</p>

<p><center><img src="/figures/ch1/18333fig0101-tn.png"></center><br/> 그림 1-1. 로컬 버전 관리 다이어그램.</p>

<p>많이 쓰는 VCS 도구 중에 rcs라고 부르는 것이 있는데 오늘날까지도 아직 많은 회사가 사용하고 있다. Mac OS X 운영체제에서도 개발 도구를 설치하면 RCS가 함께 설치된다. RCS는 기본적으로 Patch Set(파일에서 변경되는 부분)을 관리한다. 이 Patch Set은 특별한 형식의 파일로 저장한다. 그리고 일련의 Patch Set을 적용해서 모든 파일을 특정 시점으로 되돌릴 수 있다.</p>

<h3 id='____centralized_vcs'>중앙집중식 버전 관리 시스템 (Centralized VCS)</h3>

<p>프로젝트를 진행하다 보면 다른 개발자와 함께 작업해야 하는 경우가 많다. 이럴 때 생기는 문제를 해결하기 위해 CVCS(Centralized Version Control System)가 개발됐다. CVS, Subversion, Perforce 같은 시스템은 모든 파일을 관리하는 서버가 별도로 있고 많은 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)한다. 수년 동안 이러한 시스템들이 많은 사랑을 받았다.</p>

<p><center><img src="/figures/ch1/18333fig0102-tn.png"></center><br/> 그림 1-2. 중앙집중식 버전 관리 (CVCS) 다이어그램.</p>

<p>CVCS 환경은 로컬 VCS에 비해 장점이 많다. 프로젝트에 참여한 사람이면 누가 무엇을 하고 있는지 알 수 있다. 관리자는 누가 무엇을 할 수 있는지 꼼꼼하게 관리할 수 있다. 모든 클라이언트의 로컬 데이터베이스를 관리하는 것보다 VCS 하나를 관리하기가 훨씬 쉽다.</p>

<p>그러나 CVCS 환경은 몇 가지 치명적인 결점이 있다. 가장 대표적인 것이 중앙 서버에 발생한 문제다. 만약 서버가 한 시간 동안 다운되면 그동안 아무도 다른 사람과 협업할 수 없고 사람들이 하는 일을 백업할 방법도 없다. 그리고 중앙 데이터베이스가 있는 하드디스크에 문제가 생기면 프로젝트의 모든 히스토리를 잃는다. 물론 사람마다 하나씩 가진 Snapshot은 괜찮다. 로컬 VCS 시스템도 이와 비슷한 결점이 있고 이런 문제가 발생하면 모든 것을 잃는다.</p>

<h3 id='___distributed_vcs'>분산형 버전 관리 시스템(Distributed VCS)</h3>

<p>분산형 버전 관리 시스템(DVCS)을 설명할 차례다. Git, Mecurial, Bazaar, Darcs 같은 DVCS에서는 클라이언트가 파일의 마지막 Snapshot을 Checkout 하지 않는다. 그냥 저장소를 전부 복제한다. 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있다. 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다. 모든 Checkout은 모든 데이터를 가진 진정한 백업이다.</p>

<p><center><img src="/figures/ch1/18333fig0103-tn.png"></center><br/> 그림 1-3. 분산형 버전 관리 시스템(DVCS) 다이어그램.</p>

<p>게다가 대부분의 DVCS 환경에서는 리모트 저장소가 존재할 수 있다. 리모트 저장소가 많다고 해도 문제없다. 그래서 사람들은 동시에 다양한 그룹과 다양한 방법으로 협업할 수 있다. 계층 모델 같은 중앙집중식 시스템으로는 할 수 없는 몇 가지 워크플로우도 사용할 수 있다.</p>

<div id='nav'>
<a href='ch1-0.html'>prev</a> | <a href='ch1-2.html'>next</a>
</div>
17 changes: 17 additions & 0 deletions book/ko/ch1-2.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
layout: master
title: Pro Git 1.2 시작하기 짧게 보는 Git의 역사
---
<h2 id='__git_'>짧게 보는 Git의 역사</h2>

<p>인생을 살다 보면 여러 가지 일들이 벌어지듯이 Git의 삶 또한 창조적인 파괴와 모순 속에서 시작되었다. 리눅스 커널은 굉장히 규모가 큰 오픈소스 프로젝트다. 리눅스 커널의 일생에서 대부분 시절은 패치와 단순 파일(Archived file)로만 관리했다. 2002년에 드디어 리눅스 커널은 BitKeeper라고 불리는 상용 DVCS를 사용하기 시작했다.</p>

<p>2005년에 커뮤니티가 만드는 리눅스 커널과 이익을 추구하는 회사가 개발한 BitKeeper의 관계는 틀어졌다. BitKeeper의 무료 사용이 제고된 것이다. 이 사건은 리눅스 개발 커뮤니티(특히 리눅스 창시자 리누스 토발즈)가 자체 도구를 만드는 계기가 됐다. Git은 BitKeeper를 사용하면서 배운 교훈을 기초로 다음과 같은 목표를 세웠다:</p>

<p>* 빠른 속도 * 단순한 구조 * 비선형적인 개발(수천 개의 동시 다발적인 브랜치) * 완벽한 분산 * 리눅스 커널 같은 대형 프로젝트에도 유용할 것(속도나 데이터 크기 면에서)</p>

<p>Git은 2005년 탄생하고 나서 아직도 초기 목표를 그대로 유지하고 있으면서도 사용하기 쉽게 진화하고 성숙했다. Git은 미친 듯이 빨라서 대형 프로젝트에 사용하기도 좋다. Git은 동시다발적인 브랜치에도 끄떡없는 슈퍼 울트라 브랜칭 시스템이다 (3장 참고).</p>

<div id='nav'>
<a href='ch1-1.html'>prev</a> | <a href='ch1-3.html'>next</a>
</div>
73 changes: 73 additions & 0 deletions book/ko/ch1-3.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
layout: master
title: Pro Git 1.3 시작하기 Git 기초
---
<h2 id='git_'>Git 기초</h2>

<p>Git의 핵심은 뭘까? 이 질문은 Git을 이해하는데 굉장히 중요하다. Git이 무엇이고 어떻게 동작하는지 이해한다면 쉽게 Git을 효과적으로 사용할 수 있다. Git을 배우려면 Subversion이나 Perforce 같은 다른 VCS를 사용하던 경험을 지워버려야 한다. Git은 미묘하게 달라서 다른 VCS에서 쓰던 개념으로는 헷갈릴 거다. 사용자 인터페이스는 매우 비슷하지만, 정보를 취급하는 방식이 다르다. 이런 차이점들을 이해하면 Git을 사용하는 것이 어렵지 않다.</p>

<h3 id='__snapshot'>차이점이 아니라 Snapshot</h3>

<p>Subversion과 Subversion 비슷한 놈들과 Git의 가장 큰 차이점은 데이터를 다루는 방법에 있다. 큰 틀에서 봤을 때 대부분의 VCS 시스템이 관리하는 정보는 파일들의 목록이다. CVS, Subversion, Perforce, Bazaar 등의 시스템은 파일의 집합으로 정보를 관리한다. 각 파일의 변화를 그림 1-4처럼 시간순으로 관리한다.</p>

<p><center><img src="/figures/ch1/18333fig0104-tn.png"></center><br/> 그림 1-4. 각 파일에 대한 변화(차이점)를 저장하는 시스템들.</p>

<p>Git은 이런 식으로 데이터를 저장하지도 취급하지도 않는다. 대신 Git의 데이터는 파일 시스템의 Snapshot이라 할 수 있으며 크기가 아주 작다. Git은 Commit 하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여긴다. 파일이 달라지지 않았으면 Git은 성능을 위해서 파일을 저장하지 않는다. 단지 이전 상태의 파일에 대한 링크만 저장한다. Git은 그림 1-5처럼 동작한다.</p>

<p><center><img src="/figures/ch1/18333fig0105-tn.png"></center><br/> 그림 1-5. Git은 시간순으로 프로젝트의 Snapshot을 저장한다.</p>

<p>이것이 Git이 다른 VCS와 구분되는 점이다. 이점 때문에 Git는 다른 시스템들이 과거로부터 답습해왔던 버전 컨트롤의 개념의 많은 부분을 새로운 관점에서 바라본다. Git은 강력한 도구를 지원하는 작은 파일시스템이다. Git은 단순한 VCS가 아니다. 이제 3장에서 설명할 Git 브랜치를 사용하면 얻게 되는 이득이 무엇인지 설명한다.</p>

<h3 id='____'>거의 모든 명령을 로컬에서 실행</h3>

<p>거의 모든 명령이 로컬 파일과 데이터만 사용하기 때문에 네트워크에 있는 다른 컴퓨터는 필요 없다. 대부분의 명령어가 네트워크의 속도에 영향을 받는 CVCS에 익숙하다면 Git이 매우 놀라울 것이다. Git의 이런 특징에서 나오는 미칠듯한 속도는 오직 Git느님만이 구사할 수 있는 초인적인 능력이다. 프로젝트의 모든 히스토리가 로컬 디스크에 있기 때문에 모든 명령을 순식간에 실행된다.</p>

<p>예를 들어 프로젝트의 히스토리를 조회하려 할 때 Git은 서버가 필요 없다. 그냥 로컬 데이터베이스에서 히스토리를 읽어서 보여 준다. 그래서 눈 깜짝할 사이에 히스토리를 조회할 수 있다. 어떤 파일의 현재 버전과 한 달 전의 상태를 비교해보고 싶을 때도 Git은 그냥 한 달 전의 파일과 지금의 파일을 로컬에서 찾는다. 파일을 비교하기 위해 리모트에 있는 서버에 접근하고 나서 예전 버전을 가져올 필요가 없다.</p>

<p>즉 오프라인 상태에서도 비교할 수 있다. 비행기나 기차 등에서 작업하고 네트워크에 접속하고 있지 않아도 Commit 할 수 있다. 다른 VCS 시스템에서는 불가능한 일이다. Perforce는 서버에 연결할 수 없을 때 할 수 있는 일이 별로 없다. Subversion이나 CVS에서도 마찬가지다. 데이터베이스에 접근할 수 없어서 파일을 편집할 수는 있지만, Commit 할 수 없다. 매우 사소해 보이지만 실제로 이 상황에 부닥쳐보면 느껴지는 차이가 매우 크다.</p>

<h3 id='git_'>Git의 무결성</h3>

<p>Git은 모든 데이터를 저장하기 전에 체크섬(Checksum 또는 Hash)을 구하고 그 체크섬으로 데이터를 관리한다. 체크섬 없이 어떠한 파일이나 Directory도 변경할 수 없다. 체크섬은 Git에서 사용하는 가장 기본적인(Atomic) 데이터 단위이자 Git의 기본 철학이다. Git 없이는 체크섬을 다룰 수 없어서 파일의 상태도 알 수 없고 데이터를 잃어버릴 수도 없다.</p>

<p>Git은 SHA-1 Hash를 사용하여 체크섬을 만든다. 만든 체크섬은 40자 길이의 16진수 문자열이다. 파일의 내용이나 Directory 구조를 이용하여 체크섬을 구한다. SHA-1은 아래처럼 생겼다.</p>

<pre><code>24b9da6552252987aa493b52f8696cd6d3b00373</code></pre>

<p>Git은 모든 것을 Hash로 식별하기 때문에 이런 값은 여기저기서 보일 것이다. 실제로 Git은 파일을 이름으로 저장하지 않고 해당 파일의 Hash로 저장한다.</p>

<h3 id='git___'>Git은 데이터를 추가할 뿐</h3>

<p>Git으로 무얼 하든 데이터가 추가된다. 되돌리거나 데이터를 삭제할 방법이 없다. 다른 VCS처럼 Git도 Commit 하지 않으면 변경사항을 잃어버릴 수 있다. 하지만, 일단 Snapshot을 Commit하고 나면 데이터를 잃어버리기 어렵다.</p>

<p>Git을 사용하면 프로젝트가 심각하게 망가질 걱정 없이 매우 즐겁게 여러 가지 실험을 해 볼 수 있다. Git이 데이터를 어떻게 저장하고 손실을 복구할 수 있는지 좀 더 알아보려면 9장 살펴본다.</p>

<h3 id='__'>세 가지 상태</h3>

<p>이 부분은 중요하기에 집중해서 읽어야 한다. Git을 공부하기 위해 반드시 짚고 넘어가야 할 부분이다. Git은 파일을 Commited, Modified, Staged 이렇게 세 가지 상태로 관리한다. Commited란 데이터가 로컬 데이터베이스에 안전하게 저장됐다는 것을 의미한다. Modified는 수정한 파일을 아직 로컬 데이터베이스에 Commit 하지 않은 것을 말한다. Staged란 현재 수정한 파일을 곧 Commit 할 것이라고 표시한 상태를 의미한다.</p>

<p>이 세 가지 상태는 Git 프로젝트의 세 가지 단계와 연결돼 있다. Git Directory, Working Directory, Staging Area 이 세 가지 단계를 이해하고 넘어가자.</p>

<p><center><img src="/figures/ch1/18333fig0106-tn.png"></center><br/> 그림 1-5. Working Directory, Staging Area, Git Directory</p>

<p>Git Directory는 Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. Git Directory가 Git의 핵심이다. 다른 컴퓨터에 있는 저장소를 Clone 할 때 Git Directory가 만들어진다.</p>

<p>Working Directory는 프로젝트의 특정 버전을 Checkout 한 것이다. Git Directory는 지금 작업하는 디스크에 있고 그 Directory에 압축된 데이터베이스에서 파일을 가져와서 Working Directory를 만든다.</p>

<p>Staging Area는 Git Directory에 있다. 단순한 파일이고 곧 Commit 할 파일에 대한 정보를 저장한다. 종종 인덱스라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다.</p>

<p>Git으로 하는 일은 기본적으로 다음과 같다:</p>

<ul>
<li>Working Directory에서 파일을 수정한다.</li>

<li>Staging Area에 파일을 Stage 해서 Commit 할 Snapshot을 만든다.</li>

<li>Staging Area에 있는 파일들을 Commit 해서 Git Directory에 영구적인 Snapshot으로 저장한다.</li>
</ul>

<p>Git directory에 있는 파일들은 Committed 상태이다. 파일을 수정하고 Staging Area에 추가했다면 Staged이다. 그리고 Checkout하고 나서 수정했지만, 아직 Staging Area에 추가하지 않았으면 Modified이다. 2장에서 이 상태에 대해 좀 더 자세히 배운다. 특히 Staging Area를 어떻게 이용하는지 혹은 아예 생략하는 방법도 설명한다.</p>

<div id='nav'>
<a href='ch1-2.html'>prev</a> | <a href='ch1-4.html'>next</a>
</div>
Loading