Table Of ContentPro Git
ScottChacon*
2014-11-28
*지금보시는문서는책「ProGit」의PDF파일입니다. 본문서는크리에이티브커먼즈저작자표시-비영
리-동일조건변경허락3.0(CreativeCommonsAttribution-NonCommercial-ShareAlike3.0)조건에
따라이용할수있습니다. 이책을통해Git을즐겁게배울수있기를바랍니다. 출판된책을Amazon웹사이
트http://tinyurl.com/amazonprogit에서구입하시면원저자인ScottChacon과Apress출판사에게큰도움이됩
니다.
도서출판인사이트를통해서한국어판이2013년4월19일에출판되었습니다.한국어번역에대한자세한정보는
https://github.com/progit/progit/tree/master/ko에서확인해주세요.
목차
1 시작하기 1
1.1 버전관리란? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1 로컬버전관리시스템 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2 중앙집중식버전관리시스템 . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.3 분산버전관리시스템 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 짧게보는Git의역사 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Git기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.1 델타가아니라스냅샷 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.2 거의모든명령을로컬에서실행 . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.3 Git의무결성 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.4 Git은데이터를추가할뿐 . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.5 세가지상태. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Git설치 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4.1 소스코드로설치하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.2 리눅스에설치 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.3 Mac에설치하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.4 윈도에설치 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 Git최초설정 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5.1 사용자정보 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5.2 편집기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5.3 Diff도구 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5.4 설정확인 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.6 도움말보기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.7 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Git의기초 13
2.1 Git저장소만들기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.1 기존디렉토리를Git저장소로만들기 . . . . . . . . . . . . . . . . . . . . 13
2.1.2 기존저장소를Clone하기 . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 수정하고저장소에저장하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.1 파일의상태확인하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.2 파일을새로추적하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.3 Modified상태의파일을Stage하기. . . . . . . . . . . . . . . . . . . . . 16
2.2.4 파일무시하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.5 Staged와Unstaged상태의변경내용을보기 . . . . . . . . . . . . . . . 19
2.2.6 변경사항커밋하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
iii
2.2.7 StagingArea생략하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.8 파일을삭제하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.9 파일이름변경하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3 커밋히스토리조회하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3.1 조회제한조건 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3.2 GUI도구로히스토리를시각화하기 . . . . . . . . . . . . . . . . . . . . . 31
2.4 되돌리기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4.1 커밋수정하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4.2 파일상태를Unstage로변경하기 . . . . . . . . . . . . . . . . . . . . . . 33
2.4.3 Modified파일되돌리기 . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5 리모트저장소 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.5.1 리모트저장소확인하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.5.2 리모트저장소추가하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.5.3 리모트저장소를Pull하거나Fetch하기 . . . . . . . . . . . . . . . . . . . 36
2.5.4 리모트저장소에Push하기 . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.5.5 리모트저장소살펴보기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.5.6 리모트저장소이름을바꾸거나리모트저장소를삭제하기 . . . . . . . . . . 38
2.6 태그 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.6.1 태그조회하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.6.2 태그붙이기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.6.3 Annotated태그 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.6.4 태그에서명하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.6.5 Lightweight태그 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.6.6 태그검증하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.6.7 나중에태그하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.6.8 태그공유하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.7 팁과트릭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.7.1 자동완성 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.7.2 GitAlias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.8 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3 Git브랜치 47
3.1 브랜치란무엇인가? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2 브랜치와Merge의기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2.1 브랜치의기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.2.2 Merge의기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.2.3 충돌의기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.3 브랜치관리 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.4 브랜치Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.4.1 Long-Running브랜치 . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.4.2 토픽브랜치 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.5 리모트브랜치 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.5.1 Push하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.5.2 브랜치추적 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.5.3 리모트브랜치삭제 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.6 Rebase하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
iv
3.6.1 Rebase의기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.6.2 좀더Rebase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.6.3 Rebase의위험성 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.7 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4 Git서버 75
4.1 프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.1.1 로컬프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
장점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
단점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.1.2 SSH프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
장점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
단점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.1.3 Git프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
장점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
단점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.1.4 HTTP/S프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
장점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
단점 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.2 서버에Git설치하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.2.1 서버에Bare저장소넣기 . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.2.2 바로설정하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
SSH접근 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.3 SSH공개키만들기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.4 서버에설정하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.5 공개하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.6 GitWeb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.7 Gitosis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.8 Gitolite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.8.1 설치하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.8.2 자신에게맞게설치하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.8.3 설정파일과접근제어규칙. . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.8.4 “deny”규칙을꼼꼼하게제어하기 . . . . . . . . . . . . . . . . . . . . . . 94
4.8.5 파일단위로Push를제어하기 . . . . . . . . . . . . . . . . . . . . . . . . 94
4.8.6 Personal브랜치 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.8.7 “와일드카드”저장소 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.8.8 그밖의기능들 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.9 Git데몬 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.10HostedGit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.10.1GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.10.2계정설정하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.10.3저장소만들기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.10.4Subversion으로부터코드가져오기(Import) . . . . . . . . . . . . . . . . 101
4.10.5동료추가하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.10.6내프로젝트 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.10.7프로젝트Fork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
v
4.10.8GitHub요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.11요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5 분산환경에서의Git 105
5.1 분산환경에서의Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.1.1 중앙집중식Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.1.2 Integration-ManagerWorkflow . . . . . . . . . . . . . . . . . . . . . 106
5.1.3 DictatorandLieutenantsWorkflow . . . . . . . . . . . . . . . . . . . 107
5.2 프로젝트에기여하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.2.1 커밋가이드라인 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.2.2 비공개소규모팀 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.2.3 비공개대규모팀 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.2.4 공개소규모팀 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.2.5 대규모공개프로젝트 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.2.6 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3 프로젝트운영하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3.1 토픽브랜치에서일하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3.2 이메일로받은Patch를적용하기 . . . . . . . . . . . . . . . . . . . . . . 126
apply명령을사용하는방법 . . . . . . . . . . . . . . . . . . . . . . . . . 127
am명령을사용하는방법 . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.3.3 리모트브랜치로부터통합하기 . . . . . . . . . . . . . . . . . . . . . . . . 130
5.3.4 무슨내용인지확인하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
5.3.5 기여물통합하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
MergeWorkflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
대규모MergeWorkflow . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Rebase와Cherry-PickWorkflow. . . . . . . . . . . . . . . . . . . . . 135
5.3.6 릴리즈버전에태그달기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
5.3.7 빌드넘버만들기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
5.3.8 릴리즈준비하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
5.3.9 Shortlog보기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
5.4 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
6 Git도구 139
6.1 리비전조회하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6.1.1 리비전하나가리키기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6.1.2 짧은SHA-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6.1.3 SHA-1해시값에대한단상 . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.1.4 브랜치로가리키기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.1.5 RefLog로가리키기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.1.6 계통관계로가리키기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
6.1.7 범위로커밋가리키기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
DoubleDot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
세개이상의레퍼런스 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
TripleDot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
6.2 대화형명령어 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
6.2.1 StagingArea에파일추가하고추가취소하기 . . . . . . . . . . . . . . . . 147
vi
6.2.2 파일의일부분만StagingArea에추가하기 . . . . . . . . . . . . . . . . . 149
6.3 Stashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
6.3.1 하던일을Stash하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
6.3.2 Stash되돌리기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
6.3.3 Stash를적용한브랜치만들기. . . . . . . . . . . . . . . . . . . . . . . . 153
6.4 히스토리단장하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.4.1 마지막커밋을수정하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.4.2 커밋메시지를여러개수정하기 . . . . . . . . . . . . . . . . . . . . . . . 154
6.4.3 커밋순서바꾸기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.4.4 커밋합치기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.4.5 커밋분리하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
6.4.6 filter-branch는포크레인 . . . . . . . . . . . . . . . . . . . . . . . . . 159
모든커밋에서파일을제거하기 . . . . . . . . . . . . . . . . . . . . . . . 159
하위디렉토리를루트디렉토리로만들기 . . . . . . . . . . . . . . . . . . . 160
모든커밋의이메일주소를수정하기 . . . . . . . . . . . . . . . . . . . . . 160
6.5 Git으로버그찾기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
6.5.1 파일어노테이션 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
6.5.2 이진탐색 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
6.6 서브모듈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
6.6.1 서브모듈시작하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
6.6.2 서브모듈이있는프로젝트Clone하기 . . . . . . . . . . . . . . . . . . . . 166
6.6.3 슈퍼프로젝트 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
6.6.4 서브모듈사용할때주의할점들 . . . . . . . . . . . . . . . . . . . . . . . 168
6.7 SubtreeMerge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
6.8 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
7 Git맞춤 173
7.1 Git설정하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.1.1 클라이언트설정 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
core.editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
commit.template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
core.pager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
user.signingkey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
core.excludesfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
help.autocorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.1.2 컬러터미널 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
color.ui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
color.* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.1.3 다른Merge,Diff도구사용하기. . . . . . . . . . . . . . . . . . . . . . . 177
7.1.4 소스포맷과공백 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
core.autocrlf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
core.whitespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
7.1.5 서버설정 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
receive.fsckObjects. . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
receive.denyNonFastForwards . . . . . . . . . . . . . . . . . . . . . 181
receive.denyDeletes . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
vii
7.2 GitAttribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
7.2.1 바이너리파일 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
바이너리파일이라고알려주기 . . . . . . . . . . . . . . . . . . . . . . . . 182
바이너리파일Diff하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
MSWord파일 . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
OpenDocument파일 . . . . . . . . . . . . . . . . . . . . . . . 184
이미지파일 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
7.2.2 키워드치환 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
7.2.3 저장소익스포트하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
export-ignore. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
export-subst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.2.4 Merge전략. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.3 Git훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.3.1 훅설치하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.3.2 클라이언트훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
커밋Workflow훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
E-mailWorkflow훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
기타훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
7.3.3 서버훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
pre-receive와post-receive . . . . . . . . . . . . . . . . . . . . . . . 191
update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
7.4 정책구현하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
7.4.1 서버훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
커밋메시지규칙만들기 . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
ACL로사용자마다다른규칙적용하기 . . . . . . . . . . . . . . . . . . . . 194
Fast-ForwardPush만허용하기 . . . . . . . . . . . . . . . . . . . . . . 196
7.4.2 클라이언트훅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
7.5 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
8 Git으로이전하기 203
8.1 Git과Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
8.1.1 gitsvn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
8.1.2 설정하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
8.1.3 시작하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
8.1.4 Subversion서버에커밋하기 . . . . . . . . . . . . . . . . . . . . . . . . 206
8.1.5 새로운변경사항받아오기 . . . . . . . . . . . . . . . . . . . . . . . . . . 207
8.1.6 Git브랜치문제 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
8.1.7 Subversion의브랜치. . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
SVN브랜치만들기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
8.1.8 Subversion브랜치넘나들기 . . . . . . . . . . . . . . . . . . . . . . . . 210
8.1.9 Subversion명령 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
SVN형식의히스토리 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
SVN어노테이션 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
SVN서버정보 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Subversion에서무시하는것무시하기 . . . . . . . . . . . . . . . . . . . 212
8.1.10Git-Svn요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
viii
8.2 Git으로옮기기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.2.1 가져오기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.2.2 Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.2.3 Perforce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
8.2.4 직접Importer만들기. . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
8.3 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
9 Git의내부 225
9.1 Plumbing명령과Porcelain명령 . . . . . . . . . . . . . . . . . . . . . . . . . . 225
9.2 Git개체 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
9.2.1 Tree개체 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
9.2.2 커밋개체 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
9.2.3 개체저장소 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
9.3 Git레퍼런스 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
9.3.1 HEAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
9.3.2 태그 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
9.3.3 리모트레퍼런스 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
9.4 Packfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
9.5 Refspec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
9.5.1 RefspecPush하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
9.5.2 레퍼런스삭제하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.6 데이터전송프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.6.1 Dumb프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.6.2 스마트프로토콜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
데이터업로드 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
데이터다운로드 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
9.7 운영및데이터복구 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
9.7.1 운영 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
9.7.2 데이터복구 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
9.7.3 개체삭제 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
9.8 요약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
ix