Git Magic

Size: px
Start display at page:

Download "Git Magic"

Transcription

1 Git Magic Ben Lynn 2007 년 8 월 서문 Git 은버전관리계의스위스아미나이프정도로보면됩니다. 아주유연하고믿을수있지만그만큼배우기는어려울수도있는본버전관리시스템을마스터해봅시다! Arthur C. Clarke 는충분히발전한기술은마술과같다고말하였습니다. Git 도마찬가지입니다. 초보자들은 Git 이어떻게돌아가는지알필요가없으며 Git 이라는간단한장치가어떻게친구들과적들을놀라게하는지만알면됩니다. 세부사항들을설명하는대신에, 우리는몇몇기능들의대략적인설명을하려합니다. 여기에설명된기 능들을자주사용하다보면각각의명령어들이어떻게작동하는지알게될것입니다. 그리고그명령어들을적용하여새로운일들을해낼수있겠지요. Simplified Chinese: by JunJie, Meng and JiangWei. Converted to Traditional Chinese via cconv -f UTF8-CN -t UTF8-TW. French: by Alexandre Garel, Paul Gaborit, and Nicolas Deram. hosted at itaapy. Also German: by Benjamin Bellee and Armin Stebich; also hosted on Armin s website. Italian: by Mattia Rigotti. Korean: by Jung-Ho (John) Han; also hosted on John s website. Polish: by Damian Michna. Brazilian Portuguese: by José Inácio Serafini and Leonardo Siqueira Rodrigues. Russian: by Tikhon Tarnavsky, Mikhail Dymskov, and others. Spanish: by Rodrigo Toledo and Ariset Llerena Tapia. Ukrainian: by Volodymyr Bodenchuk. Vietnamese: by Trần Ngọc Quân; also hosted on his website. Single webpage: CSS 없는 HTML 버전. 1

2 PDF file: 프린팅버전. Debian package, Ubuntu package: 이웹사이트의사본. server is offline. Handy when this Physical book [Amazon.com]: 64 pages, 15.24cm x 22.86cm, black and white. 전기가들어오지않을때유용. 고맙습니다! 많은분들께서번역에힘써주셔서저는어떻게몸둘바를모르겠습니다. 이분들을통해더많은독자들을만날수있어서정말기쁘고감사드립니다. Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael Budde, Richard Albury, Tarmigan, Derek Mahar, Frode Aannevik, Keith Rarick, Andy Somerville, Ralf Recker, Øyvind A. Holm, Miklos Vajna, Sébastien Hinderer, Thomas Miedema, Joe Malin, Tyler Breisacher, Sonia Hamilton, Julian Haagsma, Romain Lespinasse, Sergey Litvinov, Oliver Ferrigni, David Toca,, Joël Thieffry, and Baiju Muthukadan 수정및편집에힘써주셧습니다.. François Marier 는 Daniel Baumann 이개발한 Debian 패키지를관리합니다. 고마워해야할사람들이많지만은여기에다쓸수는없는노릇입니다. 그래도만약에제가이웹사이트에실수로이름을개제하지않았다면연락을주시거나패치를만들어주세요! 라이센스 이가이드는 the GNU General Public License version 3 통해발간되었습니다. 자연스레소스콛드들은 Git 저장소에저장되어있습니다 : $ git clone git://repo.or.cz/gitmagic.git # Creates "gitmagic" directory. 아니면다음미러사이트들에도소스코드가저장되어있을겁니다.: $ git clone git://github.com/blynn/gitmagic.git $ git clone git://gitorious.org/gitmagic/mainline.git $ git clone $ git clone git://git.assembla.com/gitmagic.git $ git clone git@bitbucket.org:blynn/gitmagic.git GitHub, Assembla, Bitbucket 은사적인저장소를지지합니다. Assembla 와 Bitbucket 은무료로제공되고있습니다. 2

3 도입부 저는비유법을사용하여버전관리시스템에대하여설명해보려합니다. org/wiki/revision_control 를방문하셔서덜정신나간버전의설명을보시길권장합니다. 일하는것은곧노는것 저는거의평생을컴퓨터게임을하며지냈습니다. 하지만어른이되서야버전관리시스템을사용하기시 작했지요. 이런건저혼자가아닐것이라생각합니다. 그럼으로써 Git 을게임에비유하며설명하는것이 Git 을이해하는데도움이될것이라생각합니다. 코드나문서를편집하는작업이게임을하는것과같다고생각해보세요. 편집을마친후에는세이브하고싶겠지요. 그렇게하기위해서는당신의믿음직한에디터에서세이브버튼을누르면될것입니다. 그러나이러한행동은예전세이브를덮어쓰는결과를초래하죠. 세이브슬롯이한개밖에없는옛날구형 게임을생각하면됩니다. 다시말하자면, 세이브를할수는있지만, 당신은예전세이브포인트로돌아 갈수없는것입니다. 이건참 게임을아주재미있는순간에세이브를해놓았는데돌아갈수없다는것이 죠. 더나쁜상황으로는, 당신의세이브는더이상이길수없는상태에되어있을수도있습니다. 그럴경우에는아주처음부터다시시작해야되겠지요. 버전관리 편집시, 다른이름으로저장기능및사본을다른디렉토리에만들어놓는방법등을이용해오래된버전을 보존할수는있습니다. 용량을효율적으로사용하기위해서압축을할수도있죠. 이것은참원시적인버 전컨트롤방법입니다. 컴퓨터게임은이런과정에서발전해나간지오래되었지요. 요즘게임들은여러개의세이브슬롯을잘활용하고있습니다. 이문제를좀더꼬아서보죠. 어떤프로젝트나웹사이트를구성하는소스코드와같이여러개의파일이하 나로묶여있다고가정합시다. 현버전의프로젝트 / 웹사이트를세이브하고싶다면모든디렉토리를기 록해야한다는번거로움이있지요. 일일이많은버전들을관리한다는것은그리효율적이지않을겁니다. 어떤컴퓨터게임들은정말로모든디렉토리를각개관리하는형식으로게임을세이브하기도합니다. 이 런게임들은이런불필요하게세부적인사항들을게이머들이보지못하게하고간편한인터페이스를통해게이머들이세이브파일들을관리할수있게해둡니다. 버전관리시스템은이런컨셉과그리다르지않습니다. 버전관리시스템들은디렉토리등을관리하기에 편한인터페이스로구성되어있습니다. 원하는만큼세이브및불러오기를실행할수있습니다. 컴퓨터 게임들과는다르게용량을효율적으로사용하는데에는탁월한성능을보여주죠. 대부분의케이스는소 수의파일들만살짝편집을하게되죠. 디렉토리전체를세이브하는것보다는버전과버전사이의차이를세이브하는것이용량을효율적으로쓰는버전컨트롤의비밀입니다. 3

4 분산제어 어려운컴퓨터게임을한다고생각해보세요. 너무어렵기때문에전세계의프로게이머들이팀을구성해이게임을끝내보겠다고합니다. 게임을빨리끝내는것에초점을두는스피드런이현실적인예이지요 : 각기다른특기를가지고있는게이머들이각자자신있는부분에서활약함으로써성공적인결과를만들어내는것을예로들어봅니다. 어떻게시스템을구축해두어야게이머들이서로의세이브파일들을올리거나이어받을수있을까요? 예전에게임들은중앙집중식버전관리시스템을사용하였습니다. 한개의서버가모든게임세이브파일 을저장했었지요. 그서버외에는아무것도그세이브파일들을관리할수있지않았습니다. 풀어말하면, 게이머들은각자의컴퓨터에몇개의세이브파일들을가지고있었고, 게임을진행하고싶을때에는, 파일들이저장되어있는서버에서다운로드받은후, 게임을좀하다가, 다시다른게이머들이진행할수있게그서버에업로드해놓아야합니다. 만약에어떠한이유에서라도한게이머가예전에세이브해두었던파일을불러오고싶다면어떻게될까 요? 현재세이브시점은아무리잘해도이길수없는상태로저장이되어있을지도모르고, 게이머들은현 시점보다전으로돌아가서아까못구했던강력한아이템을얻을수있는시점으로돌아가고싶을지도모 릅니다. 그런게아니라면그들은아마도세이브파일두개를비교하여한특정게이머가얼마나진행을해두었는지알고싶어할지도모릅니다. 예전세이브파일을불러오고싶은이유는여러가지일수있습니다, 그러나방법은한가지일수밖에없지 요. 중앙서버에서불러오는방법말입니다. 더많은세이브파일을원할수록서버와의통신이더잦아질수밖에없지요. 새로운세대의버전관리시스템들은 (Git 을포함하여 ), 분산제어를기본으로합니다. 예전의중앙 관리방식의보편화된방식이라고생각하면되지요. 한게이머가서버로부터세이브파일을받는다면하 나만받게되는것이아니라모든세이브파일받게되는겁니다. 중앙서버를각자의컴퓨터에미러링한다고보시면됩니다. 처음에는시간이많이걸릴수있습니다. 특히그세이브파일이아주긴역사를가지고있다면말이지요. 그러나이것은길게보면아주효율적인방법입니다. 이방법을통해즉시이득을볼수있는점을따진다면, 예전세이브파일을원할때중앙서버와교신을하지않아도된다는점이지요. 멍청한미신 분산제어시스템에대한보편적인오해가있다면, 이시스템은공식적인중앙저장소가필요한프로젝트 에는적합하지않다고생각하는것입니다. 이것은말도안되는오해이지요. 이오해는누군가의사진을 찍는다는것은그피사체의영혼을빨아온다는말도안되는논리와같습니다. 다시말하면, 중앙저장소의파일을사본하는것이중앙저장소의중요성을훼손한다는것이아닙니다. 중앙버전관리시스템이할수있는모든일들은잘짜여진분산관리시스템이더잘할수있다는것을알아 야합니다. 네트워크상의자원들은기본적으로로컬상의자원들보다비경제적일수밖에없습니다. 나 중에도말씀드리겠지만분산제어시스템도문제점이없는시스템은아닙니다. 그러나주먹구구식의생 각으로중앙관리시스템과분산관리시스템을비교하는일은없어야할것입니다. 다음인용문이이것을대변해줍니다. 규모가작은프로젝트는어떤시스템으로부터부분적인특성만이필요할지모르지만, 규모가작은프로젝트를잘못스케일링하는시스템은마치로마숫자를이용해작은숫자들의계산을실행하는것과같다. 4

5 더욱이당신의프로젝트는당신이생각했던것보다더큰일이될지도모릅니다. 처음부터 Git 을사용 한다는것은아무리병뚜껑을여는데만쓴다하여도스위스아미나이프를들고다니는것과같은것입니 다. 드라이버가필요할경우당신은병따개를들고다니지않았다는사실에안도의한숨을쉴수있을것입니다. 결합의오류 이주제를설명하기위해서는컴퓨터게임에비유하는것은더이상적합하지않을수있습니다. 대신에여기서는문서편집에비유해서설명드리도록하죠. 앨리스는파일편집중첫줄에새로운줄을추가하고, 밥은그파일의마지막에한줄을넣는다고가정합니 다. 그들은편집된파일을업로드합니다. 대부분의시스템은자동으로두사람이한편집을받아들이고병합할것입니다. 결과적으로는앨리스와밥두사람의편집이적용될것입니다. 자이제앨리스와밥이같은부분에서서로다른편집을한다고가정해봅니다. 인간의직접적인개입없이 는불가능하겠지요. 누가편집을하던두번째로편집하는사람은 merge conflict 라는메세지를볼 수밖에없겠지요. 한사람만의편집을선택하거나두사람의편집과는다른세번째편집을생각해봐야할겁니다. 더복잡한상황이일어날수있습니다. 버전관리시스템은간단한상황들을알아서해결해줍니다. 어려운상황은인간의손에맡기지요. 시스템의행동은대체적으로조정가능합니다. == 기본적인요령 == Git 명령어의바다속에곧바로빠지는것보단, 다음기본적인예제를통해서천천히배우는방법이좋을것입니다. 표면적으로는간단하게보이지만, 이곳예제들은앞으로많은도움이될것입니다. 저역시도처음 Git 을사용할때에는아래에있는예제외에다른것들은건들여보지도않았습니다. 상태 (state) 저장하는방법 === 무엇인가대단한것을해보고싶으시다고요? 그러시기전에, 현디렉토리에들어있는모든파일의스냅샷을찍어봅시다 : $ git init $ git add. $ git commit -m "My first backup" 만약에편집을하다가잘못됬다면, 예전의편집되기전의깨끗한버전을되돌리면됩니다 : $ git reset --hard 다시 state 를저장하고싶다면 : $ git commit -a -m "Another backup" 5

6 파일더하기 (add), 지우기 (delete), 이름바꾸기 (rename) 위의간단한요령들은처음 git add 명령어를실행했을때이미존재하던파일들만저장하게됩니다. 새로운파일들이나하위디렉토리들을추가했다면 : $ git add readme.txt Documentation 그리고만약에원하지않는파일을 Git 에서없애려면 : $ git rm kludge.h obsolete.c $ git rm -r incriminating/evidence/ 이렇게함으로써 Git 은지정한파일들을지워주게됩니다. 파일이름바꾸기는원치않는현재의이름을지우고새로운이름을새롭게지정하는컨셉과같습니다. 좀더손쉬운방법으로는 git mv 명령어가있습니다. 예를들어 : $ git mv bug.c feature.c 고급 undo 와 redo 가끔씩은작업을하다가하던일을멈추고전버전으로돌아가고싶다거나, 한시점이후의모든편집을지우고싶을때가있을것입니다. 그렇다면 : $ git log 이명령어는최근에 commit 들을정리한리스트와그의 SHA1 을보여줍니다. commit 766f d240ba b8b8f11c664 Author: Bob <bob@example.com> Date: Tue Mar 14 01:59: Replace printf() with write(). commit 82f5ea346a2e a8653c0f58dc151275c Author: Alice <alice@example.com> Date: Thu Jan 1 00:00: Initial commit. Hash 앞의알파벳몇개만으로도 commit 을세분화설정하실수있습니다 ; 다른방법으로는, hash 전문을복사 / 붙여넣기하는방법도있지요 : $ git reset --hard 766f 위명령어를입력하시면설정된 commit 으로돌아갈수있으며그후의새로운 commit 들은영구적으로삭제됩니다. 가끔씩은또아주예전의 state 로잠시만돌아가길원하실수있습니다. 그럴경우에는 : $ git checkout 82f5 6

7 이명령어는새로운 commit 들을보존함과동시에과거의시간으로잠시돌아가게해줍니다. 그러 나, SF 영화에서처럼, 과거에돌아간상태에서편집을하고 commit 을한다면다른시간대의현실 을만들어가게되는것이죠. 왜냐하면당신의편집이과거의편집과는다르게입력이되었기때문입니다. 이런대체현실을 branch ( 나뭇가지 ) 라고부릅니다 simpara_title 에관해선추후에자세히설명 합니다 >>. 지금알고계셔야할것은 $ git checkout master 이것은현재시간의 state 로오게해줄것입니다. 그리고 Git 이푸념을놓기전에편집했던사항들이있다면 master branch 로돌아오기전 commit 을하거나 reset 을하시길바랍니다. 컴퓨터게임과또다시비교해본다하면 : git reset --hard: 예전에세이브해뒀던게임으로돌아가며, 돌아간시점이후의세이브들을모두삭제합니다. git checkout: 예전에세이브해뒀던게임으로돌아가며, 돌아간시점이후의게임들은처음세이브와다른길을가게됩니다. 추후의모든세이브들은다른 branch 로써새로운현실세계를만들게됩니다 simpara_title 에관해선추후에자세히설명합니다 >>. 예전의파일 / 하위디렉토리들을되돌리고싶을때다음명령어를이용함으로써필요한파일 / 하위디렉토리만을되돌릴수있습니다 : $ git checkout 82f5 some.file another.file 그러나이 checkout 핸들이다른파일들을조용히덮어씌우기할수있다는점을알아두세요. 이러 한사고를방지하고싶다면 checkou 명령어를쓰기전에 commit 을이용하세요. Git 을처음이용하는분들은특히더조심하시기바랍니다. 대체적으로파일이삭제될까두려우시다면 *git commit -a* 를우선해놓고생각하세요. Hash 를자르고붙여넣기싫으시다고요? 그렇다면 : $ git checkout :/"My first b" 이명령어를사용함으로써이 message 로 commit 을해두었던 state 로돌아갈수있습니다. 그리고이다음명령어로 5 번스텝전의 state 로돌아갈수도있습니다 : $ git checkout master~5 되돌리기 (Reverting) 법정에서는어떠한일에관해서는기록에서지울수있습니다. 이런식으로, Git 에서는원하는 commit 을정해서없던일로할수있습니다. $ git commit -a $ git revert 1b6d 이렇게하는것으로특정 hash 에대한 commit 을 undo 할수있습니다. 이렇게되돌린 state 는새로운 commit 으로인식되어 *git log* 에기록됩니다. 7

8 변경기록만들기 어떤프로젝트들은 changelog. 필요로합니다. 다음명령어를이용해변경기록을만들어봅시다.: $ git log > ChangeLog 파일다운로드하기 Git 으로관리되는프로젝트사본을얻기위해서는 : $ git clone git://server/path/to/files 예를들어, 본웹사이트를만들기위해사용한파일들을얻기위해서는 : $ git clone git://git.or.cz/gitmagic.git 곧 clone 명령어에관해많은것을소개하도록하겠습니다. 최첨단기술 git clone 명령어를이용해어떤프로젝트의사본을다운로드했다면, 다음명령어를이용해그프로젝트의최신버전으로업그레이드할수있습니다 : $ git pull 즉석발행 당신이다른사람들과공유하고싶은스크립트를작성했다고가정합니다. 당신은그들에게당신의컴퓨 터에서다운로드를받으라고할수있지만, 당신친구들이만약당신이편집하는도중에받게된다면, 그 들은예상치못한트러블에걸릴수있습니다. 이러한이유때문에릴리스사이클이란것이존재하는것입 니다. 개발자들은개발중인프로젝트에자주들락날락거릴것이고, 그들은남앞에내놓을만한프로젝트로만들어지기전까지남들에게보여주게되지않을겁니다. Git 으로이런문제를해결할려면, 당신의스크립트가들어있는디렉토리에서 : $ git init $ git add. $ git commit -m "First release" 그리고당신들친구들에게다음명령어를사용하도록하십시오 : $ git clone your.computer:/path/to/script 그들이이렇게하면당신의스크립트를다운로드할수있을것입니다. 이작업은 ssh 접근을가정합니 다. 그렇지않다면, 당신은 git daemon 명령어를쓴후친구들에게다음명령어를써보라고합니다 : $ git clone git://your.computer/path/to/script 8

9 이렇게하고난다음부터당신의스크립트가준비되었을때마다다음명령어를실행하면됩니다 : $ git commit -a -m "Next release" 당신의친구들은다음명령어를사용함으로써가장최근버전으로당신의스크립트를보유하고있을수있게되죠 : $ git pull 그들은절대로당신이보여주고싶지않은버전의스크립트를보는일이없을것입니다. 제가도대체뭘한거죠? 마지막으로한 commit 으로부터어떤변화가있었는지확인하기위해서는 : $ git diff 아니면어제부터어떤변화가있었는지확인하기위해서는 : $ git diff "@{yesterday}" 아니면어떤특정버전에서부터 2 번째전버전사이의변화를확인하기위해서는 : $ git diff 1b6d "master~2" 각각의결과는 *git apply* 와함께적용할수있는패치가될것입니다. 다음명령어도사용해보세요 : $ git whatchanged --since="2 weeks ago" 저는가끔씩 qgit 에들어가서히스토리를체크하곤합니다. 이웹사이트는깨끗한그래픽인터페이스 로구성되어있어보기쉽지요. 아니면, tig, 텍스트형식인터페이스역시느린연결방식을가지고있는 분들에겐도움이될것입니다. 또다른방법으로는웹서버를설치한후 *git instaweb* 명령어를사용하는방법도있겠지요. 연습 우선 A, B, C, D 를각각연속된 commit 이라고가정합니다. 그리고 B 는 A 에서몇개의파일 들이삭제된버전으로가정합니다. 문제는여기서몇몇파일들을 D 에더하고싶을때어떻게하는건가입니다. 세가지의해답을찾을수있겠군요. 우선우리가현재 D 에있다고생각합시다 : 1. A 와 B 의차이점은몇개의파일들이없어진것뿐입니다. 우리는이차이점을패치로작성하여적용할수있습니다.: $ git diff B A git apply 2. 우리는 A 에파일을저장해두었기에, 그곳에서다시받아올수있겠지요 : $ git checkout A foo.c bar.h 3. 또는 A 에서 B 까지로갈때의변화를 undo 한다고생각하셔도됩니다 : 9

10 $ git revert B 어떤방법이가장좋은해답일까요? 답은본인이원하는것이곧해답입니다. Git 을이용한다면당신이원하는것은쉽게해낼수있고, 그것을해내는방법은한가지만있는것이아닐겁니다. 클론만들기 구식의버전관리시스템에서는체크아웃명령어가파일들을가져오는보편적인방법이었습니다. 저장된포인트로부터많은파일들을불러올수있죠. Git 을포함한다른분산제어시스템에서는클론만들기를보편적인방법으로채택하고있습니다. 파일을얻기위해서는, 원하는파일들이저장되어있는저장소에서 클론 을만들어야합니다. 즉, 중앙 관리서버를미러링해오는것과같은이치라고설명할수있습니다. 주저장소가할수있는모든것들을당신이이제할수있는것이죠. 컴퓨터동기화 기본적인동기화및백업을할때 tarball 을만드는것과 *rsync* 명령어를사용하는것은어느정도견딜수있습니다. 그러나저는가끔씩노트북에서편집을할때도있고, 데스크탑에서할때도있는데, 이두개의컴퓨터는그리많은대화를나누지않을지도모릅니다. 한컴퓨터에서 Git 저장소를초기화하고파일들을 commit 함으로써이문제를해결할수있습니다. 그후다른컴퓨터에서 : $ git clone other.computer:/path/to/files 위명령어를이용해서두번째파일 /Git 저장소사본을만들수있습니다. 그다음부터는, $ git commit -a $ git pull other.computer:/path/to/files HEAD 을이용하여현재사용중인컴퓨터로다른컴퓨터에있는파일들을당겨올 (pull) 수있습니다. 만약 에같은파일에대해서전후가맞지않는편집을했을경우, Git 은당신에게에러메세지로먼저이모순을해결후 commit 을할것을알려줄것입니다. 고전적인소스관리 우선 Git 저장소를초기화해줍니다 : $ git init $ git add. $ git commit -m "Initial commit" 그리고중앙서버에서, 아무디렉토리에서나간단한저장소를초기화해줍니다 : $ mkdir proj.git $ cd proj.git 10

11 $ git --bare init $ touch proj.git/git-daemon-export-ok 필요하다면 Git daemon 을실행합니다 : $ git daemon --detach # it may already be running Git 호스팅서비스를한다면우선빈 Git 저장소를만들어야합니다. 대부분웹페이지에서어떠한문서를작성하곤하죠. 다음명령어를사용해당신의프로젝트를중앙서버로 ' 밀어넣기 (push)' 할수있습니다 : $ git push central.server/path/to/proj.git HEAD 소스를확인하고싶을때에개발자는다음명령어를사용합니다 : $ git clone central.server/path/to/proj.git 편집이끝난후에개발자는다음명령어를사용해로컬드라이브에각종바뀐사항들을저장을합니다 : $ git commit -a 가장최신버전으로로컬파일들을갱신하려면 : $ git pull 결합상의곤란한점들은다음 commit 명령어를사용하면대부분해결될것입니다 : $ git commit -a 로컬에서바뀐사항들을중앙저장소로저장하기위해서는 : $ git push 주서버가다른개발자들로인하여새로운변경사항이생겼을경우에는, 밀어넣기 (Push) 는실패 할것입니다. 그렇다면그개발자는최신버전을다시당겨서 (pull) 결합후다시밀어넣기를시도해야하겠지요. 모든개발자들은 push 와 pull 에관한 SSH 접근권이있어야합니다. 그러나소스는모든이들에게개방된것으로써다음명령어를이용하면조회가가능합니다 : $ git clone git://central.server/path/to/proj.git Git 프로토콜은 HTTP 와비슷합니다 : 증명서가존재하지않죠. 그래서아무나프로젝트를조회할수있는겁니다. 그런이유에서 밀어넣기 (push) 는 Git 프로토콜로는할수없게디폴트설정이되어있지요. 숨겨진소스 개방되어있지않은소스의프로젝트를진행할때에는터치 (Touch) 명령어를생략합니다. 그리 고 git-daemong-export-ok 라는이름의파일을만들지않도록주의합니다. 이렇게하면 git 프 로토콜을사용해서원치않는사람들이당신의저장소를조회할수있는일은없을것입니다 ; 이제는 SSH 접근권이있는사람들만조회할수있게될겁니다. 당신의모든저장소가개방되지않은경우에는 git daemon 명령어는필요없겠지요. 모든저장소는 SSH 접근방식을필요로할테니까요. 11

12 헐벗은저장소 이괴상한이름의저장소 (bare repository) 는현재작업중인디렉토리가아니기에이렇게이름이 붙여졌습니다 ; 이저장소는하위.git 디렉토리에서숨겨진파일들만을저장하는저장소입니다. 풀 어설명하면, 이저장소는현프로젝트의과거를관리하기만하고, 아무런버전도저장하지않는저장소입니다. 헐벗은저장소는버전관리중앙서버와비슷한기능을담당하고있고당신의프로젝트가저장되어있는 집과같은기능을담당하고있습니다. 개발자들은이곳에서부터클론을만들수있고, 편집한내용을 밀어넣기 (Push) 할수있습니다. 보편적으로헐벗은저장소는서버에서상주하고있다가데이터를 퍼트리는역할을맡고있습니다. 개발은만들어진클론에서이루어짐으로써, 워킹디렉토리없이서버내에서보호받는저장소역할을할수있습니다. 많은 Git 명령어들은 GIT_DIR 환경변수가저장소로 path 가세팅되어있지않는한이헐벗은저장소에인식되지않을것입니다. --bare 옵션을이용한다면모를까. 밀어넣기 (push) vs. 당기기 (pull) 당기기 (pull) 에의존하는대신에왜제가밀어넣기 (push) 를소개했을까요? 먼저, 당기기 (pull) 는아까소개드린헐벗은저장소에서는실행이되지않는명령어입니다 : 물론나중에소개할물어오기 (fetch) 라는명령어로같은일을할수있지만요. 그러나헐벗은것말고보통일반적인저장소 를중앙서버에저장해놓는다고해도, 당기기 (pull) 는번거로울수밖에없습니다. 서버에로그인을 해야될것이고그런후에야당기기 (pull) 을사용해야하다는말이지요. 파이어월이이런작업을방해할수도있습니다. 그리고쉘접근권한이없다면중앙서버에접속이나가능할런지요? 그러나이러한특수상황들이아니라면밀어넣기 (push) 를사용하실것을강추합니다. 목적지가현재작업중인디렉토리가있을경우에는굉장히햇갈릴수있기때문입니다. 줄여서, Git 을배울때에는, 헐벗은저장소일경우에는밀어넣기 (push) 아니면당기기 (pull) 을사용합시다. 프로젝트포크질 (forking) 하기 현재프로젝트가진행되고있는방식이마음에안드신다고요? 당신이좀더잘할수있다고생각하세요? 그렇다면당신서버에서 : $ git clone git://main.server/path/to/files 이명령어를쓴후에, 다른사람들에게당신이포크질 (fork) 을한프로젝트에대해알리세요. 이후아무때나원래프로젝트파일에서다음명령어를씀으로써어떠한변화가있었다면포크질해놓은프로젝트로병합을실행할수있습니다 : $ git pull 12

13 궁극의백업 아무도건들수없고지리적으로다양한곳에저장해놓고싶은기록보관소를소유하고싶다고요? 만약 당신의프로젝트에많은개발자들이참여한다면아무것도하지마십시오. 클론을만드신다면그클론자 체가아주효율적인프로젝트백업이될것입니다. 현상태의프로젝트뿐만이아니라, 그프로젝트의모 든과거버전까지말이죠. 만약이라도어떤개발자분의클론이훼손된다면암호화된 hashing 덕에다른모든개발자들이프로젝트훼손여부에관해알수있게될것입니다. 만약당신의프로젝트에그리많은개발자들이참여하지않는다면, 최대한많은서버를확보해서클론을만들어놓으십시오. 편집증이걸린개발자들은언제나프로젝트 HEAD 의 20- 바이트 SHA1 hash 를어딘가에는안 전하게모셔놓죠. 안전하다는말이사적인공간에저장해놓는다는말은아닙니다. 예를들면, 어떤신 문에기사를개제하는것도안전한기록보관의한방법이지요. 그정보를훼손하고자하는작자들이세상에발간된모든신문카피를바꿀수는없기때문입니다. 광속의멀티테스킹 만약에어떠한프로젝트의여러군데를동시에작업하고싶으실때에는우선프로젝트를한번 commit 한후다음명령어를사용합니다 : $ git clone. /some/new/directory hardlinking 덕분에클론들은적은시간과공간을이용해백업으로존재해줄수있습니다. 이렇게하면두개의독립적인구간에서작업을진행할수있습니다. 예로, 한클론이컴파일중다른클 론에서작업을진행하고있을수있습니다. 그리고다른클론으로부터아무때나 commit 과당기기 (pull) 도사용할수있습니다. $ git pull /the/other/clone HEAD 게릴라버전관리 당신은현재다른버전관리시스템을사용하고있지만, Git 을그리워하고있진않습니까? 그렇다면현재작업중인디렉토리에서 Git 을초기화시켜주십시오 : $ git init $ git add. $ git commit -m "Initial commit" 그리고클론을만들고 : $ git clone. /some/new/directory 이제방금클론된디렉토리에서작업을진행하시면됩니다. 가끔은다른개발자분들과동기화하고싶으시겠죠. 그개발자분들은아직 Git 을사용하고있지않아도우리 Git 에서는 : $ git add. $ git commit -m "Sync with everyone else" 13

14 그리고는새로운디렉토리에서 : $ git commit -a -m "Description of my changes" $ git pull 다른분들에게당신의작업을공유하는일은그쪽분들이쓰시는버전관리시스템에따라다릅니다. 새로 운디렉토리는당신이작업한파일들이포함되어있죠. 위의명령어를쓰신후에다른버전관리프로그램에서쓰는명령어를통해서그들의중앙서버에업로드하실수있습니다. Subversion 은가장좋은중앙버전관리식시스템으로써개발자들사이에서애용되고있습니다. Git 에서 *git svn* 을사용해서위에서언급한일들은 Subversion 저장소를대상으로행할수있습니다.Git 프로젝트를 Subversion 저장소로보내기. Mercurial Mercurial 역시비슷한버전관리시스템으로써 Git 과쉽게연동될수있습니다. hg-git 플러그인을통해서 Mercurial 유저들은 Git 저장소에쉽게밀어넣기 (push) 와당기기 (pull) 을사용할수있죠. Git 으로 hg-git 을구하는방법 : $ git clone git://github.com/schacon/hg-git.git Mercurial 로 hg-git 을구하는방법 : $ hg clone 하지만 Git 에이것과비슷한플러그인이있는지는모르겠다. 그렇기때문에 Mercurial 보다는 Git 을주저장소를쓰길선호한다. Mercurial 로프로젝트를진행할경우에는대부분의케이스에한자원봉사개발자가 Git 저장소를관리하는업무를떠맡곤합니다. 그러나 Git 으로 Mercurial 프로젝트를진행할경우에는 hg-git 플러그인의도움으로그러한번거로움이필요없을것입니다. 빈저장소를이용해서 Mercurial 저장소를 Git 저장소로바꿀수있으나, hg-fast-export.sh 스크립트를사용해더쉽게이작업을끝낼수있습니다. 다음저장소에서이스크립트를구할수있습니다 : $ git clone git://repo.or.cz/fast-export.git 빈저장소에서한번바꿔봅시다 : $ git init $ hg-fast-export.sh -r /hg/repo 위명령어는스크립트를 $PATH 에넣은후에실행합니다. Bazaar Bazaar 는 Git 과 Mercurial 다음으로많이알려진버전관리시스템입니다. 14

15 Bazaar 는작업수정을하기용이하게디자인되어있지요 ; 개발자들은과거의실수에서배우고무시해도될만한에러에서자유롭습니다. 그리고 Bazaar 를사용하는개발자들은다른버전관리시스템들에관해굉장히개방적인분들일겁니다. bzr-git 플러그인은 Bazaar 이용자들이 Git 저장소를통해작업할수있도록해줍니다. tailor 프로그램은 Bazaar 저장소를 Git 저장소로바꿔줍니다. bzr-fast-export 도한번검색해보세요. 내가 Git 을사용하는이유 제가 Git 을처음에사용했던이유는제가듣기에 Git 은 Linux kernel source 관리에용이하 다고들었기때문입니다. Git 을사용한이후로는다른버전관리시스템으로바꿔야겠다는생각은 들지도않았지요. Git 은저에게유용한도움이되었으나, Git 도완벽한플랫폼은아닙니다. 저는 Linux 를주로이용하기때문에다른플랫폼과의문제는생략하겠습니다. 그리고저는 C, bash scripts, Python 을이용하는사람이고빠른프로그램시간에목숨을거는사람중하나입니다. Git 이어떻게좀더발전할수있을지 Git 과비슷한프로그램도짜보기도했지만학교프로젝트정도로만썻 었을뿐입니다. 그러나제프로젝트를완료하더라도저는 Git 을계속이용했을겁니다. 제프로그램 을써도별로투자한것에비해얻을것이적어보였기때문이지요. 자연스레여러분들이필요로하고원 하는프로그램은계속해서바뀝니다. 그러나 Git 과는그럴가능성이매우적지요. == 나뭇가지 (branch) 마법 == Git 의죽이는기능들중에는즉석으로브랜칭및병합이가능하다는것입니다. 예시문제 : 외부적인요소들은불가피하게당신이하던일은그만두게합니다. 예를들어, 치명적인버 그가이미배포된버전에서경고없이퍼저나가게생겼습니다. 프로그램에새로넣어야할기능이있는데 데드라인은가까워져옵니다. 당신이도움을요청하고자했던개발자는퇴사할려고하니도움을요청할수도없고요. 시간이촉박한만큼하던일을멈추고버그를고치는데에올인을해야겠지요. 위와같이하던일을멈추는것은일의생산성을치명적으로떨어트립니다. 특히나지금까지하던일과정 상관없는부분의프로그램을건들어야할때말이죠. 이럴때, 중앙버전관리시스템을사용하는경우엔 작동이되는버그없는프로그램을다시받아야합니다. 분산관리시스템일경우에는원하는버전만로컬컴퓨터로받아내면되죠. 하지만클로닝은작업중인디렉토리포함그디렉토리의히스토리를어느선까지는같이다운로드받게 합니다. Git 은최대한효율성있게시스템이디자인되어있지만, 클로닝명령어를쓴다면프로젝트파일들이 ( 비효율적으로 ) 현재작업중인디렉토리에전부다시생성될것입니다. 해답 : Git 은이런상황에서좀더빠르고공간적으로효율성있게클로닝을할수있는명령어를가지고있습니다 : git branch 이런환상적인명령어를이용하여디렉토리에있는파일들은탈바꿈을감행해이버전과저버전을넘나 들수있습니다. 이변형기법은버전사이를넘나드는것외에도더많은것을할수있습니다. 당신의파일 들은전버전에서실험할있는임시버전, 개발버전, 친구들이보유하고있는버전등으로변형할수있습니다. 15

16 일하는척하기버튼 버튼하나만누르면 ( 일하는척하기버튼 ) 게임화면이최소화되고엑셀파일이화면상에나타나는기능을보신적이있을겁니다. 이기능을활용하면직장상사의눈을속이고일하던척할수있지요? 아무디렉토리에서 : $ echo "I'm smarter than my boss" > myfile.txt # 난내상사보다똑똑하다 $ git init $ git add. $ git commit -m "Initial commit" 우리는 난내상사보다똑똑하다 라는내용을가진텍스트파일을 Git 저장소에만들었습니다. 그리고 : $ git checkout -b boss # 이명령어를사용한후엔아무것도바뀌지않은것처럼보일겁니다. $ echo "My boss is smarter than me" > myfile.txt # 상사는나보다똑똑합니다 $ git commit -a -m "Another commit" 겉으로보기에는그텍스트파일을새로운 ( 맘에들지않는 ) 문장으로덮어씌우고 commit 을한것처럼보일겁니다. 그러나그건착각입니다. 다음명령어를입력해보세요 : $ git checkout master # 처음버전으로돌아가기 자! 그럼처음생성했던텍스트파일이돌아왔을겁니다. 만약에그상사가이사실을알아채고당신의디렉토리를살펴본다고할때는 : $ git checkout boss # 아까두번째로만들어놓은 " 상사는나보다똑똑합니다 " 라는메세지를담은 myf 이런식으로두가지다른버전의파일사이를오갈수있습니다. 그리고각각따로 commit 을할수있지요. 힘든작업 당신이어떤작업을하고있다고가정합니다. 작업도중에세버전전으로돌아가서새로운 print 라인을넣고테스팅해보고싶다는생각이들었습니다. 그럴때엔 : $ git commit -a $ git checkout HEAD~3 이제테스팅하고싶었던파일에더하고싶은것을걱정없이마구넣어도됩니다. 이미친짓 (?) 을 Commit 해놓을수도있습니다. 작업이다끝났다면, $ git checkout master 를사용해아까미친짓을하기전의작업상태로돌아올수있습니다. Commit 하지않았던작업들이같이딸려왔다는것을확인 ( 조심!) 할수있을겁니다. 아까그임시작업 ( 미친짓 ) 을세이브하고싶다면어떻게해야할까요? 쉽습니다 : $ git checkout -b dirty 16

17 를실행하여그나뭇가지 (branch) 에서마스터나뭇가지로돌아오기전에 commit 을하면됩니다. 그런후다시미친짓을할때의상태로돌아가고싶다면 : $ git checkout dirty 우리는이체크아웃이라는명령어를전에도설명했었죠. 여기서는이명령어가어떻게예전버전들을불 러오는지살펴볼수있었습니다 : 파일을원하는버전으로돌아가게할수있으나, master 나뭇가지를우선벗어나야하지요. 벗어난후의 commit 은 master 나뭇가지와는다른길을걷게될것입니다. 그길을나중에이름도지어줄수있지요. 다시말하면, 예전상태 (state) 에서벗어나면 Git 은자동으로이름이 ( 아직 ) 붙여지지않은새로 운나뭇가지로이동시켜줍니다. 이나뭇가지는 *git checkout -b* 로이름을바꿔저장해줄수있죠. 빠른해결책 작업중에갑자기하던일을멈추고 1b6d commit 에있는버그를고치라고부탁을받았다고생각해봅시다 : $ git commit -a $ git checkout -b fixes 1b6d 버그를다고친후에 : $ git commit -a -m "Bug fixed" $ git checkout master 이제아까잠시중단했던작업으로돌아갈수있습니다. 버그가고쳐진파일도병합해올수있죠 : $ git merge fixes 병합 (Merging) Git 을제외한어떤버전컨트롤시스템들을이용할땐나뭇가지 (branch) 들을만드는것은쉽지만나뭇가지들을병합하기는어려울지도모릅니다. Git 에서는병합작업이정말쉽고병합이진행되고있는중인지도모르는사이에끝날것입니다. 우리는병합을아까전에도소개했었습니다. 당겨오기 (pull) 명령어는 commit 들을가져와지금사용중인나뭇가지에병합하여줍니다. 로컬에서아무런편집작업을진행하지않았더라면 *pull* 은현나뭇가지를빨리감기하여중앙서버에서가장최근의정보를가져와병합합니다. 로컬에서편집 작업을한기록이있다면, Git 은자동으로병합을시도할것이고, 병합에버전간의차질이있다면당신에게보고할것입니다. Commit 은보통하나의 부모 commit 이있습니다. 병합을다르게생각해보면한 commit 이적어도두개의 부모 commit 이있다고생각할수있는것이죠. 그럼 HEAD~10 은어떤 commit 을가르키는걸까요? 부모가하나가아니라면어떤것을거슬러올라가야전버전에서작업할수있을까요? 17

18 Git 은먼저 commit 되었던부모를따르게설정되어있습니다. 현재작업중인나뭇가지가병합이실행될경우첫번째부모가되기때문에당연한겁니다.: 당신은언제나현나뭇가지에가장최근에한작업에만관심이있을수밖에없기때문이지요. 다른나뭇가지에서한작업은다음일입니다. 탈자기호 (ˆ) 를이용하서부모를수동으로정해줄수도있습니다. 예를들어두번째부모의기록을조회하고싶다면 : $ git log HEAD^2 첫번째부모의기록을조회할때는탈자기호이후의번호는생략해도됩니다. 굳이보여드리자면 : $ git diff HEAD^ 이표기법은다른형식의표기법과도병행해서사용할수있습니다 : $ git checkout 1b6d^^2~10 -b ancient ( 집중하십시오 ) 새로운나뭇가지인 ancient 를시작하고두번째부모의첫번째부모나뭇가지에서 1b6d 로시작하는 commit 과그 commit 전 10 개의 commit 을불러와줄것입니다. 방해받지않는작업진행 하드웨어관련작업을하다보면현재작업중인단계가완료되어야만다음단계진행이가능할것입니다. 자동차를예로들면외부로부터오기로했던부품들이도착해야비로소수리에들어갈수있겠지요. 프로토타입들은칩들이가공되어야건축이가능해지겠죠. 소프트웨어관련작업도비슷합니다. 다음작업이진행될려면현재작업이이미발표및테스트가되어있 어야할겁니다. 어떤작업들은당신의코드가받아들여지기전검토부터되어야겠지요. 그래서당신은그검토가끌날때까지는다음작업으로진행하지못할것입니다. 하지만나뭇가지와병합기능덕분에이규치을깨고파트 1 이완료되기도전에파트 2 에서미리작업을진행하고있을수있습니다. 파트 1 을 commit 하고검토를위해어디론가보냈다고생각하십시오. Master 나뭇가지에서있었다면, 그나뭇가지에서다른나뭇가지로갈아타야합니다 : $ git checkout -b part2 그리곤파트 2 에서 commit 을하며작업을계속진행하세요. 인간은실수를많이하는동물이기에 파트 1 으로다시돌아가서무엇인가고치고싶을지도모릅니다. 만약에당신이천재적인프로그래머라면다음명령어를사용할일은없겠지요. $ git checkout master # 파트 1 로 돌아갑니다. $ fix_problem # 수정 작업 $ git commit -a # 수정 작업을 commit 합니다. $ git checkout part2 # 파트 2 로 다시 갑니다. $ git merge master # 아까 파트 1 의 수정을 파트 2 로 병합합니다. 이때즈음이면이미파트 1 은허가받았겠지요. $ git checkout master # 파트 1 로돌아갑니다. $ submit files # 파일배포! $ git merge part2 # 파트 2 도파트 1 으로병합. $ git branch -d part2 # 파트 2 나뭇가지삭제. 18

19 이제파트 2 의모든것과함께 master 나뭇가지로돌아왔습니다. 나뭇가지는제한없이원하는만큼생성할수있습니다. 거꾸로도나뭇가지를만들수도 있죠 : 만약에 7 번의 commit 전에나뭇가지를하나만들어놓았어야함을늦게깨닫았을때, 다음명령어를이용해보세요 : $ git branch -m master part2 # master 나뭇가지의이름을 part2 로바꿉니다. $ git branch master HEAD~7 # 7 commit 전의상황에서 master 나뭇가지를새로만듭니다. Master 나뭇가지는이제 part 1 만들어있고, 나머지는모두 part 2 에들어가게되었습니다. 그리고우리는지금 part 2 에서작업을하고있는중이겠지요 ; master 를만들면서 master 로는현 재작업공간을옮겨가지않았습니다. 처음보시죠? 여태까지설명한예제들에서는나뭇가지를만들면서곧바로작업공간도같이옮겨갔었는데말이죠. 이런식으로요 : $ git checkout HEAD~7 -b master # 나뭇가지를만들고바로작업공간도그나뭇가지로옮긴다. 메들리의재정리 하나의나뭇가지에서모든작업을끝내고싶을수도있습니다. 작업중인일들은혼자만알고중요한 commit 들만다른사람들에게보여주고싶을수있습니다. 그럴경우엔두개의나뭇가지를우선만드세요 : $ git branch sanitized # 정돈된 commit 을보여주기위한나뭇가지를만듭니다. $ git checkout -b medley # 작업을하게될 " 메들리 " 나뭇가지를만들어이동합니다. 버그를고치던, 어떤기능을더하던, 임시코드를더하던작업을진행합니다. 물론 commit 을해가면서말이죠. 그리고 : $ git checkout sanitized $ git cherry-pick medley^^ 위의명령어들을차례로사용한다면 메들리 나뭇가지의 commit 들을 sanitzed 나뭇가지에 붙입니다. cherry-pick 명령어를잘사용한다면영구적인코드들만들어있는나뭇가지를만들수있습니다. 그리고그 commit 들은서로연계가잘되어있을것입니다. 나뭇가지관리하기 여태까지프로젝트에서생성한나뭇가지들을보려면 : $ git branch 기본적으로 master 나뭇가지에서작업을시작하는것이디폴트로지정되어있습니다. 그러나어 떤개발자들은 master 나뭇가지는그대로냅두고새로운나뭇가지를만들어서그곳에서작업하는것을선호합니다. -d* 와 *-m 옵션들은각각나뭇가지들을지우거나이름을바꿔줄수있는파라메터들입니다. *git help branch* 를보시면더욱자세히설명되어있을겁니다 ( 번역주 : 어차피영어입니다 ) master 나뭇가지는유용한관례적인이름의나뭇가지일뿐입니다. 다른개발자들은당신의저장소에당연히 master 라는이름을가진나뭇가지가있을것이라고생각하겠지요. 그리고그나뭇가 19

20 지는모든공식적인자료들일들어있다고넘겨짚을것입니다. 그러나당신은 master 를없에거나새로운이름을지정해줄수있으나, master 나뭇가지를쓰는관례를따르는것을추천합니다. 임시나뭇가지 Git 을사용하다보면당신은쓸모없는하루살이의나뭇가지들을많이만들고있다는사실을깨달을것입니다. 이유는다음과같겠지요 : 그많은나뭇가지들은작업의경과를저장하기위해만들어놓고무엇인가고칠것이있을때빨리돌가가기위해서쌓아두기만하고있는거겠죠. 다른 TV 채널에서무얼하나확인할때잠시채널을바꾸는것과같은아이디어입니다. 그러나리모트 버튼몇개누르면되는것과는달리, 많은나뭇가지를만들고, 설정하고, 병합하고, 나중에다쓰면지워야합니다. 다행히도 Git 에서는 TV 리모트와비슷하게지름길이있습니다 : $ git stash 이명령어는현버전을임시저장소 (stash) 에저장해주고작업하기전의상태로돌아갑니다. 작업중 인디렉토리는작업 ( 편집, 버그고침등 ) 하기전의상태로돌아가겠지요. 그리고임시 (stash) 로돌아가고싶다면 : $ git stash apply # 에러 (version conflict) 가날지도몰라요. 물론여러개의임시저장소 (stash) 를만들수도있습니다. *git help stash* 에설명이되어있으 니읽어보세요. 눈치챘을지모르겠지만, Git 은올바른임시저장소 (stash) 기능을쓰게해주기위해서나뭇가지들을몰래이용한답니다. 원하는방식대로작업하기 나뭇가지를이용하는것이꼭필요한지생각할지도모르겠습니다. 파일들을클로닝하는게제일빠르고 *cd* 를이용해디렉토리를바꿈으로써나뭇가지를대체하고싶을지도모릅니다. 웹브라우저의예를들어보겠습니다. 여러개의창아니면여러개의탭을지원하는이유는무엇일까요? 여러이용자들의작업방식을존중하여주기위해서랍니다. 어떤이용자들은웹브라우저창하나만열고 여러탭을열어서작업하는방식을추구합니다. 다른이용자들은반대의형식으로작업하는것을추구할 지도모르죠 : 여러개의창을만들고탭이없이작업하는것을말이죠. 또어떤이용자들은이두방법들을섞어서작업하는걸선호할지도모릅니다. 나뭇가지들은마치작업중인디렉토리의탭과같습니다. 클로닝은새로운브라우저창을여는것과같은 것이죠. 이두가지방법은모두빠르고로컬에서진행됩니다. 그러니당신에게맞는방법을찾아보는건어떨까요? Git 은당신이원하는대로일하게도와줄것입니다. 기록공부 분산관리시스템을택한 Git 은개발자들이전버전에서의작업을더용이하게할수있게도와주었습니 다. 그러나프로그램의과거를들춰내려면조심하세요 : 당신이소유하고있는파일들만다시쓰기하세 요. 세계각국의나라들이누가어떤잘못을했는지끝임없이따지는것처럼만약한개발자가당신이가지고있는파일과기록 (history) 이다른파일들을클론하여갔을때병합할때문제가생길지도모릅니다. 20

21 어떤개발자들은파일의기록은절대로바뀌면안되는것이라고믿고있습니다. 또어떤개발자들은수정 기록들이깨끗하게정리되어야한다고합니다. Git 은이렇게다른성향의개발자들을모두포용할수 있습니다. 클로닝, 나뭇가지, 병합과같은기능들과같이파일의기록들을바꾸는것은 Git 이할수있는많은기능들중에하나일뿐입니다. 어떻게영리하게사용하는지는당신에게달려있죠. 오류수정합니다 방금 commit 을했는데, 그 commit 메세지를바꾸고싶다고요? 그렇다면 : $ git commit --amend 위명령어를사용하면마지막으로한 commit 의메세지를바꿀수있습니다. 파일을더하는것을잊어버리고 commit 을했다고요? *git add* 를사용하고서위의명령어를사용하세요. 마지막으로했던 commit 에편집을더하고싶으신가요? 그렇다면편집후에다음명령어를쓰세요. $ git commit --amend -a 더있습니다 전에보았던문제가 10 배더힘들었다고생각합니다. 긴시간동안작업해서많은 commit 을하였다 고가정합니다. 그러나당신은그 commit 들의난잡한구성이마음에들지않습니다. 그리고어떤 commit 메세지들은다시쓰고싶습니다. 그렇다면 : $ git rebase -i HEAD~10 위명령어를사용한다면당신이좋아하는작업용에디터에지난열개의 commit 이출력될것입니다. 샘플을보자면 : pick 5c6eb73 Added repo.or.cz link pick a311a64 Reordered analogies in "Work How You Want" pick f Added push target to Makefile 여기서는오래된 commit 이 log 명령어와달리새로운 commit 보다먼저출력되어나옵니다. 여기서는 5c6eb73 가가장오래된 commit 이고 f 이가장최근 commit 이죠. 그리고 : Here, 5c6eb73 is the oldest commit, and f is the newest. Then: 한줄을지움으로써 commit 을삭제합니다. revert 명령어와같으나기록에는남지않게지웁니다. 이전략은마치 commit 이처음부터존재하지않던것처럼보여지게해줍니다. 행들을재정렬하며 commit 의순서를바꾸어줍니다. pick 명령어대신에 edit 을사용하여개정시킬 commit 을마킹합니다. reword 를사용하여로그메세지를바꿉니다. squash 를사용하여전에했던 commit 과합병합니다. fixup 를사용하여전에했던 commit 과합병후 log 메세지를삭제합니다. 21

22 예를들어, 두번째행의 pick 을 squash 명령어로바꾸어봅니다 : pick 5c6eb73 Added repo.or.cz link squash a311a64 Reordered analogies in "Work How You Want" pick f Added push target to Makefile 저장후프로그램을종료하면, Git 은 a311a64 를 5c6eb73 로병합시킵니다. squash ( 짓누르기 ) 는현작업을다음 commit 으로밀어붙어버린다고생각하시면됩니다. Git 은로그메세지들도합친후나중에편집할수있게해줍니다. fixup 명령어를사용하면이런절차를하지않아도됩니다 ; 짓눌려진로그메세지들은간단히삭제되기때문입니다. *edit* 을이용하여 commit 을마킹해두었다면, Git 은같은성향의 commit 들중에가장오래전에했던 commit 의작업상태로당신을되돌려보냅니다. 이상태에서아까전말했듯이편집작업을 할수도있고, 그상태에맞는새로운 commit 을만들수도있습니다. 모든수정작업이만족스럽다면다음명령어를사용해앞으로감기를실행할수있습니다.: $ git rebase --continue Git 은다음 *edit* 까지아니면아무런 *edit* 이없다면현재작업상태까지 commit 을반복실행할것입니다. 새로운평가기준 (rebase) 을포기할수도있습니다 : $ git rebase --abort 그러니 commit 을부지런하게자주하십시오 : 나중에 rebase 를사용하여정리할수있으니까요. 로컬에서의수정작업 어떤프로젝트를진행하고있습니다. 당신의컴퓨터에서로컬 commit 을하다가이제공식적인프로젝트파일들과동기화해야합니다. 이런절차는서버의파일에올리기전에거쳐야할과정이지요. 그러나당신의로컬 Git 클론은공식적인파일기록와개인으로만든파일기록이뒤죽박죽섞여있을것입니다. 아무래도공식적인기록과개인적인기록이분류되어출력되면기록을확인하기가쉽겠지요. 위에서설명했듯이 git rebase 명령어가이작업을해줄것입니다. --onto 플래그를사용할수도있습니다. *git help rebase* 를확인해서좀더자세한예를한번봐보세요. Commit 을분류할수있다는걸알게될것입니다. 나뭇가지를재정리할수도있죠. *rebase* 는유용한명령어입니다. 여러가지실험을하기전에 *git clone* 으로복사본을만들어두고놀아보세요. 기록다시쓰기 가끔은어떤그룹사진에서포토샵으로몇사람지우는기능과같은명령어가필요할지도모릅니다. 스탈 린식스타일로사람을무자비하게지우는명령어말입니다. 예를들어이제어떤프로젝트를풀시간이왔 다고가정합니다. 그러나어떤파일들은다른사람들이보지못하도록하고싶습니다. 당신크레딧카드 22

23 번호를실수로썻다던지이런실수를한다면더욱더그러고싶겠지요. 예전 commit 으로파일을부 분적으로복구하는것이가능하기때문에파일을지우는것으로는부족합니다. 당신은이파일을모든 commit 으로부터없에야할것입니다 : $ git filter-branch --tree-filter 'rm top/secret/file' HEAD *git help filter-branch* 를보세요. 여기서는본예시에대해설명하고있고더빠른방법을제시하여줄것입니다. 대체적으로 *filter-branch* 은하나의명령어만으로도대량의파일기록을변화시킬수있을것입니다. 그리고 +.git/refs/original+ 디렉토리는이렇게만든변화가오기전의기록을보여줄것입니다. *fil 마지막으로, 나중에새로운버전에서작업을진행하고싶다면당신의클론을새로운버전의클론으로바꾸시면됩니다. 기록만들기 프로젝트를 Git 으로옮겨오고싶다고요? 다른버전관리시스템에서옮겨오는것이라면, 어떤개발자가이미프로젝트의기록을 Git 으로옮겨오는스크립트를써두었을지도모릅니다. 아니라면, 특정포맷으로텍스트를읽어 Git 기록을처음부터작성하여주는 git fast-import 명령어를사용해서확인해보세요. 대체적으로기록스크립트는한번에간편하게이명령어를사용해서만들어졌을것입니다. 예로, /tmp/history 같은임시파일에다음텍스트를붙여넣기해보세요 : commit refs/heads/master committer Alice <alice@example.com> Thu, 01 Jan :00: data <<EOT Initial commit. EOT M inline hello.c data <<EOT #include <stdio.h> int main() { printf("hello, world!\n"); return 0; } EOT commit refs/heads/master committer Bob <bob@example.com> Tue, 14 Mar :59: data <<EOT Replace printf() with write(). EOT 23

24 M inline hello.c data <<EOT #include <unistd.h> int main() { write(1, "Hello, world!\n", 14); return 0; } EOT 그리고 Git 저장소를만들어보세요 : $ mkdir project; cd project; git init $ git fast-import --date-format=rfc2822 < /tmp/history 가장최근버전을가져오고싶다면 : $ git checkout master. git fast-export 명령어는아무 Git 저장소를결과물이사람들이읽을수있는포맷으로바꾸어주는 git fast-import 포맷으로바꾸어줍니다. 이명령어들은텍스트파일들을텍스트파일전용채널을통해서저장소로밀어넣기해줍니다. 어디서부터잘못되었을까? 당신은몇달전에는잘작동되던프로그램이갑자기안된다는것을발견했습니다. 아놔! 이버그는어디서부터생긴것일까요? 개발을하면서테스팅을종종했더라면진작에알아챘을텐데요. 이미그러기엔너무늦었습니다. 그러나 commit 이라도자주했다는가정하에 Git 은이러한짐을덜어줄수있습니다 : $ git bisect start $ git bisect bad HEAD $ git bisect good 1b6d Git 에서한프로젝트를반 (good 과 bad) 으로나누어서테스팅을실행합니다. 그리고아직도버그가발견된다면 : $ git bisect bad 버그가더이상없다면위명령어에서 bad 를 good 으로바꾸세요. Git 은 good 버전과 bad 버전사이로당신을데려갑니다. 물론버그를찾을확률은높아지지요. 몇번이렇게반복하다보면결국 엔버그를일으킨 commit 을찾아낼수있게도와줄것입니다. 버그찾기를완료했다면다시처음작업상태로 ( 이젠버그가없겠지요 ) 돌아가야겠지요 : $ git bisect reset 수동으로테스팅하는것보단, 다음명령어로테스팅을자동화할수있습니다 : $ git bisect run my_script 24

25 Git 은기존대비할스크립트에약간의변화를주어서이것이좋은변화인지안좋은변화인지체크합니다 : 좋은변화는 0 으로무시해야할변화는 125 로 안좋은변화는 1 과 127 사이의번호로테스팅을종료합니다. 마이너스숫자는이분화 (bisect) 를강제종료하지요. 당신은이것보다더많은일을할수있습니다. 도움말은이분화를시각화해주는방법과, 이분화기록을다시보는방법, 확인된이상없는변화들은건너띄어테스팅을가속시켜주는기능들을배우실수있습니다. 누가망가뜨렸을까? 다른버전관리시스템들과같이 Git 은누군가를탓할수있는기능이있습니다 : $ git blame bug.c 이명령어를사용하면누가언제마지막으로코딩작업을했는지표시하여줍니다. 다른버전관리시스템들과는달리모든작업은오프라인에서진행됩니다. 나의개인경험담 중앙버전관리시스템에서는파일기록변경은어려울뿐만아니라관리자만이변경할수있습니다. 클 론, 나뭇가지만들기와병합하기는네트워크를통해서만할수있는작업들입니다. 브라우징기록보 기, commit 하기역시중앙버전관리시스템에서는네트워크를통해야만합니다. 어떤시스템에서는네트워크연결이되어야지만자기자신이작업한기록을보거나편집할수있습니다. 중앙버전관리시스템은개발자의수가늘어남에비례해서더많은네트워크통신을요구하기때문에오 프라인에서작업하는것보다비싸질수밖에없습니다. 그리고제일중요한것은모든개발자들이고급명 령어들을적재적소에쓰지않는다면모든작업이어느정도는무조건느릴수밖에없다는것입니다. 극적 인케이스에서는아주기본적인명령어만으로도잘못하면느려질수밖에없습니다. 무거운명령어를써야하나면일의효율성은나쁜영향을받을수밖에없습니다. 저는직접이런상황들을겪어보았습니다. Git 은제가사용한버전관리시스템중에제일처음이었죠. 저는 Git 의여러기능들을당연하다생각하고금방적응하였습니다. 저는당연히다른버전관리시스 템들역시 Git 이제공하는기능들을가지고있을것이라고생각하였습니다 : 버전관리시스템을선택하는것은텍스트에디터나웹브라우저를선택하는것과같은맥락일것이라고생각하였습니다. 제가중앙버전관리시스템을처음사용하게되었을땐완전쇼킹이였죠. 불안정한인터연결은 Git 을 사용할때중요치않습니다. 그러나이러한인터넷연결은로컬디스크에서작업하는것만큼은절대될수 없죠. 그리고저는어떤명령어는연결딜레이를고려함에따라쓰지않게되는걸시간이지나며깨달았습니다. 이런행동은제가정말하고싶었던작업을완벽히이행하지못하게하는방해물이되었죠. 어쩔수없이느린명령어를사용할때는저의작업효율에치명타를입히기일쑤였죠. 네트워크연결이완 료되길기다리면서이메일확인및다른문서작업을하며시간을때웠습니다. 그러다가원래하던작업에 돌아가면다시무엇을했었는지기억을해내는데시간이많이허비된경험이허다했습니다. 인간은환경변화에적응을할수는있으나빠르진않죠. 공유된는비극도존재했죠 : 네트워크상황이원활하지않을것이라는기대와미래에네트워크딜레이를 줄이기위해기울인노력들은오히려트래픽을더잡아먹을수가있다는것입니다. 모든개발자들이네트 25

26 워크를원활하게하는노력을할수록오히려해가될수있다는것입니다. 이게무슨아이러니한일입니까? == Git 은멀티플레이어 == 제가과거프리랜서시절부터 Git 을개인적인용도로사용해오고있었습니다. 여태까지소개했던많 은명령어들중, 당시에는 *pull* 과 *clone 정도만사용하여같은프로젝트를여러디렉토리에저장하는데사용하였습니다. 시간이지난후 Git 에제가만든코드를올리고싶었고다른개발자들이한작업도반영하고싶었습니다. 저는전세계의많은개발자들을관리하는방법을배워야했습니다. 다행히도이런일을도와주는것은 Git 의가장큰힘입니다. Git 이존재하는이유이기도하지요. 난누굴까? 각 commit 은작성자의이름과작성자의이메일주소를저장합니다. *git log* 를사용해조회할수 있습니다. 기본설정상, Git 은시스템세팅을이용해작성자의이름과이메일주소를저장합니다. 수동으로이름과이메일주소를설정하려면 : $ git config --global user.name "John Doe" $ git config --global user. johndoe@example.com 현재사용중인저장소에만사용할수있는작성자이름이나이메일을설정하려면위명령어는사용하지마세요. Git 을통한 SSH, HTTP 연결 웹서버에관한 SSH 접근권한을보유하고있다고합니다. Git 은아직설치되어있지않다고가정합니다. 기존프로토콜만큼효율적이진않겠지만, Git 은 HTTP 를통해데이터교환이가능합니다. Git 을다운받아서설치합니다. 그리고웹디렉토리에저장소를만듭니다 : $ GIT_DIR=proj.git git init $ cd proj.git $ git --bare update-server-info $ cp hooks/post-update.sample hooks/post-update Git 의예전버전에선복사를지시하는명령어가안들을수있습니다. 그렇다면 : $ chmod a+x hooks/post-update 이제아무클론에서 SSH 를통해당신의작업을업로드할수있습니다 : $ git push web.server:/path/to/proj.git master 다른사람들은당신의작업을다운받으려면다음명령어를쓰면될겁니다 : $ git clone 26

27 모든것은 Git 을통한다 서버와의연결없이저장소를동기화시키고싶다고요? 긴급하게수정할것이발견되었다고요? git fast-export 그리고 git fast-import 명령어들은저장소를하나의파일로묶어주거나그하나의파일을저장소로되돌려줄수있는것을배웠습니다. 여러가지매개체를통해서저장소의파일들을옮길수있지만, 정말효율적인방법은 git bundle 명령어를쓰는것입니다. 보내는이가 묶음 (bundle) 을만듭니다 : $ git bundle create somefile HEAD 그리고다른장소로그묶음, +somefile+ 을어떻게든옮겨야합니다 : 이메일, USB 드라이브, *xxd* 프린트, OCR 스캐너, 전화로이야기하던지, 연기로신호를보내던지등어떻게든보내야합니다. 파일을받을사람들은이묶음으로부터의 commit 을다음명령어를이용하여받을수있습니다 : $ git pull somefile 파일을받는사람들은빈저장소에서도이명령어를사용할수있습니다. 파일의사이즈에도불구하고 +somefile+ 은저장소의본모습을담고있습니다. 큰프로젝트에서는묶음만들기를좀더효율적으로하기위해서버전차이만을묶어줍니다. 예를들어서 1b6d 를 commit 이가장최근에공유된 commit 이라고가정해봅니다 : $ git bundle create somefile HEAD ^1b6d 너무자주이렇게한다면, 어떤 commit 이가장최근것인지기억하지못할수있습니다. 도움말에서는태그를이용해이런문제점들을피하라명시합니다. 다시말하자면어떤묶음을보낸후에는 : $ git tag -f lastbundle HEAD 그리고새로운묶음을만들어줍니다 : $ git bundle create newbundle HEAD ^lastbundle 패치 : 세계적통화 패치는컴퓨터와인간이쉽게알아들을수있는언어로파일의변화를텍스트로표현할수있는방법입니 다. 이런식으로세계적으로다양하게사용되고있습니다. 어떠한버전관리시스템을쓰던간에개발자 들에게패치를이메일로보낼수있습니다. 그개발자들이그이메일을읽을수만있다면그들은당신이편집을한작업기록을볼수있습니다. 첫장에서본명령어를다시한번해봅시다 : $ git diff 1b6d > my.patch 위명령어는이메일로추후에토론할수있게패치를붙여넣기하여공유할수동으로있었습니다. Git 저장소에서다음을따라해보세요 : $ git apply < my.patch 27

28 위명령어를사용하여패치를적용시킵니다. 작성자의이름과싸인이기록되어야하는좀더공식적인환경에서는그에상응하는패치 (commit 1b6d 이후 ) 를만들기위해다음명령어를사용합니다 : $ git format-patch 1b6d 이렇게만든파일묶음은 *git-send- * 을사용하여보낼수있습니다. 보내고싶은 commit 묶음을수동으로지정해줄수도있습니다 : $ git format-patch 1b6d..HEAD^^ 받는쪽에서는이메일을받을때 : $ git am < .txt 이명령어는새로받은패치를적용시키고작성자의정보가포함된새로운 commit 을만듭니다. 패치를받기전에, 당신의이메일클라이언트에서이메일에첨부된 commit 묶음이어떤사람에의해포맷이바뀌진않았는지확인합니다. mbox- 를기반으로하는이메일클라이언트는약간의문제점들이있습니다. 그러나이런방식의클라이언트를쓸만한사람이라면손쉽게튜토리얼을읽지않고도해결할수있을것입니다. 죄송합니다. 주소를옮겼습니다 저장소를클로닝한후 *git push* 나 *git pull* 을사용하면원래의 URL 에서해당명령어를실 행합니다. Git 은어떤원리로이렇게하는것일까요? 그비밀은클론을만들때생선된 config 옵션에서찾을수있습니다. 한번볼까요?: $ git config --list remote.origin.url 옵션은 URL 소스를통제합니다 ; origin 은원래저장소에붙여진별명이라고보면됩니다. 나뭇가지에는 master 라고이름이붙듯이말이죠. 그말은이이름을바꾸거나지울수있는데할필요는없다는것입니다. 제일처음사용하던저장소가옮겨지면, URL 을수정해주어야합니다 : $ git config remote.origin.url git://new.url/proj.git brach.master.merge 옵션은 *git pull* 로당겨올수있는나뭇가지를설정하여줍니다. 처음으로클론을생성하였을때, 그클론의나뭇가지는그클론을만들어온저장소의현재사용중인저장소 와같게설정이되어있습니다. 그렇기때문에현재작업헤드가다른나뭇가지로옮겨갔었다고하더라도, 추후의당겨오기는본래의나뭇가지를따를수있게해줄것입니다. 본옵션은처음에 +branch.master.remote+ 옵션에기록되어있는클론에만적용됩니다. 다른 저장소에서당겨오기를실행한다면, 구체적으로어떤나뭇가지에서당겨오길원하는지설정해주어야합니다 : $ git pull git://example.com/other.git master 이것은왜전에보여드렸던밀기와당겨오기예제에다른 argument 가붙지않았었는지설명하여줍니다. 28

29 원격나뭇가지 어떠한저장소를클론할때에는그클론의모든나뭇가지를클론하게됩니다. Git 은이사실을은폐하기에당신은클론을하면서몰랐을지도모릅니다 : 그러니당신은직접 Git 에게물어보아야합니다. 이설정은원격저장소에있는나뭇가지들은당신의나뭇가지들을꼬이게하는일을없게해줍니다. 그래서 Git 역시초보자들이사용할수있는것이고요. 다음명령어를이용하여원격나뭇가지들을나열합니다 : $ git branch -r 당신은다음과비슷한결과물들을보게될것입니다 : origin/head origin/master origin/experimental 이결과는각행마다원격저장소의나뭇가지와현작업위치를돌려주는결과이며, 다른 Git 명령어들 과함께사용될수있습니다. 예를들면, 당신은지금많은 commit 을하였다고먼저가정합니다. 그 러고는가장최근에가져온버젼과비교를하고싶다고생각해봅니다. SHA1 해쉬를찾아서확인할수도있지만다음명령어로더간단히비교할수있습니다 : $ git diff origin/head 아니면 experimental 나뭇가지가지금어떠한상태인지알아낼수도있습니다. $ git log origin/experimental 다수의원격저장소 당신외의두명의개발자가프로젝트를공동으로진행하고있다고가정합니다. 그리고그둘의작업상황을주시하고싶습니다. 당신은다음명령어를사용함으로써하나이상의저장소를추적할수있습니다 : $ git remote add other git://example.com/some_repo.git $ git pull other some_branch 이제두번째저장소의나뭇가지로병합을시도하였으며모든저장소의모든나뭇가지에대한접근권한이생겼습니다. $ git diff origin/experimental^ other/some_branch~5 그러나내작업과관련없이버전의변화를비교해내는방법은무엇일까요? 풀어말하자면그들의나뭇가지를보는동시에내작업이영향받지않게하고싶다는것입니다. 그렇다면당겨오기보다는 : $ git fetch # 원래의저장소로부터물어옵니다. 디폴트명령어. $ git fetch other # 다른개발자의저장소를물어옵니다. 버전기록들만을가져오는명령어들입니다. 현재작업중인디렉토리는영향을받지않을것이지만, 로 컬사본을가지고있기에우리는이제어느저장소의어떤나뭇가지라도 Git 명령어를사용하여활용할수있습니다. 29

30 Pull 은간단히풀어서설명하면 fetch( 물어오기 ) 후 *merge( 병합하기 )* 를합친하나의고급명령어라고말할수있습니다. 우리는마지막으로한 commit 을현재작업에병합하길원하기때문에주로 *pull( 당겨오기 )* 를사용하게될것입니다 ; 위에설명한상황은특수상황이지요. *git help remote* 에는원격저장소를삭제하는방법, 특정나뭇가지를무시하는방법외에많은것을볼수있습니다. 나만의취향 나는작업을할때다른개발자들이내가당겨오기를실행할수있게항시준비해두는것을선호합니다. 어떠한 Git 호스팅서비스는클릭한번만으로도쉽게이를행할수있게도와주는것도있습니다. 어떤파일꾸러미를물어온후에는 Git 명령어들을사용하여프로젝트가잘정리되어있길빌며변화기 록을조회합니다. 그러고는나의작업을병합합니다. 그후내작업이맘에들경우메인저장소에밀어넣기합니다. 다른사람들로부터많은도움을받는스타일은아니지만, 이러한내작업방식을추천드리고싶습니다. 다음링크를한번보세요. Linus Torvalds 의블로그포스팅. Git 의세상에거주하는것은패치파일들을만들어배포하는것보다더효율적입니다. Git 은단순한버전관리외에도작업을행한사람의이름, 이메일주소, 작업날짜를같이기록하여줍니다. == Git 마스터링 == 지금까지배운것만으로도당신은 git help 페이지를자유롭게돌아다니며거의모든것을이해할수 있을것입니다. 그러나어떠한문제를풀기위해어느한가지의알맞는명령어를찾는것은아직어려울수 있습니다. 그런문제에대해제가도와줄수있을것같습니다 : 아래는제가 Git 을사용하며유용하게썼던몇가지팁들입니다. 소스공개 제프로젝트에서 Git 은제가저장및공개하고싶은파일들을정확히추적하여줍니다. $ git archive --format=tar --prefix=proj-1.2.3/ HEAD 바뀐것은꼭 commit Git 에게무엇을추가, 삭제및파일이름을바꾸었는지일일히알려주는것은귀찮은짓일지도모릅니다. 대신에당신은다음명령어를쓸수있습니다 : $ git add. $ git add -u Git 은현재작업중인디렉토리에있는파일들을자동으로살피며자세한사항들을기록합니다. 위의두번째명령어 (git add -u) 대신에 git commit -a 를사용하여그명령어와 commit 을동시 에해낼수있습니다. *git help ignore* 를참고하여어떠한지정된파일을무시하는방법을알아보십시오. 위의모든것을한줄의명령어로실행할수있습니다. 30

31 $ git ls-files -d -m -o -z xargs -0 git update-index --add --remove -z* 와 *-0 옵션은파일이름이이상한문자를포함하고있을때생길수있는여러가지문제점들을처리하여줍니다. 이옵션들은무시된파일들을포함하여줌으로써 -x 아니면 -X 을같이써주어야할것입니다. 내 commit 이너무클경우? Commit 을한지시간이좀많이지난상황입니까? 코딩을너무열심히한나머지버전컨트롤하는것을깜빡했나요? 프로젝트에여러가지연관성없는수정을한상태입니까? 걱정하지말고 : $ git add -p 당신이만든모든수정작업에대하여 Git 은어떠한것들이바뀌였는지코드로보여주며당신에게다음 에실행할 commit 에부분적인코드가포함될사항인지물어볼것입니다. y 와 n 를이용하여대답할수있습니다. 물론이대답을당장하지않아도됩니다 ;? 로좀더알아보십시요. 모든수정작업이마음에든다면 : $ git commit 위의간단한명령어를사용하여부분적인 commit 을실행합니다. 이상황에선반드시 *-a* 옵션을생략하시길바랍니다. 그렇지않으면 Git 은모든수정작업을 commit 할것입니다. 만약에여러군데다른디렉토리에많은수정작업을해놓았다면어떻게할까요? 수정된사항을하나씩 검토하는작업은정말귀찮은짓입니다. 이럴땐 *git add -i* 를사용합니다. 몇번의타이핑만으로 도특정파일의수정작업을검토할수있게됩니다. 또는 *git commit --interactive* 를사용하여작업중자동으로 commit 하는방법도있을수있습니다. 인덱스 : Git 의스테이징구역 여태까지 Git 의유명한기능인 index 를피해왔지만이제한번살펴본시간이온것같습니다. 인덱 스는임시적인스테이징구역 ( 번역주 : 책갈피처럼 ) 으로보면됩니다. Git 은당신의프로젝트와프 로젝트의기록사이에데이터를직접옮기는경우는드뭅니다. 대신, Git 은인덱스에파일을쓰며그리고그파일들을마지막목표지점에카피하여줍니다. 예를들어 commit -a* 는원래투 - 스텝과정을거치는하나의명령어입니다. 첫번째로는현작업 상황의스냅샷을찍어모든파일들을인덱스하는과정을거칩니다. 두번째과정에서는방금찍은스냅 샷을영구적으로보관하게됩니다. *-a 옵션을쓰지않고 commit 을하는것은이두번째과정만실 행하는일입니다. 그렇기에 git add 같은명령어를쓴후에 commit 을하는것이당연한이야기가되겠지요. 대체적으로인덱스에관한컨셉트는무시하고파일기록에서직접적으로쓰기와읽기가실행된다는개 념으로이해하면편합니다. 이런경우에는우린인덱스를제어하는것처럼좀더세부한제어를하기원할것입니다. 부분적인스냅샷을찍은후영구적으로이 부분스냅샷 을보존하는것이죠. 31

32 대가리 (HEAD) 를잃어버리지않기 HEAD 태그는문서작업시보이는커서처럼마지막 commit 포인트를가르키는포인터역할을합니다. Commit 을실행할때마다물론 HEAD 도같이앞으로움직이겠지요. 어떤 Git 명령어들은수동으로 HEAD 를움직일수있게해줍니다. 예를들면 : $ git reset HEAD~3 위명령어를사용한다면 HEAD 를 commit 을 3 번하기전으로옮깁니다. 이후모든 Git 명령어는가지고있던파일은현재상태로그대로두되그 3 번의 commit 을하지않은것으로이해하죠. 그러나어떻게해야다시미래로돌아갈수있을까요? 예전에했던 commit 들은미래에대해서아무것도모를텐데말이지요. 원래의 HEAD 의 SHA1 을가지고있다면 : $ git reset 1b6d 그러나이것을어디에도써두지않았었더라도걱정하지마십시오 : Git 은이런경우를대비해서원래 의 HEAD 를 ORIG_HEAD 로어딘가에는저장하여둡니다. 그러고는다음명령어를사용하여미래로안전하게돌아올수있지요 : $ git reset ORIG_HEAD HEAD- 헌팅 ORIG_HEAD 로돌아가는것만으로는충분하지않을지도모릅니다. 당신은방금엄청나게큰실수를발견하였고아주오래전에했던 commit 으로돌아가야할지모릅니다. 기본적으로 Git 은나뭇가지를수동으로삭제하였더라도 2 주의시간동안 commit 을무조건저장 하여둡니다. 문제는돌아가고싶은 commit 의 hash 를찾는일입니다..git/objects 의모든 hash 값을조회하여얻어걸릴때까지해보는방법이있긴합니다만, 여기좀더쉬운방법이있습니다. Git 은모든 commit 의 hash 를.git/logs 에저장해둡니다. 하위디렉토리 refs 은모든나뭇가지의활동기록을저장하여두고동시에 HEAD 파일은모든 hash 값을저장하고있습니다. 후자는실수로마구건너뛴 commit 들의 hash 도찾을수있게해줍니다. reflog 명령어는당신이사용하기쉬운유저인터페이스로 log 파일들을표현하여줍니다. 다음명령어를사용하여보십시오. $ git reflog hash 를 reflog 으로부터자르고붙여넣기보다는 : $ git checkout "@{10 minutes ago}" 아니면 5 번째전에방문했던 commit 으로돌아갈수도있습니다 : $ git checkout "@{5}" 좀더많은정보는 *git help rev-parse* 의 재편집구체화하기 섹션을참고하십시오. Commit 의 2 주의생명을연장하여줄수있습니다. 예를들어 : 32

33 $ git config gc.pruneexpire "30 days" 위명령어는 30 일이지난후에지워진 commit 들역시영구적으로삭제된다는의미입니다. 그러고는 *git gc* 가실행되지요. *git gc* 가자동실행되는것을꺼줄수도있습니다 : $ git config gc.auto 0 이경우에는 *git gc* 를수동적으로실행시켜 commit 들을삭제할수있지요. Git 을좀더발전시키는방법 진정한 UNIX 와같이 Git 의디자인은다른프로그램들의 GUI, 웹인터페이스와같은하위파트 들과호환이됩니다. 어느 Git 명령어들은유명인사의어깨위에서있는것처럼 Git 그자체가스크 립팅언어로사용될수도있습니다. 조금만시간을투자하면 Git 은당신의선호에더알맞게바꿀수있습니다. 한가지트릭을소개하자면자주사용할것같은명령어들을짧게만들어줄수있는방법이있습니다 : $ git config --global alias.co checkout $ git config --global --get-regexp alias # 현재설정한명령어들의 ' 가명 ' 을표기해줍니다. alias.co checkout $ git co foo # 'git checkout foo' 와같은것입니다. 또다른트릭은현재작업중인나뭇가지의이름을작업표시창에표시하여주는명령어도있습니다. $ git symbolic-ref HEAD 위명령어는현재작업중인나뭇가지이름을표기하여줍니다. 실용적으로는 refs/heads/ 를사용하지않으며잠재적으로일어날수있는에러들을무시하여줍니다 : $ git symbolic-ref HEAD 2> /dev/null cut -b 12- contrib 하위디렉토리는유용한 Git 툴들이저장되어있는장소이기도합니다. 시간이지나면이곳에있는툴들은공식적으로인정받아고유명령어가생기기도하겠지요. Debian 과 Ubuntu 에서는이디렉토리는 +/usr/share/doc/git-core/contrib+ 에위치하고있습니다. 앞으로 +workdir/git-new-workdir+ 디렉토리에방문할일도많을것입니다. 시스템링크기 술을통해서이스크립트는원래의저장소와작업기록을같이하는새로운작업디렉토리를생성하여줍니다 : $ git-new-workdir an/existing/repo new/directory 새롭게생성된디렉토리는클론으로봐도무방하며일반클론들과의한가지차이점은어느한곳에서작 업을하던두개의디렉토리는앞으로계속싱크를진행하며같은기록을가지게된다는것입니다. 즉, 병합, 밀어넣기, 당겨오기를해줄필요가없어지는것이지요. 33

34 용감한스턴트 Git 은요즘유저들이데이터를쉽게지우지못하도록하고있습니다. 그러나몇가지의상용적인명령어를통해서이런 Git 만의방화벽쯤은쉽게뚫어버릴수있지요. Checkout: Commit 하지않은작업들은 checkout 을할수없습니다. 방금작업한모든것들을없던일로하고그래도굳이 commit 을진행하고싶다면 : $ git checkout -f HEAD^ 반면에 checkout 을할위치를수동으로설정하여준다면 Git 의방화벽은처음부터작동하지않을 것입니다. 설정해준위치는조용히덮어씌우게됩니다. 그러니, 이런방식으로 checkout 을할때에는주의하십시오. Reset: 리셋은 commit 되지않은작업이있으면실행되지않을것입니다. 그래도강제로하고싶다면 : $ git reset --hard 1b6d Branch: 방금한작업을잃어버릴것같으면 Git 은나뭇가지가지워지지않게합니다. 그래도하고싶다면 : $ git branch -D dead_branch # -d 대신 -D 비슷한방식으로, commit 을안한작업이있어서 move 명령어를통해서덮어씌우기가안될경우에는 : $ git branch -M source target # -m 대신 -M 체크아웃과리셋과는다르게위의두명령어는데이터를직접삭제하진않습니다. 모든변경기록은.git 하위디렉토리에남게되고필요한 hash 는.git/logs 에서찾을수있습니다 ( 위의 HEAD- 헌팅 섹션참고 ). 기본설정상, 이기록들은 2 주동안은삭제되지않습니다. Clean: 몇 git 명령어들은추적되지않은파일들을망쳐놓을까봐실행이안되는경우가종종있습니다. 만약에그파일들이삭제되도된다는확신이선다면, 가차없이다음명령어를사용하여삭제하십시오 : $ git clean -f -d 이후에는위모든명령어들은다시잘실행되기시작할것입니다! 원치않는 commit 들을방지하기 바보같은실수들은내저장소를망쳐놓곤합니다. 그중에서도제일무서운것은 *git add* 를쓰지않 아서작업해놓은파일들을잃어버리는것이지요. 그나마코드뒤에빈공간을마구넣어놓는다던지병합 에서일어날수있는문제들을해결해놓지않는것은애교로보입니다 : 별로문제가되는것들은아니지만남들이볼수있는공공저장소에서는보여주기싫습니다. hook 을사용하는것과같이제가바보같은짓을할때마다경고를해주는기능이있다면얼마나좋을까요 : 34

35 $ cd.git/hooks $ cp pre-commit.sample pre-commit # Older Git versions: chmod +x pre-commit 이제는아까설명했던애교스러운실수들이발견될때 Git 은 commit 을도중에그만둘것입니다. 이가이드에서는 pre-commit 앞에밑에써놓은코드를넣음으로써혹시있을지도모르는바보같은짓을방지하였습니다. if git ls-files -o grep '\.txt$'; then echo FAIL! Untracked.txt files. exit 1 fi 많은 git 작업들은 hook 과상호작용합니다 ; git help hooks* 를참조하십시오. 우리는 Git over HTTP 를설명할때 *post-update hook 을활성화시켰습니다. HEAD 가옮겨질때마다같이실행되지요. Git over HTTP 예제에서는 post-update 스크립트가통신에필요한 Git 을업데이트했었습니다. Secrets Revealed We take a peek under the hood and explain how Git performs its miracles. I will skimp over details. For in-depth descriptions refer to the user manual. Invisibility How can Git be so unobtrusive? Aside from occasional commits and merges, you can work as if you were unaware that version control exists. That is, until you need it, and that s when you re glad Git was watching over you the whole time. Other version control systems force you to constantly struggle with red tape and bureaucracy. Permissions of files may be read-only unless you explicitly tell a central server which files you intend to edit. The most basic commands may slow to a crawl as the number of users increases. Work grinds to a halt when the network or the central server goes down. In contrast, Git simply keeps the history of your project in the.git directory in your working directory. This is your own copy of the history, so you can stay offline until you want to communicate with others. You have total control over the fate of your files because Git can easily recreate a saved state from.git at any time. 35

36 Integrity Most people associate cryptography with keeping information secret, but another equally important goal is keeping information safe. Proper use of cryptographic hash functions can prevent accidental or malicious data corruption. A SHA1 hash can be thought of as a unique 160-bit ID number for every string of bytes you ll encounter in your life. Actually more than that: every string of bytes that any human will ever use over many lifetimes. As a SHA1 hash is itself a string of bytes, we can hash strings of bytes containing other hashes. This simple observation is surprisingly useful: look up hash chains. We ll later see how Git uses it to efficiently guarantee data integrity. Briefly, Git keeps your data in the.git/objects subdirectory, where instead of normal filenames, you ll find only IDs. By using IDs as filenames, as well as a few lockfiles and timestamping tricks, Git transforms any humble filesystem into an efficient and robust database. Intelligence How does Git know you renamed a file, even though you never mentioned the fact explicitly? Sure, you may have run git mv, but that is exactly the same as a git rm followed by a git add. Git heuristically ferrets out renames and copies between successive versions. In fact, it can detect chunks of code being moved or copied around between files! Though it cannot cover all cases, it does a decent job, and this feature is always improving. If it fails to work for you, try options enabling more expensive copy detection, and consider upgrading. Indexing For every tracked file, Git records information such as its size, creation time and last modification time in a file known as the index. To determine whether a file has changed, Git compares its current stats with those cached in the index. If they match, then Git can skip reading the file again. Since stat calls are considerably faster than file reads, if you only edit a few files, Git can update its state in almost no time. We stated earlier that the index is a staging area. Why is a bunch of file stats a staging area? Because the add command puts files into Git s database and updates these stats, while the commit command, without options, creates a commit based only on these stats and the files already in the database. 36

37 Git s Origins This Linux Kernel Mailing List post describes the chain of events that led to Git. The entire thread is a fascinating archaeological site for Git historians. The Object Database Every version of your data is kept in the object database, which lives in the subdirectory.git/objects; the other residents of.git/ hold lesser data: the index, branch names, tags, configuration options, logs, the current location of the head commit, and so on. The object database is elementary yet elegant, and the source of Git s power. Each file within.git/objects is an object. There are 3 kinds of objects that concern us: blob objects, tree objects, and commit objects. Blobs First, a magic trick. Pick a filename, any filename. In an empty directory: $ echo sweet > YOUR_FILENAME $ git init $ git add. $ find.git/objects -type f You ll see.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d. How do I know this without knowing the filename? It s because the SHA1 hash of: "blob" SP "6" NUL "sweet" LF is aa823728ea7d592acc69b36875a482cdf3fd5c8d, where SP is a space, NUL is a zero byte and LF is a linefeed. You can verify this by typing: $ printf "blob 6\000sweet\n" sha1sum Git is content-addressable: files are not stored according to their filename, but rather by the hash of the data they contain, in a file we call a blob object. We can think of the hash as a unique ID for a file s contents, so in a sense we are addressing files by their content. The initial blob 6 is merely a header consisting of the object type and its length in bytes; it simplifies internal bookkeeping. Thus I could easily predict what you would see. The file s name is irrelevant: only the data inside is used to construct the blob object. You may be wondering what happens to identical files. Try adding copies of your file, with any filenames whatsoever. The contents of.git/objects stay the same no matter how many you add. Git only stores the data once. 37

38 By the way, the files within.git/objects are compressed with zlib so you should not stare at them directly. Filter them through zpipe -d, or type: $ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d which pretty-prints the given object. Trees But where are the filenames? They must be stored somewhere at some stage. Git gets around to the filenames during a commit: $ git commit # Type some message. $ find.git/objects -type f You should now see 3 objects. This time I cannot tell you what the 2 new files are, as it partly depends on the filename you picked. We ll proceed assuming you chose rose. If you didn t, you can rewrite history to make it look like you did: $ git filter-branch --tree-filter 'mv YOUR_FILENAME rose' $ find.git/objects -type f Now you should see the file.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9, because this is the SHA1 hash of its contents: "tree" SP "32" NUL " rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d Check this file does indeed contain the above by typing: $ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 git cat-file --batch With zpipe, it s easy to verify the hash: $ zpipe -d <.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 sha1sum Hash verification is trickier via cat-file because its output contains more than the raw uncompressed object file. This file is a tree object: a list of tuples consisting of a file type, a filename, and a hash. In our example, the file type is , which means rose is a normal file, and the hash is the blob object that contains the contents of rose. Other possible file types are executables, symlinks or directories. In the last case, the hash points to a tree object. If you ran filter-branch, you ll have old objects you no longer need. Although they will be jettisoned automatically once the grace period expires, we ll delete them now to make our toy example easier to follow: $ rm -r.git/refs/original $ git reflog expire --expire=now --all $ git prune 38

39 For real projects you should typically avoid commands like this, as you are destroying backups. If you want a clean repository, it is usually best to make a fresh clone. Also, take care when directly manipulating.git: what if a Git command is running at the same time, or a sudden power outage occurs? In general, refs should be deleted with git update-ref -d, though usually it s safe to remove refs/original by hand. Commits We ve explained 2 of the 3 objects. The third is a commit object. Its contents depend on the commit message as well as the date and time it was created. To match what we have here, we ll have to tweak it a little: $ git commit --amend -m Shakespeare # Change the commit message. $ git filter-branch --env-filter 'export GIT_AUTHOR_DATE="Fri 13 Feb :31: " GIT_AUTHOR_NAME="Alice" GIT_AUTHOR_ ="alice@example.com" GIT_COMMITTER_DATE="Fri, 13 Feb :31: " GIT_COMMITTER_NAME="Bob" GIT_COMMITTER_ ="bob@example.com"' # Rig timestamps and authors. $ find.git/objects -type f You should now see.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187 which is the SHA1 hash of its contents: "commit 158" NUL "tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9" LF "author Alice <alice@example.com> " LF "committer Bob <bob@example.com> " LF LF "Shakespeare" LF As before, you can run zpipe or cat-file to see for yourself. This is the first commit, so there are no parent commits, but later commits will always contain at least one line identifying a parent commit. Indistinguishable From Magic Git s secrets seem too simple. It looks like you could mix together a few shell scripts and add a dash of C code to cook it up in a matter of hours: a melange of basic filesystem operations and SHA1 hashing, garnished with lock files and fsyncs for robustness. In fact, this accurately describes the earliest versions of Git. Nonetheless, apart from ingenious packing tricks to save space, and 39

40 ingenious indexing tricks to save time, we now know how Git deftly changes a filesystem into a database perfect for version control. For example, if any file within the object database is corrupted by a disk error, then its hash will no longer match, alerting us to the problem. By hashing hashes of other objects, we maintain integrity at all levels. Commits are atomic, that is, a commit can never only partially record changes: we can only compute the hash of a commit and store it in the database after we already have stored all relevant trees, blobs and parent commits. The object database is immune to unexpected interruptions such as power outages. We defeat even the most devious adversaries. Suppose somebody attempts to stealthily modify the contents of a file in an ancient version of a project. To keep the object database looking healthy, they must also change the hash of the corresponding blob object since it s now a different string of bytes. This means they ll have to change the hash of any tree object referencing the file, and in turn change the hash of all commit objects involving such a tree, in addition to the hashes of all the descendants of these commits. This implies the hash of the official head differs to that of the bad repository. By following the trail of mismatching hashes we can pinpoint the mutilated file, as well as the commit where it was first corrupted. In short, so long as the 20 bytes representing the last commit are safe, it s impossible to tamper with a Git repository. What about Git s famous features? Branching? Merging? Tags? Mere details. The current head is kept in the file.git/head, which contains a hash of a commit object. The hash gets updated during a commit as well as many other commands. Branches are almost the same: they are files in.git/refs/heads. Tags too: they live in.git/refs/tags but they are updated by a different set of commands. Appendix A: Git Shortcomings There are some Git issues I ve swept under the carpet. Some can be handled easily with scripts and hooks, some require reorganizing or redefining the project, and for the few remaining annoyances, one will just have to wait. Or better yet, pitch in and help! SHA1 Weaknesses As time passes, cryptographers discover more and more SHA1 weaknesses. Already, finding hash collisions is feasible for well-funded organizations. Within years, perhaps even a typical PC will have enough computing power to silently corrupt a Git repository. 40

github_introduction.key

github_introduction.key Github/Git Starter Guide for Introductory Level Curtis Kim @ KAKAO Why Github/Git? - :, - - Q1 :? - Q2 :? - Q3 : ( )? - Q4 :? - Github/Git. Old Paradigm : - - a.java.. Git. - - - - - - - - - (commit &

More information

Page 2 of 6 Here are the rules for conjugating Whether (or not) and If when using a Descriptive Verb. The only difference here from Action Verbs is wh

Page 2 of 6 Here are the rules for conjugating Whether (or not) and If when using a Descriptive Verb. The only difference here from Action Verbs is wh Page 1 of 6 Learn Korean Ep. 13: Whether (or not) and If Let s go over how to say Whether and If. An example in English would be I don t know whether he ll be there, or I don t know if he ll be there.

More information

Page 2 of 5 아니다 means to not be, and is therefore the opposite of 이다. While English simply turns words like to be or to exist negative by adding not,

Page 2 of 5 아니다 means to not be, and is therefore the opposite of 이다. While English simply turns words like to be or to exist negative by adding not, Page 1 of 5 Learn Korean Ep. 4: To be and To exist Of course to be and to exist are different verbs, but they re often confused by beginning students when learning Korean. In English we sometimes use the

More information

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

Microsoft Word - windows server 2003 수동설치_non pro support_.doc Windows Server 2003 수동 설치 가이드 INDEX 운영체제 설치 준비과정 1 드라이버를 위한 플로피 디스크 작성 2 드라이버를 위한 USB 메모리 작성 7 운영체제 설치 과정 14 Boot Sequence 변경 14 컨트롤러 드라이버 수동 설치 15 운영체제 설치 17 운영체제 설치 준비 과정 Windows Server 2003 에는 기본적으로

More information

본문01

본문01 Ⅱ 논술 지도의 방법과 실제 2. 읽기에서 논술까지 의 개발 배경 읽기에서 논술까지 자료집 개발의 본래 목적은 초 중 고교 학교 평가에서 서술형 평가 비중이 2005 학년도 30%, 2006학년도 40%, 2007학년도 50%로 확대 되고, 2008학년도부터 대학 입시에서 논술 비중이 커지면서 논술 교육은 학교가 책임진다. 는 풍토 조성으로 공교육의 신뢰성과

More information

Microsoft Word - Armjtag_문서1.doc

Microsoft Word - Armjtag_문서1.doc ARM JTAG (wiggler 호환 ) 사용방법 ( IAR EWARM 에서 ARM-JTAG 로 Debugging 하기 ) Test Board : AT91SAM7S256 IAR EWARM : Kickstart for ARM ARM-JTAG : ver 1.0 ( 씨링크테크 ) 1. IAR EWARM (Kickstart for ARM) 설치 2. Macraigor

More information

git CLI 로간단하게조작하기! by 윤선지

git CLI 로간단하게조작하기! by 윤선지 git CLI 로간단하게조작하기! by 윤선지 CLI? 명령어인터페이스 Command Line interface 텍스트터미널을통해사용자와컴퓨터가상호작용하는방식 편한 GUI 프로그램대신사용하는이유? 1. GUI프로그램보다가볍다. CJO경우보안프로그램이설치되어있어소스트리 GUI 실행을버거워한다. 2. CLI를사용할수있으면 GUI를사용하는것은쉽지만그반대는힘들다.

More information

ISP and CodeVisionAVR C Compiler.hwp

ISP and CodeVisionAVR C Compiler.hwp USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler

More information

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 Eclipse (IDE) JDK Android SDK with ADT IDE: Integrated Development Environment JDK: Java Development Kit (Java SDK) ADT: Android Development Tools 2 JDK 설치 Eclipse

More information

Windows 8에서 BioStar 1 설치하기

Windows 8에서 BioStar 1 설치하기 / 콘텐츠 테이블... PC에 BioStar 1 설치 방법... Microsoft SQL Server 2012 Express 설치하기... Running SQL 2012 Express Studio... DBSetup.exe 설정하기... BioStar 서버와 클라이언트 시작하기... 1 1 2 2 6 7 1/11 BioStar 1, Windows 8 BioStar

More information

View Licenses and Services (customer)

View Licenses and Services (customer) 빠른 빠른 시작: 시작: 라이선스, 라이선스, 서비스 서비스 및 주문 주문 이력 이력 보기 보기 고객 가이드 Microsoft 비즈니스 센터의 라이선스, 서비스 및 혜택 섹션을 통해 라이선스, 온라인 서비스, 구매 기록 (주문 기록)을 볼 수 있습니다. 시작하려면, 비즈니스 센터에 로그인하여 상단 메뉴에서 재고를 선택한 후 내 재고 관리를 선택하십시오. 목차

More information

SIGIL 완벽입문

SIGIL 완벽입문 누구나 만드는 전자책 SIGIL 을 이용해 전자책을 만들기 EPUB 전자책이 가지는 단점 EPUB이라는 포맷과 제일 많이 비교되는 포맷은 PDF라는 포맷 입니다. EPUB이 나오기 전까지 전 세계에서 가장 많이 사용되던 전자책 포맷이고, 아직도 많이 사 용되기 때문이기도 한며, 또한 PDF는 종이책 출력을 위해서도 사용되기 때문에 종이책 VS

More information

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,

More information

RHEV 2.2 인증서 만료 확인 및 갱신

RHEV 2.2 인증서 만료 확인 및 갱신 2018/09/28 03:56 1/2 목차... 1 인증서 확인... 1 인증서 종류와 확인... 4 RHEVM CA... 5 FQDN 개인 인증서... 5 레드햇 인증서 - 코드 서명 인증서... 6 호스트 인증... 7 참고사항... 8 관련링크... 8 AllThatLinux! - http://allthatlinux.com/dokuwiki/ rhev_2.2_

More information

4 5 4. Hi-MO 애프터케어 시스템 편 5. 오비맥주 카스 카스 후레쉬 테이블 맥주는 천연식품이다 편 처음 스타일 그대로, 부탁 케어~ Hi-MO 애프터케어 시스템 지속적인 모발 관리로 끝까지 스타일이 유지되도록 독보적이다! 근데 그거 아세요? 맥주도 인공첨가물이

4 5 4. Hi-MO 애프터케어 시스템 편 5. 오비맥주 카스 카스 후레쉬 테이블 맥주는 천연식품이다 편 처음 스타일 그대로, 부탁 케어~ Hi-MO 애프터케어 시스템 지속적인 모발 관리로 끝까지 스타일이 유지되도록 독보적이다! 근데 그거 아세요? 맥주도 인공첨가물이 1 2 On-air 3 1. 이베이코리아 G마켓 용평리조트 슈퍼브랜드딜 편 2. 아모레퍼시픽 헤라 루즈 홀릭 리퀴드 편 인쇄 광고 올해도 겨울이 왔어요. 당신에게 꼭 해주고 싶은 말이 있어요. G마켓에선 용평리조트 스페셜 패키지가 2만 6900원! 역시 G마켓이죠? G마켓과 함께하는 용평리조트 스페셜 패키지. G마켓의 슈퍼브랜드딜은 계속된다. 모바일 쇼핑 히어로

More information

System Recovery 사용자 매뉴얼

System Recovery 사용자 매뉴얼 Samsung OS Recovery Solution 을이용하여간편하게 MagicInfo 의네트워크를설정하고시스템을백업및복원할수있습니다. 시스템시작시리모컨의 - 버튼이나키보드의 F3 키를연속해서누르면복구모드로진입한후 Samsung OS Recovery Solution 이실행됩니다. Samsung OS Recovery Solution 은키보드와리모컨을사용하여조작할수있습니다.

More information

<31332DB9E9C6AEB7A2C7D8C5B72D3131C0E528BACEB7CF292E687770>

<31332DB9E9C6AEB7A2C7D8C5B72D3131C0E528BACEB7CF292E687770> 보자. 이제 v4.6.2-1 로업데이트됐다. 그림 F-15의하단처럼 msfupdate를입력해 root @bt:~# msfudpate 그림 F-16 과같이정상적으로업데이트가진행되는것을볼수있다. 이후에는 msfupdate를입력하면최신업데이트모듈과공격코드를쉽게유지할수있다. 그림 F-16 msfupdate의진행확인 G. SET 업데이트문제해결 백트랙을기본설치로운영을할때에는

More information

#중등독해1-1단원(8~35)학

#중등독해1-1단원(8~35)학 Life Unit 1 Unit 2 Unit 3 Unit 4 Food Pets Camping Travel Unit 1 Food Before You Read Pre-reading Questions 1. Do you know what you should or shouldn t do at a traditional Chinese dinner? 2. Do you think

More information

Install stm32cubemx and st-link utility

Install stm32cubemx and st-link utility STM32CubeMX and ST-LINK Utility for STM32 Development 본문서는 ST Microelectronics 의 ARM Cortex-M 시리즈 Microcontroller 개발을위해제공되는 STM32CubeMX 와 STM32 ST-LINK Utility 프로그램의설치과정을설명합니다. 본문서는 Microsoft Windows 7

More information

슬라이드 1

슬라이드 1 / 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Verilog: Finite State Machines CSED311 Lab03 Joonsung Kim, joonsung90@postech.ac.kr Finite State Machines Digital system design 시간에배운것과같습니다. Moore / Mealy machines Verilog 를이용해서어떻게구현할까? 2 Finite State

More information

I&IRC5 TG_08권

I&IRC5 TG_08권 I N T E R E S T I N G A N D I N F O R M A T I V E R E A D I N G C L U B The Greatest Physicist of Our Time Written by Denny Sargent Michael Wyatt I&I Reading Club 103 본문 해석 설명하기 위해 근래의 어떤 과학자보다도 더 많은 노력을

More information

2 min 응용 말하기 01 I set my alarm for 7. 02 It goes off. 03 It doesn t go off. 04 I sleep in. 05 I make my bed. 06 I brush my teeth. 07 I take a shower.

2 min 응용 말하기 01 I set my alarm for 7. 02 It goes off. 03 It doesn t go off. 04 I sleep in. 05 I make my bed. 06 I brush my teeth. 07 I take a shower. 스피킹 매트릭스 특별 체험판 정답 및 스크립트 30초 영어 말하기 INPUT DAY 01 p.10~12 3 min 집중 훈련 01 I * wake up * at 7. 02 I * eat * an apple. 03 I * go * to school. 04 I * put on * my shoes. 05 I * wash * my hands. 06 I * leave

More information

Chapter 1

Chapter 1 3 Oracle 설치 Objectives Download Oracle 11g Release 2 Install Oracle 11g Release 2 Download Oracle SQL Developer 4.0.3 Install Oracle SQL Developer 4.0.3 Create a database connection 2 Download Oracle 11g

More information

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상 Android 용 Brother Image Viewer 설명서 버전 0 KOR 아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상표입니다. Android는

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 1.About GIT 박재석대표 / 투씨드 1. About GIT History 2005 년리누스토발즈에의해 Linux 커널프로젝트지원을위해제작된버전관리도구 12 년간지속적인발전및꾸준한성장세 1. About GIT Concept 분산형버전관리시스템 Reverse Delta 방식이아닌변경에대한 Snapshot 방식 1. About GIT Architecture

More information

SBR-100S User Manual

SBR-100S User Manual ( 1 / 13 ) SBR-100S 모델에 대한 사용자 펌웨어 업그레이드 방법을 안내해 드립니다. SBR-100S 는 신규 펌웨어가 있을시 FOTA(자동업데이트) 기능을 통하여 자동 업그레이드가 되며, 필요시 사용자가 신규 펌웨어를 다운받아 수동으로 업그레이드 할 수 있습니다. 1. 준비하기 1.1 연결 장치 준비 펌웨어 업그레이드를 위해서는 SBR-100S

More information

/chroot/lib/ /chroot/etc/

/chroot/lib/ /chroot/etc/ 구축 환경 VirtualBox - Fedora 15 (kernel : 2.6.40.4-5.fc15.i686.PAE) 작동 원리 chroot유저 ssh 접속 -> 접속유저의 홈디렉토리 밑.ssh의 rc 파일 실행 -> daemonstart실행 -> daemon 작동 -> 접속 유저만의 Jail 디렉토리 생성 -> 접속 유저의.bashrc 의 chroot 명령어

More information

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자 SQL Developer Connect to TimesTen 유니원아이앤씨 DB 팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 2010-07-28 작성자 김학준 최종수정일 2010-07-28 문서번호 20100728_01_khj 재개정이력 일자내용수정인버전

More information

슬라이드 1

슬라이드 1 Git 1. 도구개요 2. 설치및실행 3. 주요기능 4. 활용예제 1. 도구개요 1.1 도구정보요약 도구명 소개 Git (http://git-scm.com/) 라이선스 리누스토발즈가만든분산형버전관리시스템 대부분의공개 SW 가 Git 을이용해서관리되고있음 General Public License v2 GitHub, BitBucket, GitLab 등웹기반의다양한소스저장소서비스의기반

More information

LXR 설치 및 사용법.doc

LXR 설치 및 사용법.doc Installation of LXR (Linux Cross-Reference) for Source Code Reference Code Reference LXR : 2002512( ), : 1/1 1 3 2 LXR 3 21 LXR 3 22 LXR 221 LXR 3 222 LXR 3 3 23 LXR lxrconf 4 24 241 httpdconf 6 242 htaccess

More information

1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot)

1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot) 1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다. 1.1. 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot) 만별도로필요한경우도있어툴체인설치및설정에대해알아봅니다. 1.1.1. 툴체인설치 다음링크에서다운받을수있습니다.

More information

untitled

untitled 시스템소프트웨어 : 운영체제, 컴파일러, 어셈블러, 링커, 로더, 프로그래밍도구등 소프트웨어 응용소프트웨어 : 워드프로세서, 스프레드쉬트, 그래픽프로그램, 미디어재생기등 1 n ( x + x +... + ) 1 2 x n 00001111 10111111 01000101 11111000 00001111 10111111 01001101 11111000

More information

6주차.key

6주차.key 6, Process concept A program in execution Program code PCB (process control block) Program counter, registers, etc. Stack Heap Data section => global variable Process in memory Process state New Running

More information

1) 인증서만들기 ssl]# cat >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키

1) 인증서만들기 ssl]# cat   >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키 Lighttpd ( 멀티도메인 ) SSL 인증서신규설치가이드. [ 고객센터 ] 한국기업보안. 유서트기술팀 1) 인증서만들기 [root@localhost ssl]# cat www.ucert.co.kr.key www.ucert.co.kr.crt >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat

More information

1) 인증서만들기 ssl]# cat >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키

1) 인증서만들기 ssl]# cat   >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키 Lighttpd ( 단일도메인 ) SSL 인증서신규설치가이드. [ 고객센터 ] 한국기업보안. 유서트기술팀 1) 인증서만들기 [root@localhost ssl]# cat www.ucert.co.kr.key www.ucert.co.kr.crt >www.ucert.co.kr.pem // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat

More information

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

Tablespace On-Offline 테이블스페이스 온라인/오프라인

Tablespace On-Offline 테이블스페이스 온라인/오프라인 2018/11/10 12:06 1/2 Tablespace On-Offline 테이블스페이스온라인 / 오프라인 목차 Tablespace On-Offline 테이블스페이스온라인 / 오프라인... 1 일반테이블스페이스 (TABLESPACE)... 1 일반테이블스페이스생성하기... 1 테이블스페이스조회하기... 1 테이블스페이스에데이터파일 (DATA FILE) 추가

More information

PowerPoint Presentation

PowerPoint Presentation GIT with Atlassian Git 을이용한형상관리 박재석 대표 투씨드 Agenda Why Git? HISTORY ABOUT GIT 2005 년리누스토발즈에의해 Linux 커널프로젝트지원을위해제작된버전관리도구 12 년간지속적인발전및꾸준한성장세 CONCEPT 분산형버전관리시스템 Reverse Delta 방식이아닌변경에대한 Snapshot 방식 ARCHITECTURE

More information

28 THE ASIAN JOURNAL OF TEX [2] ko.tex [5]

28 THE ASIAN JOURNAL OF TEX [2] ko.tex [5] The Asian Journal of TEX, Volume 3, No. 1, June 2009 Article revision 2009/5/7 KTS THE KOREAN TEX SOCIETY SINCE 2007 2008 ko.tex Installing TEX Live 2008 and ko.tex under Ubuntu Linux Kihwang Lee * kihwang.lee@ktug.or.kr

More information

리눅스기초

리눅스기초 1 목차 Github 개요 Github 계정만들기 Github 저장소만들기 Github 저장소를이용한작업하기 팀구성하여공동작업하기 2 System Security Lab@Myongji Univ. GitHub github.com git 기반의공개 SW 호스팅사이트 웹사이트를통해팀프로젝트에필요한유용한기능을제공 소스코드, 커밋히스토리, 브랜치등을확인 이슈추적하기

More information

휠세미나3 ver0.4

휠세미나3 ver0.4 andromeda@sparcs:/$ ls -al dev/sda* brw-rw---- 1 root disk 8, 0 2014-06-09 18:43 dev/sda brw-rw---- 1 root disk 8, 1 2014-06-09 18:43 dev/sda1 brw-rw---- 1 root disk 8, 2 2014-06-09 18:43 dev/sda2 andromeda@sparcs:/$

More information

¹Ìµå¹Ì3Â÷Àμâ

¹Ìµå¹Ì3Â÷Àμâ MIDME LOGISTICS Trusted Solutions for 02 CEO MESSAGE MIDME LOGISTICS CO., LTD. 01 Ceo Message We, MIDME LOGISTICS CO., LTD. has established to create aduance logistics service. Try to give confidence to

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Deep Learning 작업환경조성 & 사용법 ISL 안재원 Ubuntu 설치 작업환경조성 접속방법 사용예시 2 - ISO file Download www.ubuntu.com Ubuntu 설치 3 - Make Booting USB Ubuntu 설치 http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

More information

RVC Robot Vaccum Cleaner

RVC Robot Vaccum Cleaner RVC Robot Vacuum 200810048 정재근 200811445 이성현 200811414 김연준 200812423 김준식 Statement of purpose Robot Vacuum (RVC) - An RVC automatically cleans and mops household surface. - It goes straight forward while

More information

노트북 IT / 모바일 데스크탑 34 올인원PC 35 PC 소프트웨어 포터블SSD / SSD / 메모리카드 36 태블릿 37 휴대폰 39 PC 솔루션 IT / 모바일 IT / 모바일 노트북 29 삼성전자는 Windows 를 권장합니다. 삼성전자만의 편리하고 다양한 소프트웨어를 통해 초보자도 보다 쉽고 빠르게 이용 가능합니다. Easy Settings 삼성 패스트

More information

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O Orange for ORACLE V4.0 Installation Guide ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE...1 1....2 1.1...2 1.2...2 1.2.1...2 1.2.2 (Online Upgrade)...11 1.3 ORANGE CONFIGURATION ADMIN...12 1.3.1 Orange Configuration

More information

퇴좈저널36호-4차-T.ps, page 2 @ Preflight (2)

퇴좈저널36호-4차-T.ps, page 2 @ Preflight (2) Think Big, Act Big! Character People Literature Beautiful Life History Carcere Mamertino World Special Interview Special Writing Math English Quarts I have been driven many times to my knees by the overwhelming

More information

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 2012.11.23 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Document Distribution Copy Number Name(Role, Title) Date

More information

6자료집최종(6.8))

6자료집최종(6.8)) Chapter 1 05 Chapter 2 51 Chapter 3 99 Chapter 4 151 Chapter 1 Chapter 6 7 Chapter 8 9 Chapter 10 11 Chapter 12 13 Chapter 14 15 Chapter 16 17 Chapter 18 Chapter 19 Chapter 20 21 Chapter 22 23 Chapter

More information

주제별로명령들이따로있는것을보면주제끼리의순서는상관없어도명령들의위치를지 켜야할지도모른다. 하지만실험은해보지않았으니심심하면체크해봐도된다. [CRAB] CRAB 을하기위한가장기본적인세팅이다. jobtype = cmssw scheduler = glite 등이있다. 보통 CRAB

주제별로명령들이따로있는것을보면주제끼리의순서는상관없어도명령들의위치를지 켜야할지도모른다. 하지만실험은해보지않았으니심심하면체크해봐도된다. [CRAB] CRAB 을하기위한가장기본적인세팅이다. jobtype = cmssw scheduler = glite 등이있다. 보통 CRAB CRAB job 1. CRAB이란? CRAB: CMS Remote Analysis Builder 원격으로 Tier-2에접속해서일을하는프로그램이다. 사용자의컴퓨터가아닌외부의 Tier-2에서일이돌아가므로사용자의 terminal이꺼진다해도일이끊기지않는다. 2. 전제조건 private key 가있어야한다. VO member 여야한다. 3. sitedb CMS에서해당

More information

Windows Server 2012

Windows Server  2012 Windows Server 2012 Shared Nothing Live Migration Shared Nothing Live Migration 은 SMB Live Migration 방식과다른점은 VM 데이터파일의위치입니다. Shared Nothing Live Migration 방식은 Hyper-V 호스트의로컬디스크에 VM 데이터파일이위치합니다. 반면에, SMB

More information

PowerChute Personal Edition v3.1.0 에이전트 사용 설명서

PowerChute Personal Edition v3.1.0 에이전트 사용 설명서 PowerChute Personal Edition v3.1.0 990-3772D-019 4/2019 Schneider Electric IT Corporation Schneider Electric IT Corporation.. Schneider Electric IT Corporation,,,.,. Schneider Electric IT Corporation..

More information

Stage 2 First Phonics

Stage 2 First Phonics ORT Stage 2 First Phonics The Big Egg What could the big egg be? What are the characters doing? What do you think the story will be about? (큰 달걀은 무엇일까요? 등장인물들은 지금 무엇을 하고 있는 걸까요? 책은 어떤 내용일 것 같나요?) 대해 칭찬해

More information

슬라이드 1

슬라이드 1 TortoiseSVN 1. 도구개요 2. 설치및실행 3. 주요기능 4. 활용예제 1. 도구개요 1.1 도구정보요약 도구명 Tortoise SVN (http://tortoisesvn.net) 라이선스 GNU GPL v2.0 소개 Subversion 를통해서소스버전관리를할수있게하는클라이언트도구 특징 Windows Explorer 에서곧바로 Subversion 를사용하여버전컨트롤가능

More information

목차 1. 시스템요구사항 암호및힌트설정 ( 윈도우 ) JetFlash Vault 시작하기 ( 윈도우 ) JetFlash Vault 옵션 ( 윈도우 )... 9 JetFlash Vault 설정... 9 JetFlash Vault

목차 1. 시스템요구사항 암호및힌트설정 ( 윈도우 ) JetFlash Vault 시작하기 ( 윈도우 ) JetFlash Vault 옵션 ( 윈도우 )... 9 JetFlash Vault 설정... 9 JetFlash Vault 사용자매뉴얼 JetFlash Vault 100 ( 버전 1.0) 1 목차 1. 시스템요구사항... 3 2. 암호및힌트설정 ( 윈도우 )... 3 3. JetFlash Vault 시작하기 ( 윈도우 )... 7 4. JetFlash Vault 옵션 ( 윈도우 )... 9 JetFlash Vault 설정... 9 JetFlash Vault 찾아보기... 10 JetFlash

More information

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우. 소프트웨어매뉴얼 윈도우드라이버 Rev. 3.03 SLP-TX220 / TX223 SLP-TX420 / TX423 SLP-TX400 / TX403 SLP-DX220 / DX223 SLP-DX420 / DX423 SLP-DL410 / DL413 SLP-T400 / T403 SLP-T400R / T403R SLP-D220 / D223 SLP-D420 / D423

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 오픈소스소프트웨어개발입문 (CP33992) 소스코드버전관리 부산대학교공과대학정보컴퓨터공학부 학습목표 소스코드에대한버전관리의개념과필요성을설명할수있다. git 을활용한버전관리방법을알수있다. 2 버전관리도구 버전관리도구 소프트웨어개발시팀단위로개발중인소스코드등디지털문서의관리에사용 파일의변화를시간에따라기록하여과거특정시점의버전을다시불러올수있는도구 특징및주요기능 소프트웨어개발시팀단위로개발중인소스코드등의디지털문서관리에사용

More information

리눅스설치가이드 3. 3Rabbitz Book 을리눅스에서설치하기위한절차는다음과같습니다. 설치에대한예시는우분투서버 기준으로진행됩니다. 1. Java Development Kit (JDK) 또는 Java Runtime Environment (JRE) 를설치합니다. 2.

리눅스설치가이드 3. 3Rabbitz Book 을리눅스에서설치하기위한절차는다음과같습니다. 설치에대한예시는우분투서버 기준으로진행됩니다. 1. Java Development Kit (JDK) 또는 Java Runtime Environment (JRE) 를설치합니다. 2. 3. 3Rabbitz Book 을리눅스에서설치하기위한절차는다음과같습니다. 설치에대한예시는우분투서버 기준으로진행됩니다. 1. Java Development Kit (JDK) 또는 Java Runtime Environment (JRE) 를설치합니다. 2. 3Rabbitz Book 애플리케이션파일다운로드하여압축파일을풀고복사합니다. 3. 3Rabbitz Book 실행합니다.

More information

0125_ 워크샵 발표자료_완성.key

0125_ 워크샵 발표자료_완성.key WordPress is a free and open-source content management system (CMS) based on PHP and MySQL. WordPress is installed on a web server, which either is part of an Internet hosting service or is a network host

More information

PowerPoint Template

PowerPoint Template JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

슬라이드 1

슬라이드 1 UGENS SNC Techinical Report OEL6 + 12C RAC 사원최재정 UGENS SNC 목차 1. 12c 설치된곳에자료수집 2. SERVER DB 삭제 3. 12c grid 설치 4. oracle 12c 설치 5. 확인 2 Vi.bash_profile if [ -f ~/.bashrc ]; then. ~/.bashrc fi # User specific

More information

슬라이드 1

슬라이드 1 Subclipse 1. 도구개요 2. 설치및실행 3. 주요기능 4. 활용예제 1. 도구개요 도구명 Subclipse (http://subclipse.tigris.org/) 라이선스 Eclipse Public License v1.0 소개 Subversion( 이하 svn) 용 Eclipse 플러그인 SVN 을만든 Tigris.org 에서만든클라이언트툴 Java

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 1 Tizen 실습예제 : Remote Key Framework 시스템소프트웨어특론 (2014 년 2 학기 ) Sungkyunkwan University Contents 2 Motivation and Concept Requirements Design Implementation Virtual Input Device Driver 제작 Tizen Service 개발절차

More information

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate ALTIBASE HDB 6.1.1.5.6 Patch Notes 목차 BUG-39240 offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG-41443 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate 한뒤, hash partition

More information

1

1 2/33 3/33 4/33 5/33 6/33 7/33 8/33 9/33 10/33 11/33 12/33 13/33 14/33 15/33 16/33 17/33 5) 입력을 다 했으면 확인 버튼을 클릭합니다. 6) 시작 페이지가 제대로 설정이 되었는지 살펴볼까요. 익스플로러를 종료하고 다시 실행시켜 보세요. 시작화면에 야후! 코리아 화면이 뜬다면 설정 완료..^^

More information

영어-중2-천재김-07과-어순-B.hwp

영어-중2-천재김-07과-어순-B.hwp Think Twice, Think Green 1 도와드릴까요? Listen and Speak 1 (I / you / may / help) 130,131 15 이 빨간 것은 어때요? (this / how / red / about / one) 16 오, 저는 그것이 좋아요. (I / it / oh / like) 2 저는 야구 모자를 찾고 있는데요. (a / looking

More information

歯kjmh2004v13n1.PDF

歯kjmh2004v13n1.PDF 13 1 ( 24 ) 2004 6 Korean J Med Hist 13 1 19 Jun 2004 ISSN 1225 505X 1) * * 1 ( ) 2) 3) 4) * 1) ( ) 3 2) 7 1 3) 2 1 13 1 ( 24 ) 2004 6 5) ( ) ( ) 2 1 ( ) 2 3 2 4) ( ) 6 7 5) - 2003 23 144-166 2 2 1) 6)

More information

` Companies need to play various roles as the network of supply chain gradually expands. Companies are required to form a supply chain with outsourcing or partnerships since a company can not

More information

슬라이드 1

슬라이드 1 Git 심화 l NIPA KOSSLab. Taeung Song taeung@kosslab.kr 26-09- Instructor 송태웅 (Taeung Song, https://github.com/taeung) - NIPA KOSS(Korean Open Source Software) Lab. Software Engineer - Linux Kernel 프로젝트 Contributor

More information

IP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1

IP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1 IP 심화 º 각 P 의게이트웨이는해당네트워크의마지막주소를사용한다. - P1 (210.220.10.1/26) 의게이트웨이 (5의 Fa0/0) : 210.220.10.63 /26 = 255.255.255.192 호스트비트수 : 32-26 = 6 비트 => = 64 그러므로 P1의 IP 210.220.10.1 중서브넷마스크에의거 26비트는변함이없고, 나머지 6비트가호스트비트로변하므로

More information

야쿠르트2010 9월재출

야쿠르트2010 9월재출 2010. 09www.yakult.co.kr 08 04 07 Theme Special_ Great Work Place 08 10 12 13 13 14 16 18 20 22 20 24 26 28 30 31 24 06+07 08+09 Theme Advice Great Work Place 10+11 Theme Story Great Work Place 4 1 5 2

More information

초보자를 위한 분산 캐시 활용 전략

초보자를 위한 분산 캐시 활용 전략 초보자를위한분산캐시활용전략 강대명 charsyam@naver.com 우리가꿈꾸는서비스 우리가꿈꾸는서비스 우리가꿈꾸는서비스 우리가꿈꾸는서비스 그러나현실은? 서비스에필요한것은? 서비스에필요한것은? 핵심적인기능 서비스에필요한것은? 핵심적인기능 서비스에필요한것은? 핵심적인기능 서비스에필요한것은? 적절한기능 서비스안정성 트위터에매일고래만보이면? 트위터에매일고래만보이면?

More information

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx To be an Android Expert 문양세강원대학교 IT 대학컴퓨터학부 개발환경구조및설치순서 JDK 설치 Eclipse 설치 안드로이드 SDK 설치 ADT(Androd Development Tools) 설치 AVD(Android Virtual Device) 생성 Hello Android! 2 Eclipse (IDE) JDK Android SDK with

More information

- 2 -

- 2 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9 - - 10 - - 11 - - 12 - - 13 - - 14 - - 15 - - 16 - - 17 - - 18 - - 19 - - 20 - - 21 - - 22 - - 23 - - 24 - - 25 - - 26 - - 27 - - 28 - - 29 - - 30 -

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 인터넷프로토콜 5 장 데이터송수신 (3) 1 파일전송메시지구성예제 ( 고정크기메시지 ) 전송방식 : 고정크기 ( 바이너리전송 ) 필요한전송정보 파일이름 ( 최대 255 자 => 255byte 의메모리공간필요 ) 파일크기 (4byte 의경우최대 4GB 크기의파일처리가능 ) 파일내용 ( 가변길이, 0~4GB 크기 ) 메시지구성 FileName (255bytes)

More information

Software Verification Team 오준 임국현 주영진 김슬기

Software Verification Team 오준 임국현 주영진 김슬기 Software Verification Team 2 200611490 오준 201011358 임국현 200913988 주영진 201011318 김슬기 Contents CTIP Mantis Additional info Q&A CTIP Continuous Test & Integration Platform CI 개념을바탕으로소스검토 ( 테스트및정적분석 ), 빌드,

More information

step 1-1

step 1-1 Written by Dr. In Ku Kim-Marshall STEP BY STEP Korean 1 through 15 Action Verbs Table of Contents Unit 1 The Korean Alphabet, hangeul Unit 2 Korean Sentences with 15 Action Verbs Introduction Review Exercises

More information

2007 학년도 하반기 졸업작품 아무도 모른다 (Nobody Knows) 얄리, 보마빼 (AIi, Bomaye) 외계인간 ( 外 界 人 間 ) 한국예술종합학교 연극원 극작과 예술전문사 2005523003 안 재 승

2007 학년도 하반기 졸업작품 아무도 모른다 (Nobody Knows) 얄리, 보마빼 (AIi, Bomaye) 외계인간 ( 外 界 人 間 ) 한국예술종합학교 연극원 극작과 예술전문사 2005523003 안 재 승 2007 학년도 하반기 졸업작품 아무도 모른다 (Nobody Knows) 알리, 보마예 (Ali, Bomaye) 외계인간 ( 外 界 A 間 ) 원 사 3 승 극 문 연 전 재 E 숨 } 닮 런 예 m 안 합 과 ; 조 O 자 숨 그, 예 시 국 하 2007 학년도 하반기 졸업작품 아무도 모른다 (Nobody Knows) 얄리, 보마빼 (AIi, Bomaye)

More information

Output file

Output file 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 An Application for Calculation and Visualization of Narrative Relevance of Films Using Keyword Tags Choi Jin-Won (KAIST) Film making

More information

강의10

강의10 Computer Programming gdb and awk 12 th Lecture 김현철컴퓨터공학부서울대학교 순서 C Compiler and Linker 보충 Static vs Shared Libraries ( 계속 ) gdb awk Q&A Shared vs Static Libraries ( 계속 ) Advantage of Using Libraries Reduced

More information

Microsoft Word - release note-VRRP_Korean.doc

Microsoft Word - release note-VRRP_Korean.doc VRRP (Virtual Router Redundancy Protocol) 기능추가 Category S/W Release Version Date General 7.01 22 Dec. 2003 Function Description VRRP 는여러대의라우터를그룹으로묶어하나의가상 IP 어드레스를부여해마스터로지정된라우터장애시 VRRP 그룹내의백업라우터가마스터로자동전환되는프로토콜입니다.

More information

Windows 10 General Announcement v1.0-KO

Windows 10 General Announcement v1.0-KO Windows 10 Fuji Xerox 장비와의호환성 v1.0 7 July, 2015 머리말 Microsoft 는 Windows 10 이 Windows 자동업데이트기능을통해예약되어질수있다고 6 월 1 일발표했다. 고객들은 윈도우 10 공지알림을받기 를표시하는새로운아이콘을알아차릴수있습니다. Fuji Xerox 는 Microsoft 에서가장최신운영시스템인 Windows

More information

PathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.

PathEye 공식 블로그 다운로드 받으세요!!   지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다. PathEye Mobile Ver. 0.71b 2009. 3. 17 By PathEye 공식 블로그 다운로드 받으세요!! http://blog.patheye.com 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다. PathEye 설치 1/3 최종 배포 버전을 다 운로드 받습니다. 다운로드된 파일은 CAB 파일입니다. CAB 파일에는

More information

vRealize Automation용 VMware Remote Console - VMware

vRealize Automation용 VMware Remote Console - VMware vrealize Automation 용 VMware Remote Console VMware Remote Console 9.0 이문서는새버전으로교체되기전까지나열된각제품버전및모든이후버전을지원합니다. 이문서에대한최신버전을확인하려면 http://www.vmware.com/kr/support/pubs 를참조하십시오. KO-002230-00 vrealize Automation

More information

untitled

untitled Push... 2 Push... 4 Push... 5 Push... 13 Push... 15 1 FORCS Co., LTD A Leader of Enterprise e-business Solution Push (Daemon ), Push Push Observer. Push., Observer. Session. Thread Thread. Observer ID.

More information

Microsoft PowerPoint - comp_prac_081223_2.pptx

Microsoft PowerPoint - comp_prac_081223_2.pptx Computer Programming Practice (2008 Winter) Practice 2 기본 Unix/Linux 명령어숙지 2008. 12. 23 Contents Linux commands Basic commands File and Directory User Data Filtering Process Etc Conclusion & Recommended

More information

하나님의 선한 손의 도우심 이세상에서 가장 큰 축복은 하나님이 나와 함께 하시는 것입니다. 그 이 유는 하나님이 모든 축복의 근원이시기 때문입니다. 에스라서에 보면 하나님의 선한 손의 도우심이 함께 했던 사람의 이야기 가 나와 있는데 에스라 7장은 거듭해서 그 비결을

하나님의 선한 손의 도우심 이세상에서 가장 큰 축복은 하나님이 나와 함께 하시는 것입니다. 그 이 유는 하나님이 모든 축복의 근원이시기 때문입니다. 에스라서에 보면 하나님의 선한 손의 도우심이 함께 했던 사람의 이야기 가 나와 있는데 에스라 7장은 거듭해서 그 비결을 새벽이슬 2 0 1 3 a u g u s t 내가 이스라엘에게 이슬과 같으리니 그가 백합화같이 피 겠고 레바논 백향목같이 뿌리가 박힐것이라. Vol 5 Number 3 호세아 14:5 하나님의 선한 손의 도우심 이세상에서 가장 큰 축복은 하나님이 나와 함께 하시는 것입니다. 그 이 유는 하나님이 모든 축복의 근원이시기 때문입니다. 에스라서에 보면 하나님의 선한

More information

NTD36HD Manual

NTD36HD Manual Upnp 사용 D7 은 UPNP 를지원하여 D7 의네크워크에연결된 UPNP 기기에별다른설정없이연결하여, 유무선으로네트워크상의연결된 UPNP 기기의콘텐츠를재생할수있습니다. TV 화면의 브라우저, UPNP 를선택하면연결가능한 UPNP 기기가표시됩니다. 주의 - UPNP 기능사용시연결된 UPNP 기기의성능에따라서재생되지않는콘텐츠가있을수있습니다. NFS 사용 D7

More information

Microsoft Word - FunctionCall

Microsoft Word - FunctionCall Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack

More information

DE1-SoC Board

DE1-SoC Board 실습 1 개발환경 DE1-SoC Board Design Tools - Installation Download & Install Quartus Prime Lite Edition http://www.altera.com/ Quartus Prime (includes Nios II EDS) Nios II Embedded Design Suite (EDS) is automatically

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Translation Song 1 Finger Family 한글 해석 p.3 아빠 손가락, 아빠 손가락. p.4 p.5 엄마 손가락, 엄마 손가락. p.6 p.7 오빠 손가락, 오빠 손가락. p.8 p.9 언니 손가락, 언니 손가락. p.10 p.11 아기 손가락, 아기 손가락. p.12 p.13 p.14-15 재미있게 부르기 (Sing and Play Time)

More information

4. 수업의 흐름 차시 창의 인성 수업모형에 따른 단계 수업단계 활동내용 창의 요소 인성 요소 관찰 사전학습: 날짜와 힌트를 보고 기념일 맞춰보기 호기심 논리/ 분석적 사고 유추 5 차시 분석 핵심학습 그림속의 인물이나 사물의 감정을 생각해보고 써보기 타인의 입장 감정

4. 수업의 흐름 차시 창의 인성 수업모형에 따른 단계 수업단계 활동내용 창의 요소 인성 요소 관찰 사전학습: 날짜와 힌트를 보고 기념일 맞춰보기 호기심 논리/ 분석적 사고 유추 5 차시 분석 핵심학습 그림속의 인물이나 사물의 감정을 생각해보고 써보기 타인의 입장 감정 World Special Days 1. 수업 목표 과목 영어 학년 6 학년 내용 목표 인성 목표 언어 목표 여러 기념일에 대해 알아보고 새로운 기념일을 만들고 소개할 수 있다. 소외된 사람이나 사물에 대해 생각해보고 이들에 대한 배려와 관심의 필요성을 깨달음으로써 타인의 입장에 감정 이입, 배려 등의 요소를 기를 수 있다. 기념일이나 특별한 날짜를 묻고 대답할

More information

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc Visual Studio 2005 + Intel Visual Fortran 9.1 install Intel Visual Fortran 9.1 intel Visual Fortran Compiler 9.1 만설치해서 DOS 모드에서실행할수있지만, Visual Studio 2005 의 IDE 를사용하기위해서는 Visual Studio 2005 를먼저설치후 Integration

More information

<B1E2C8B9BEC828BFCFBCBAC1F7C0FC29322E687770>

<B1E2C8B9BEC828BFCFBCBAC1F7C0FC29322E687770> 맛있는 한국으로의 초대 - 중화권 음식에서 한국 음식의 관광 상품화 모색하기 - 소속학교 : 한국외국어대학교 지도교수 : 오승렬 교수님 ( 중국어과) 팀 이 름 : 飮 食 男 女 ( 음식남녀) 팀 원 : 이승덕 ( 중국어과 4) 정진우 ( 중국어과 4) 조정훈 ( 중국어과 4) 이민정 ( 중국어과 3) 탐방목적 1. 한국 음식이 가지고 있는 장점과 경제적 가치에도

More information

6 영상기술연구 실감하지 못했을지도 모른다. 하지만 그 이외의 지역에서 3D 영화를 관람하기란 그리 쉬운 일이 아니다. 영화 <아바타> 이후, 티켓 파워에 민감한 국내 대형 극장 체인들이 2D 상영관을 3D 상영관으로 점차적으로 교체하는 추세이긴 하지만, 아직까지는 관

6 영상기술연구 실감하지 못했을지도 모른다. 하지만 그 이외의 지역에서 3D 영화를 관람하기란 그리 쉬운 일이 아니다. 영화 <아바타> 이후, 티켓 파워에 민감한 국내 대형 극장 체인들이 2D 상영관을 3D 상영관으로 점차적으로 교체하는 추세이긴 하지만, 아직까지는 관 아바타를 중심으로 본 3D 영화산업의 기술동향과 발전방향에 관한 연구 5 연구논문 연구논문 아바타를 중심으로 본 3D 영화산업의 기술동향과 발전방향에 관한 연구 진 승 현 동명대학교 미디어영상전공 교수 I. 서론 얼마 전 제 15회 신지식인 인증 및 시상식에서 대한민국의 대표 신지식인 대상을 영화 의 주경중 감독이 수상했다. 대한민국 3D 영화 제작의

More information

Microsoft Word - [2017SMA][T8]OOPT_Stage_2040 ver2.docx

Microsoft Word - [2017SMA][T8]OOPT_Stage_2040 ver2.docx OOPT Stage 2040 - Design Feesual CPT Tool Project Team T8 Date 2017-05-24 T8 Team Information 201211347 박성근 201211376 임제현 201411270 김태홍 2017 Team 8 1 Table of Contents 1. Activity 2041. Design Real Use

More information

6. Separate HDD by pulling in the arrow direction. * Cautions Avoid lifting HDD excessively, because Connector can be damaged ODD Remove

6. Separate HDD by pulling in the arrow direction. * Cautions Avoid lifting HDD excessively, because Connector can be damaged ODD Remove 3-1. Disassembly and Reassembly R510 [Caution] Attention to red sentence. 2 2 1. Before disassembling, the AC adaptor and Battery must be separated. 2. AS mark No.1/2 put KNOB-Battery to end of each side,

More information

U.Tu System Application DW Service AGENDA 1. 개요 4. 솔루션 모음 1.1. 제안의 배경 및 목적 4.1. 고객정의 DW구축에 필요한 메타정보 생성 1.2. 제품 개요 4.2. 사전 변경 관리 1.3. 제품 특장점 4.3. 부품화형

U.Tu System Application DW Service AGENDA 1. 개요 4. 솔루션 모음 1.1. 제안의 배경 및 목적 4.1. 고객정의 DW구축에 필요한 메타정보 생성 1.2. 제품 개요 4.2. 사전 변경 관리 1.3. 제품 특장점 4.3. 부품화형 AGENDA 1. 개요 4. 솔루션 모음 1.1. 제안의 배경 및 목적 4.1. 고객정의 DW구축에 필요한 메타정보 생성 1.2. 제품 개요 4.2. 사전 변경 관리 1.3. 제품 특장점 4.3. 부품화형 언어 변환 1.4. 기대 효과 4.4. 프로그램 Restructuring 4.5. 소스 모듈 관리 2. SeeMAGMA 적용 전략 2.1. SeeMAGMA

More information