공개 SW 솔루션설치 & 활용가이드 응용 SW > 협업관리 제대로배워보자 How to Use Open Source Software Open Source Software Installation & Application Guide
CONTENTS 1. 개요 2. 기능요약 3. 실행환경 4. 설치및실행 5. 기능소개 6. 활용예제 7. FAQ 8. 용어정리
- 3-1. 개요 소개 주요기능 분산형버전컨트롤시스템 (Distributed Version Control System) Linux 커널소스코드의버전컨트롤위해리누스토발즈에의해개발 텍스트형태에특화된, 그러나거의모든파일의버전컨트롤 분산된개발자들간의협업위한구조와프로토콜제공 빠른속도와성능 대분류 응용 SW 소분류 협업관리 라이선스형태 GPL v2 사전설치솔루션 N/A 실행하드웨어 일반데스크탑사양의하드웨어버전 2.19.1 (2018 년 10 월기준 ) 특징보안취약점개발회사 / 커뮤니티공식홈페이지 분산된버전컨트롤과협업지원 기존분산시스템대비빠른속도제공 리눅스, 윈도우, MacOS 등대다수운영체제지원 Github, gitlab, sourceforge, bitbucket 등다수의프로젝트관리서비스에서 git 지원 취약점 ID : CVE-2017-1000117 심각도 : 8.8 HIGH(V3) 취약점설명 : Git 'ssh : // URL 처리결함으로원격사용자가대상시스템에서임의의명령실행가능 대응방안 :2.14.1 이상으로업데이트 참고경로 : https://www.securityfocus.com/bid/100283 Git 개발커뮤니티 / git@vger.kernel.org https://git-scm.com
- 4-2. 기능요약 로컬시스템내에서의버전관리 (init, add, commit) 버전별변경내용, 시간, 변경내용요약메세지관리 (log, show, status, diff) 개발분기화와분기된개발버전간통합 (branch, merge) 특정버전으로의회귀 (checkout) 특정변경내용의취사적통합 (cherry-pick) 최신원격저장소로의변경사항재적용 (rebase) 특정변경유발한버전찾는바이너리탐색 (bisect) 분산된원격저장소관리 (clone, remote)
- 5-3. 실행환경 대다수의리눅스배포판과 Mac OS 에는 git 이설치되어있음 Git 공식사이트 (https://git-scm.com/downloads) 에서운영체제별설치파일다운로드 받을수있음 커맨드프롬프트에서 git v 명령통해현재설치된 git 버전확인가능 다양한 GUI 클라이언트가존재하며 (https://git-scm.com/downloads), 다수의 IDE 에서도 git 지원 본문서는 Ubuntu 16.04 에서터미널통해 git 사용하는경우설명
- 6-4. 설치및실행 세부목차 4.1 저장소만들기 (git init) 4.2 파일들의버전상태확인하기 (git status) 4.3 변경된내용새로운버전으로만들기 (git add, git commit) 4.4 현재변경한내용보기 (git diff) 4.5 버전기록보기 (git log) 4.6 특정파일제거한버전만들기 (git rm) 4.7 이전버전으로되돌리기 (git revert)
- 7-4. 설치및실행 4.1 저장소만들기 (git init)(1/2) 저장소는 git 으로버전관리하는대상파일들과버전관리정보담는디렉토리 Repository 또는 repo 라고도줄여서부름 특정디렉토리에서 git init 명령어입력하면해당디렉토리가 git 저장소로초기화 쓰기 / 읽기권한만있다면어떤계정으로어떤디렉토리에서작업하는지는상관없음 저장소가정상적으로초기화되면메시지가뜸 저장소로사용할디렉토리생성하고그안으로이동 $ mkdir the_repo; cd the_repo $ git init Initialized empty Git repository in the_repo/.git/ $
- 8-4. 설치및실행 4.1 저장소만들기 (git init)(2/2) Git 저장소는버전컨트롤대상이되는파일들이존재하는공간 ( 워킹스페이스 ) 과버전컨트롤위한관리정보 (metadata) 담는공간으로나뉨 워킹스페이스의파일들은 git 저장소디렉토리에존재 후자는.git 라는이름의디렉토리로 git 저장소디렉토리아래존재하며, 리눅스에서. 으로시작하는이름의파일 / 디렉토리는숨김설정되므로평범하게는보이지않음 ls a 명령어사용하면숨김파일도볼수있으므로,.git 디렉토리확인 $ ls -a....git $
- 9-4. 설치및실행 4.2 파일들의버전상태확인하기 (git status) 저장소내에서 git status 명령통해현재저장소내의파일들의상태알수있음 저장소디렉토리내에존재하지만아직버전정보가관리되지않고있는파일, 마지막버전 이후변경내용이존재하는파일, 삭제된파일등표시 $ echo hello > hello $ git status On branch master hello 라는텍스트담고있는, hello 라는이름의파일생성 Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) hello 저장소디렉토리에존재하지만이저장소에서버전이관리되지않고있는파일 nothing added to commit but untracked files present (use "git add" to track)
- 10-4. 설치및실행 4.3 변경된내용새로운버전으로만들기 (git add, git commit) git add 명령통해특정파일들의현재내용이다음버전이될것 git 에알릴수있음 git commit 명령은 git add 통해등록된내용실제버전으로만듬, -m 옵션통해해당 버전에대한설명하는메시지등록 $ git add hello $ git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: hello Hello 파일이다음버전으로변경될것임의미 $ git commit -m "Add hello file" [master (root-commit) 1b8505e] initial commit 1 file changed, 1 insertion(+) create mode 100644 hello $
- 11-4. 설치및실행 4.4 현재변경한내용보기 (git diff) git diff 명령통해현재버전관리중인파일의변경된내용볼수있음 $ echo hello world > hello $ git diff diff --git a/hello b/hello index ce01362..3b18e51 100644 --- a/hello +++ b/hello @@ -1 +1 @@ -hello +hello world $ hello 파일의내용이 hello 에서 hello world 로변경되었음의미
- 12-4. 설치및실행 4.4 버전기록보기 (git log)(1/2) git log 명령통해그동안의버전정보볼수있음 이정보에는버전의 ID, 해당버전만든사람, 해당버전이만들어진시간, 해당버전에남 긴메시지가있음 $ git log commit 71ab1baad6e376fce4ee240b0ffa438a2f11ac10 Author: SeongJae Park <sj38.park@gmail.com> Date: Mon Oct 29 07:29:31 2018 +0900 hello: Update to hello world 버전의 ID 이버전만든사람 이버전이만들어진시간 commit b209ff04de1f1f20778ddd764055252c7691eb05 Author: SeongJae Park <sj38.park@gmail.com> Date: Mon Oct 29 07:29:07 2018 +0900 $ Add hello file
- 13-4. 설치및실행 4.4 버전기록보기 (git log)(2/2) git show 명령통해특정버전의전버전대비변경내용볼수있음, 인자로버전 ID 줘서 어떤버전의전버전대비변경내용볼지지정 $ git show 71ab1 commit 71ab1baad6e376fce4ee240b0ffa438a2f11ac10 Author: SeongJae Park <sj38.park@gmail.com> Date: Mon Oct 29 07:29:31 2018 +0900 71ab1 으로시작하는버전 ID 의버전의상세정보요청 hello: Update to hello world diff --git a/hello b/hello index ce01362..3b18e51 100644 --- a/hello +++ b/hello @@ -1 +1 @@ -hello +hello world hello 였던내용 hello world 로변경했음.
- 14-4. 설치및실행 4.5 특정파일제거한버전만들기 (git rm) git rm 명령은다음버전부터더이상버전관리하지않파일지정 git commit 명령통해다음버전만들어줘야실제로해당파일이버전관리대상에서사라 짐 $ git rm hello rm 'hello' sjpark@kabylab:~/git_solution$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: hello sjpark@kabylab:~/git_solution$ git commit -m "hello: Stop version control" [master ed5b186] hello: Stop version control 1 file changed, 1 deletion(-) delete mode 100644 hello sjpark@kabylab:~/git_solution$ git status On branch master nothing to commit, working tree clean
- 15-4. 설치및실행 4.6 이전버전으로되돌리기 (git revert) git revert 명령은특정버전에서변경한내용무효화하는버전만듦 명령수행시무효화버전의메시지입력하는텍스트에디터가뜸, 메시지저장하고에디 터종료하면파일내용이이전버전으로되돌려진걸볼수있음 $ git revert ed5b1 [master afc4a5d] Revert "hello: Stop version control" 1 file changed, 1 insertion(+) create mode 100644 hello sjpark@kabylab:~/git_solution$ git log commit afc4a5d677df21e51d92edad587fcac3ec833bc5 Author: SeongJae Park <sj38.park@gmail.com> Date: Mon Oct 29 07:45:04 2018 +0900 ed5b1 으로시작하는 id 의버전의변경내용되돌린다. Revert "hello: Stop version control" This reverts commit ed5b1866f08603444364b56fd04b523aa2de58e6. commit ed5b1866f08603444364b56fd04b523aa2de58e6 Author: SeongJae Park <sj38.park@gmail.com> Date: Mon Oct 29 07:39:42 2018 +0900 hello: Stop version control
- 16-5. 기능소개 세부목차 5.1 브랜치개념 5.2 브랜치목록보기 5.3 브랜치생성및이동하기 5.4 다른브랜치와병합하기
- 17-5. 기능소개 5.1 브랜치개념 (1/2) 두개의버전사이에전 / 후 ( 부모, 자식이라고도함 ) 관계가존재 하나의버전이두개이상의자식버전가질수도있으며, 저장소의버전들은하나의뿌리를공유하지만여러개의가지 (branch) 갖는나무처럼보여질수있음 각각의가지브랜치라하며, 기존과다른개발과정으로분기하는데사용 버전은두개이상의부모버전가질수도있음, 두개의브랜치의최신버전부모로갖는버전만드는것두개의브랜치병합 (merge) 한다고표현 Initial commit 브랜치 A 브랜치 B
- 18-5. 기능소개 5.1 브랜치개념 (2/2) 브랜치는다양한목적으로사용될수있으며, git 에서매우많이사용되는기능 빠른시일내에릴리즈가예정되어있는데그때까지마무리하기어려운신규기능구현하는경우라면별도브랜치에서신규기능구현하고, 릴리즈후에기존브랜치에해당신규기능병합시킬수있음신규기능이별도브랜치에서개발되는동안, 빠른시일내에수정가능한간단한버그는기존브랜치에서재빨리수정하고릴리즈할수있음 Initial commit Quick fix 버전 1 릴리즈 릴리즈브랜치 신규기능브랜치
- 19-5. 기능소개 5.2 브랜치목록보기 git branch 명령은현재저장소에존재하는브랜치목록보여줌 목록중현재저장소가따라가고있는브랜치에는 * 표시, 새로 git commit 통해버전만들면해당브랜치는이 * 표시가된브랜치의최신버전됨 master 브랜치는 git init 시에기본적으로만들어주는브랜치 $ git branch * master $
- 20-5. 기능소개 5.3 브랜치생성및이동하기 git branch 명령에새브랜치이름인자로주면해당이름의브랜치생성 git checkout 명령에브랜치이름인자로주면해당브랜치로이동 브랜치이동하면워킹스페이스의파일들이해당브랜치최신버전의내용으로바뀜 브랜치이동후버전만들면이동된브랜치의최신버전됨 $ git branch * master $ git branch new_branch $ git branch * master new_branch $ git checkout new_branch Switched to branch 'new_branch' $ git branch master * new_branch
- 21-5. 기능소개 5.4 다른브랜치와병합하기 git merge 결과타겟브랜치최신버전과현재브랜치의최신버전의내용이병합된새로운 버전생성 git merge 로생성된버전은현재브랜치의최신버전이되며, 현재브랜치의기존최신 버전과타겟브랜치의최신버전부모브랜치로갖게됨 $ git merge new_branch Merge made by the 'recursive' strategy. bye 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bye $ git log --graph --oneline * 0fb9c35 Merge branch 'new_branch' \ * 41f0c59 Add bye file * ed5b186 hello: Stop version control * 71ab1ba hello: Update to hello world / * b209ff0 Add hello file $ master 브랜치의최신버전 new_branch 브랜치의최신버전 master 브랜치의버전 master 브랜치의버전
- 22-6. 활용예제 세부목차 6.1 원격저장소개념 6.2 원격저장소복사하기 6.3 원격저장소추가하기 6.4 원격저장소의버전가져오기 6.5 원격저장소로버전보내기 6.6 패치만들기 6.7 패치보내고받기 6.8 패치주고받는다른방법들
- 23-6. 활용예제 6.1 원격저장소개념 과거의중앙형버전관리시스템의저장소는중앙서버와클라이언트로구성되어, 모든버전데이터는서버에존재하고, 개발자들은클라이언트통해여기접속하는구조였음 Git 은서버 / 클라이언트없이모든개발자가자신의저장소가지며저장소간에버전정보를주고받으며협업할수있게하는분산버전관리시스템의형태임 따라서별도로중앙저장소가존재하지않고, 남들의저장소중공신력있는개발자의저장소에개발한내용이모이게되고, 그렇게모인최신버전다른개발자들이자신의저장소에가져가게되는, 유연하고안정적인협업모델구축 남의저장소원격저장소 (remote repository) 라고함
- 24-6. 활용예제 6.2 원격저장소복사하기.git 디렉토리로접근가능한프로토콜제공하는저장소는해당프로토콜통해복사가가능 하며, 주로사용되는프로토콜은 http, https, ssh 등이고, git 독자프로토콜존재 git clone 명령통해원격저장소자신의컴퓨터위로복사가능 복사된저장소는명령내린디렉토리아래생성됨 저장소의원격저장소정보는 git remote 명령통해확인가능 $ git clone https://github.com/git/git Cloning into 'git'... remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 257917 (delta 0), reused 0 (delta 0), pack-reused 257916 Receiving objects: 100% (257917/257917), 102.83 MiB 11.28 MiB/s, done. Resolving deltas: 100% (190967/190967), done. $ ls git $ cd git; git remote -v origin https://github.com/git/git (fetch) origin https://github.com/git/git (push) $
- 25-6. 활용예제 6.3 원격저장소추가하기 프로젝트의기능별로다른관리자가존재하는경우 (Linux 커널이이에해당 ) 특정기능관리자의저장소가해당기능위한최신버전가지고있으므로여러원격저장소추가하고필요에따라각저장소의파일가져와작업해야함 git remote add 명령통해직접원격저장소추가할수있음 $ git remote add korg git://git.kernel.org/pub/scm/git/git.git $ git remote -v korg git://git.kernel.org/pub/scm/git/git.git (fetch) korg git://git.kernel.org/pub/scm/git/git.git (push) origin https://github.com/git/git (fetch) origin https://github.com/git/git (push) $
- 26-6. 활용예제 6.4 원격저장소의버전가져오기 git remote update 명령은원격저장소의버전들가져옴 git fetch < 원격저장소이름 > 명령통해특정원격저장소의버전들만가져올수있음 git checkout 명령에 < 원격저장소이름 >/< 원격저장소의브랜치이름 > 인자로줘서특정원격저장소의특정브랜치파일워킹스페이스로가져올수있음 $ git remote update Fetching origin Fetching korg $ git fetch origin $ git checkout origin/master Note: checking out 'origin/master'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.
- 27-6. 활용예제 6.5 원격저장소로버전보내기 git push < 원격저장소이름 > < 브랜치이름 > 명령은특정저장소로특정브랜치의버전들 보냄 해당원격저장소로쓰기권한이있어야만가능 $ git push self master Username for 'https://github.com': sjp38 Password for 'https://sjp38@github.com': Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 358 bytes 0 bytes/s, done. Total 3 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), completed with 2 local objects. To https://github.com/sjp38/git.git c670b1f..1597845 master -> master $
- 28-6. 활용예제 6.6 패치만들기 협업하는경우라면자신이만든버전의파일상대방과공유해야함 간단한내용은변경사항담은패치만들어프로젝트관리자에게보내고, 이걸프로젝트관리자가자신의저장소에반영하는게일반적임 git format-patch < 버전 > 명령이용해대상버전으로부터현재워킹스페이스버전사이의버전들패치파일들로만들수있음 $ git format-patch origin/master 0001-README-Meaninglessly-for-example.patch $ cat 0001-README-Meaninglessly-for-example.patch origin 원격저장소의 master 브랜치최신버전으로부터현재최신버전사이의버전들패치로만들어냄 From dbeaa067e34816c3bc638679342186e5b66abae7 Mon Sep 17 00:00:00 2001 From: SeongJae Park <sj38.park@gmail.com> Date: Mon, 29 Oct 2018 09:40:09 +0900 Subject: [PATCH] README: Meaninglessly for example
- 29-6. 활용예제 6.7 패치보내고받기 git send-email 명령통해특정패치파일특정사용자에게이메일로보낼수있음 메일전송위해서메일서버설정은별도로해줘야함 git am 명령은남들로부터받은패치자신의저장소적용 $ git send-email --to sj38.park@gmail.com 0001-README-Meaninglessly-forexample.patch 0001-README-Meaninglessly-for-example.patch From: SeongJae Park <sj38.park@gmail.com> To: sj38.park@gmail.com Subject: [PATCH] README: Meaninglessly for example Date: Mon, 29 Oct 2018 09:47:31 +0900 $ git am 0001-README-Meaninglessly-for-example.patch Applying: README: Meaninglessly for example $ git log --oneline 1597845 README: Meaninglessly for example c670b1f Sixth batch for 2.20 16ce0b9 Merge branch 'js/mingw-default-ident'
- 30-6. 활용예제 6.8 패치주고받는다른방법들 협업자들간에수정한내역주고받는데는이외에도다양한방법있음 작은프로젝트에서는하나의원격저장소에협업자모두가 git push 하기도함 타인이접근할수있는자신의저장소에최신버전올려두고타인에게자신의저장소주소와최신버전올려둔브랜치이름알려줘서타인이직접해당버전들가져갈수있게하기도하며, 이런이야기알리는메시지풀리퀘스트 (pull request) 라고함 Git 저장소호스팅및협업서비스제공하는 github에서는 web interface 통해 pull request 주고받수있는기능제공
- 31-7. FAQ Q A git revert 는버전되돌린다는변경사항이남는데어떤기록도없이예전버전으로되돌릴수는없나요? 해당하는예전버전으로브랜치새로만들고거기서부터재시작하는방법도있 습니다. 그외에도 git reset hard 등의명령이용하는방법이있습니다만, 일반적으로권장되는방법이아니라이문서에서는설명하지않습니다. Q 꼭 CLI 로 git 다뤄야만하나요? A 문서에서도설명했듯 git 위한많은 GUI 도구들이나와있습니다. 하지만모 든 GUI 도구들이모든 git 기능지원하는건아니라서일부심화기능은사용 이어려울수도있습니다.
- 32-8. 용어정리 용어 저장소 (Repository) 커밋 (Commit) 브랜치 (Branch) 원격저장소 (Remote repository) 푸시 (Push) 패치 (Patch) 풀리퀘스트 (Pullrequest) 설명 Git 이용해관리되는파일들과그관리정보담는디렉토리 버전만드는행위, 또는특정버전의스냅샷 부모 - 자식관계로엮인버전들의연결 https, ssh, git 등의프로토콜통해접근가능한타인의 git 저장소 로컬저장소의변경사항원격저장소로업데이트하는행위 소스코드의변경사항설명하는파일 자신의버전이어느주소의원격저장소에있으니자신의저장소로가져가달라는요청메시지
Open Source Software Installation & Application Guide 이저작물은크리에이티브커먼즈 [ 저작자표시 비영리 동일조건변경허락 2. 0 대한민국라이선스 ] 에따라이용하실수있습니다.