CINXE.COM
Git - 리비전 조회하기
<!DOCTYPE html> <html lang="ko"> <head> <meta charset='utf-8'> <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Git - 리비전 조회하기</title> <link href="/favicon.ico" rel='shortcut icon' type='image/x-icon'> <link rel="stylesheet" href="/application.min.css"> <script src="/js/modernizr.js"></script> <script src="/js/modernize.js"></script> </head> <body id="documentation"> <div class="inner"> <header> <a href="/"><img src="/images/logo@2x.png" width="110" height="46" alt="Git" /></a> <span id="tagline"></span> <script type="text/javascript"> const taglines = [ "fast-version-control", "everything-is-local", "distributed-even-if-your-workflow-isnt", "local-branching-on-the-cheap", "distributed-is-the-new-centralized" ]; var tagline = taglines[Math.floor(Math.random() * taglines.length)]; document.getElementById('tagline').innerHTML = '--' + tagline; </script> <form id="search" action="/search/results"> <input id="search-text" name="search" placeholder="Type / to search entire site…" autocomplete="off" type="text" /> </form> <div id="search-results"></div> </header> </div> <div class="inner"> <div id="content-wrapper"> <div tabindex="1" class="sidebar-btn"></div> <aside class="sidebar" id="sidebar"> <nav> <ul> <li> <a href="/about">About</a> <ul> </ul> </li> <li> <a href="/doc" class="active">Documentation</a> <ul class="expanded"> <li> <a href="/docs">Reference</a> </li> <li> <a href="/book" class="active">Book</a> </li> <li> <a href="/videos">Videos</a> </li> <li> <a href="/doc/ext">External Links</a> </li> </ul> </li> <li> <a href="/downloads">Downloads</a> <ul > <li> <a href="/downloads/guis">GUI Clients</a> </li> <li> <a href="/downloads/logos">Logos</a> </li> </ul> </li> <li> <a href="/community">Community</a> </li> </ul> <hr class="sidebar"> <p> This book is available in <a href="/book/en/v2/Git-Tools-Revision-Selection">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git-Al%c9%99tl%c9%99ri-Reviziya-Se%c3%a7imi">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/Git-%d0%b8-%d0%b4%d1%80%d1%83%d0%b3%d0%b8-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b8-Git-%d0%ba%d0%b0%d1%82%d0%be-%d0%ba%d0%bb%d0%b8%d0%b5%d0%bd%d1%82">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Tools-Revisions-Auswahl">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Herramientas-de-Git-Revisi%c3%b3n-por-selecci%c3%b3n">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Utilitaires-Git-S%c3%a9lection-des-versions">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git-%e3%81%ae%e3%81%95%e3%81%be%e3%81%96%e3%81%be%e3%81%aa%e3%83%84%e3%83%bc%e3%83%ab-%e3%83%aa%e3%83%93%e3%82%b8%e3%83%a7%e3%83%b3%e3%81%ae%e9%81%b8%e6%8a%9e">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%eb%a6%ac%eb%b9%84%ec%a0%84-%ec%a1%b0%ed%9a%8c%ed%95%98%ea%b8%b0">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Tools-Revisie-Selectie">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%98%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-Git-%d0%92%d1%8b%d0%b1%d0%be%d1%80-%d1%80%d0%b5%d0%b2%d0%b8%d0%b7%d0%b8%d0%b8">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Orodja-Git-Izbira-revizije">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Git-na-Kasangkapan-Pagpipili-ng-Rebisyon">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%86%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b8-Git-%d0%92%d0%b8%d0%b1%d1%96%d1%80-%d1%80%d0%b5%d0%b2%d1%96%d0%b7%d1%96%d0%b9">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e9%80%89%e6%8b%a9%e4%bf%ae%e8%ae%a2%e7%89%88%e6%9c%ac">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Tools-Revision-Selection">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/Git-%d0%90%d0%bb%d0%b0%d1%82%d0%ba%d0%b8-Revision-Selection">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Narz%c4%99dzia-Gita-Wskazywanie-rewizji">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b0%d0%bb%d0%b0%d1%82%d0%b8-%d0%98%d0%b7%d0%b1%d0%be%d1%80-%d1%80%d0%b5%d0%b2%d0%b8%d0%b7%d0%b8%d1%98%d0%b0">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Tools-Revision-Selection">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-%e5%b7%a5%e5%85%b7-Revision-Selection">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Tools-Revision-Selection">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Tools-Revision-Selection" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Tools-Revision-Selection">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Tools-Revision-Selection">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Tools-Revision-Selection">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Git-Tools-Revision-Selection">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Ferramentas-do-Git-Revision-Selection">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Tools-Revision-Selection">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-D%c3%bczeltme-Se%c3%a7imi">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit/progit2-ko">hosted on GitHub.</a></br> Patches, suggestions and comments are welcome. </p> </nav> </aside> <div id="content"> <div id="book-chapters"> <a class="dropdown-trigger" id="book-chapters-trigger" data-panel-id="chapters-dropdown" href="#">Chapters ▾</a> <div class='dropdown-panel' id='chapters-dropdown'> <div class='three-column'> <div class="column-left"> <ol class='book-toc'> <li class='chapter'> <h2>1. <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac%eb%9e%80%3F">시작하기</a></h2> <ol> <li> 1.1 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac%eb%9e%80%3F">버전 관리란?</a> </li> <li> 1.2 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a7%a7%ea%b2%8c-%eb%b3%b4%eb%8a%94-Git%ec%9d%98-%ec%97%ad%ec%82%ac">짧게 보는 Git의 역사</a> </li> <li> 1.3 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-Git-%ea%b8%b0%ec%b4%88">Git 기초</a> </li> <li> 1.4 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-CLI">CLI</a> </li> <li> 1.5 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-Git-%ec%84%a4%ec%b9%98">Git 설치</a> </li> <li> 1.6 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-Git-%ec%b5%9c%ec%b4%88-%ec%84%a4%ec%a0%95">Git 최초 설정</a> </li> <li> 1.7 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%eb%8f%84%ec%9b%80%eb%a7%90-%eb%b3%b4%ea%b8%b0">도움말 보기</a> </li> <li> 1.8 <a href="/book/ko/v2/%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-Git-%ec%a0%80%ec%9e%a5%ec%86%8c-%eb%a7%8c%eb%93%a4%ea%b8%b0">Git의 기초</a></h2> <ol> <li> 2.1 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-Git-%ec%a0%80%ec%9e%a5%ec%86%8c-%eb%a7%8c%eb%93%a4%ea%b8%b0">Git 저장소 만들기</a> </li> <li> 2.2 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-%ec%88%98%ec%a0%95%ed%95%98%ea%b3%a0-%ec%a0%80%ec%9e%a5%ec%86%8c%ec%97%90-%ec%a0%80%ec%9e%a5%ed%95%98%ea%b8%b0">수정하고 저장소에 저장하기</a> </li> <li> 2.3 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-%ec%bb%a4%eb%b0%8b-%ed%9e%88%ec%8a%a4%ed%86%a0%eb%a6%ac-%ec%a1%b0%ed%9a%8c%ed%95%98%ea%b8%b0">커밋 히스토리 조회하기</a> </li> <li> 2.4 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-%eb%90%98%eb%8f%8c%eb%a6%ac%ea%b8%b0">되돌리기</a> </li> <li> 2.5 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-%eb%a6%ac%eb%aa%a8%ed%8a%b8-%ec%a0%80%ec%9e%a5%ec%86%8c">리모트 저장소</a> </li> <li> 2.6 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-%ed%83%9c%ea%b7%b8">태그</a> </li> <li> 2.7 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-Git-Alias">Git Alias</a> </li> <li> 2.8 <a href="/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%eb%b8%8c%eb%9e%9c%ec%b9%98%eb%9e%80-%eb%ac%b4%ec%97%87%ec%9d%b8%ea%b0%80">Git 브랜치</a></h2> <ol> <li> 3.1 <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%eb%b8%8c%eb%9e%9c%ec%b9%98%eb%9e%80-%eb%ac%b4%ec%97%87%ec%9d%b8%ea%b0%80">브랜치란 무엇인가</a> </li> <li> 3.2 <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%eb%b8%8c%eb%9e%9c%ec%b9%98%ec%99%80-Merge-%ec%9d%98-%ea%b8%b0%ec%b4%88">브랜치와 Merge 의 기초</a> </li> <li> 3.3 <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%eb%b8%8c%eb%9e%9c%ec%b9%98-%ea%b4%80%eb%a6%ac">브랜치 관리</a> </li> <li> 3.4 <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%eb%b8%8c%eb%9e%9c%ec%b9%98-%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c">브랜치 워크플로</a> </li> <li> 3.5 <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%eb%a6%ac%eb%aa%a8%ed%8a%b8-%eb%b8%8c%eb%9e%9c%ec%b9%98">리모트 브랜치</a> </li> <li> 3.6 <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-Rebase-%ed%95%98%ea%b8%b0">Rebase 하기</a> </li> <li> 3.7 <a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-%ed%94%84%eb%a1%9c%ed%86%a0%ec%bd%9c">Git 서버</a></h2> <ol> <li> 4.1 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-%ed%94%84%eb%a1%9c%ed%86%a0%ec%bd%9c">프로토콜</a> </li> <li> 4.2 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-%ec%84%9c%eb%b2%84%ec%97%90-Git-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0">서버에 Git 설치하기</a> </li> <li> 4.3 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-SSH-%ea%b3%b5%ea%b0%9c%ed%82%a4-%eb%a7%8c%eb%93%a4%ea%b8%b0">SSH 공개키 만들기</a> </li> <li> 4.4 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-%ec%84%9c%eb%b2%84-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0">서버 설정하기</a> </li> <li> 4.5 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-Git-%eb%8d%b0%eb%aa%ac">Git 데몬</a> </li> <li> 4.6 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-%ec%8a%a4%eb%a7%88%ed%8a%b8-HTTP">스마트 HTTP</a> </li> <li> 4.7 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-%eb%98%90-%eb%8b%a4%eb%a5%b8-%ec%84%a0%ed%83%9d%ec%a7%80,-%ed%98%b8%ec%8a%a4%ed%8c%85">또 다른 선택지, 호스팅</a> </li> <li> 4.10 <a href="/book/ko/v2/Git-%ec%84%9c%eb%b2%84-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/ko/v2/%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-Git-%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c">분산 환경에서의 Git</a></h2> <ol> <li> 5.1 <a href="/book/ko/v2/%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-Git-%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c">분산 환경에서의 워크플로</a> </li> <li> 5.2 <a href="/book/ko/v2/%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-Git-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8%ec%97%90-%ea%b8%b0%ec%97%ac%ed%95%98%ea%b8%b0">프로젝트에 기여하기</a> </li> <li> 5.3 <a href="/book/ko/v2/%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-Git-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8-%ea%b4%80%eb%a6%ac%ed%95%98%ea%b8%b0">프로젝트 관리하기</a> </li> <li> 5.4 <a href="/book/ko/v2/%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-Git-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/ko/v2/GitHub-%ea%b3%84%ec%a0%95-%eb%a7%8c%eb%93%a4%ea%b3%a0-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/ko/v2/GitHub-%ea%b3%84%ec%a0%95-%eb%a7%8c%eb%93%a4%ea%b3%a0-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0">계정 만들고 설정하기</a> </li> <li> 6.2 <a href="/book/ko/v2/GitHub-GitHub-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8%ec%97%90-%ea%b8%b0%ec%97%ac%ed%95%98%ea%b8%b0">GitHub 프로젝트에 기여하기</a> </li> <li> 6.3 <a href="/book/ko/v2/GitHub-GitHub-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8-%ea%b4%80%eb%a6%ac%ed%95%98%ea%b8%b0">GitHub 프로젝트 관리하기</a> </li> <li> 6.4 <a href="/book/ko/v2/GitHub-Organization-%ea%b4%80%eb%a6%ac%ed%95%98%ea%b8%b0">Organization 관리하기</a> </li> <li> 6.5 <a href="/book/ko/v2/GitHub-GitHub-%ec%8a%a4%ed%81%ac%eb%a6%bd%ed%8c%85">GitHub 스크립팅</a> </li> <li> 6.6 <a href="/book/ko/v2/GitHub-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%eb%a6%ac%eb%b9%84%ec%a0%84-%ec%a1%b0%ed%9a%8c%ed%95%98%ea%b8%b0">Git 도구</a></h2> <ol> <li> 7.1 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%eb%a6%ac%eb%b9%84%ec%a0%84-%ec%a1%b0%ed%9a%8c%ed%95%98%ea%b8%b0" class="active">리비전 조회하기</a> </li> <li> 7.2 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%eb%8c%80%ed%99%94%ed%98%95-%eb%aa%85%eb%a0%b9">대화형 명령</a> </li> <li> 7.3 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Stashing%ea%b3%bc-Cleaning">Stashing과 Cleaning</a> </li> <li> 7.4 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%eb%82%b4-%ec%9e%91%ec%97%85%ec%97%90-%ec%84%9c%eb%aa%85%ed%95%98%ea%b8%b0">내 작업에 서명하기</a> </li> <li> 7.5 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%ea%b2%80%ec%83%89">검색</a> </li> <li> 7.6 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%ed%9e%88%ec%8a%a4%ed%86%a0%eb%a6%ac-%eb%8b%a8%ec%9e%a5%ed%95%98%ea%b8%b0">히스토리 단장하기</a> </li> <li> 7.7 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Reset-%eb%aa%85%ed%99%95%ed%9e%88-%ec%95%8c%ea%b3%a0-%ea%b0%80%ea%b8%b0">Reset 명확히 알고 가기</a> </li> <li> 7.8 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%ea%b3%a0%ea%b8%89-Merge">고급 Merge</a> </li> <li> 7.9 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Git%ec%9c%bc%eb%a1%9c-%eb%b2%84%ea%b7%b8-%ec%b0%be%ea%b8%b0">Git으로 버그 찾기</a> </li> <li> 7.11 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%ec%84%9c%eb%b8%8c%eb%aa%a8%eb%93%88">서브모듈</a> </li> <li> 7.12 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Bundle">Bundle</a> </li> <li> 7.13 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Replace">Replace</a> </li> <li> 7.14 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Credential-%ec%a0%80%ec%9e%a5%ec%86%8c">Credential 저장소</a> </li> <li> 7.15 <a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-Git-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0">Git맞춤</a></h2> <ol> <li> 8.1 <a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-Git-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0">Git 설정하기</a> </li> <li> 8.2 <a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-Git-Attributes">Git Attributes</a> </li> <li> 8.3 <a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-Git-Hooks">Git Hooks</a> </li> <li> 8.4 <a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-%ec%a0%95%ec%b1%85-%ea%b5%ac%ed%98%84%ed%95%98%ea%b8%b0">정책 구현하기</a> </li> <li> 8.5 <a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/ko/v2/Git%ea%b3%bc-%ec%97%ac%ed%83%80-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c-Git:-%eb%b2%94%ec%9a%a9-Client">Git과 여타 버전 관리 시스템</a></h2> <ol> <li> 9.1 <a href="/book/ko/v2/Git%ea%b3%bc-%ec%97%ac%ed%83%80-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c-Git:-%eb%b2%94%ec%9a%a9-Client">Git: 범용 Client</a> </li> <li> 9.2 <a href="/book/ko/v2/Git%ea%b3%bc-%ec%97%ac%ed%83%80-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c-Git%ec%9c%bc%eb%a1%9c-%ec%98%ae%ea%b8%b0%ea%b8%b0">Git으로 옮기기</a> </li> <li> 9.3 <a href="/book/ko/v2/Git%ea%b3%bc-%ec%97%ac%ed%83%80-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Plumbing-%eb%aa%85%eb%a0%b9%ea%b3%bc-Porcelain-%eb%aa%85%eb%a0%b9">Git의 내부</a></h2> <ol> <li> 10.1 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Plumbing-%eb%aa%85%eb%a0%b9%ea%b3%bc-Porcelain-%eb%aa%85%eb%a0%b9">Plumbing 명령과 Porcelain 명령</a> </li> <li> 10.2 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Git-%ea%b0%9c%ec%b2%b4">Git 개체</a> </li> <li> 10.3 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Git-Refs">Git Refs</a> </li> <li> 10.4 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Packfile">Packfile</a> </li> <li> 10.5 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Refspec">Refspec</a> </li> <li> 10.6 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-%eb%8d%b0%ec%9d%b4%ed%84%b0-%ec%a0%84%ec%86%a1-%ed%94%84%eb%a1%9c%ed%86%a0%ec%bd%9c">데이터 전송 프로토콜</a> </li> <li> 10.7 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-%ec%9a%b4%ec%98%81-%eb%b0%8f-%eb%8d%b0%ec%9d%b4%ed%84%b0-%eb%b3%b5%ea%b5%ac">운영 및 데이터 복구</a> </li> <li> 10.8 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-%ed%99%98%ea%b2%bd%eb%b3%80%ec%88%98">환경변수</a> </li> <li> 10.9 <a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-GUI">부록 A: 다양한 환경에서 Git 사용하기</a></h2> <ol> <li> A1.1 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-GUI">GUI</a> </li> <li> A1.2 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-Visual-Studio">Visual Studio</a> </li> <li> A1.3 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-Eclipse">Eclipse</a> </li> <li> A1.4 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-Bash">Bash</a> </li> <li> A1.5 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-Zsh">Zsh</a> </li> <li> A1.6 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-Git-in-Powershell">Git in Powershell</a> </li> <li> A1.7 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-A:-%eb%8b%a4%ec%96%91%ed%95%9c-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c-Git-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-%ec%9a%94%ec%95%bd">요약</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-B:-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98%ec%97%90-Git-%eb%84%a3%ea%b8%b0-Git-%eb%aa%85%eb%a0%b9%ec%96%b4">부록 B: 애플리케이션에 Git 넣기</a></h2> <ol> <li> A2.1 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-B:-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98%ec%97%90-Git-%eb%84%a3%ea%b8%b0-Git-%eb%aa%85%eb%a0%b9%ec%96%b4">Git 명령어</a> </li> <li> A2.2 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-B:-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98%ec%97%90-Git-%eb%84%a3%ea%b8%b0-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-B:-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98%ec%97%90-Git-%eb%84%a3%ea%b8%b0-JGit">JGit</a> </li> <li> A2.4 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-B:-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98%ec%97%90-Git-%eb%84%a3%ea%b8%b0-go-git">go-git</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95">부록 C: Git 명령어</a></h2> <ol> <li> A3.1 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%ec%84%a4%ec%b9%98%ec%99%80-%ec%84%a4%ec%a0%95">설치와 설정</a> </li> <li> A3.2 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8-%ea%b0%80%ec%a0%b8%ec%98%a4%ea%b8%b0%ec%99%80-%ec%83%9d%ec%84%b1%ed%95%98%ea%b8%b0">프로젝트 가져오기와 생성하기</a> </li> <li> A3.3 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%ec%8a%a4%eb%83%85%ec%83%b7-%eb%8b%a4%eb%a3%a8%ea%b8%b0">스냅샷 다루기</a> </li> <li> A3.4 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-Branch%ec%99%80-Merge">Branch와 Merge</a> </li> <li> A3.5 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%ea%b3%b5%ec%9c%a0%ed%95%98%ea%b3%a0-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8%ed%95%98%ea%b8%b0">공유하고 업데이트하기</a> </li> <li> A3.6 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%eb%b3%b4%ea%b8%b0%ec%99%80-%eb%b9%84%ea%b5%90">보기와 비교</a> </li> <li> A3.7 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-Debugging">Debugging</a> </li> <li> A3.8 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-Patch-%ed%95%98%ea%b8%b0">Patch 하기</a> </li> <li> A3.9 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-Email">Email</a> </li> <li> A3.10 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%eb%8b%a4%eb%a5%b8-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c">다른 버전 관리 시스템</a> </li> <li> A3.11 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-%ea%b4%80%eb%a6%ac">관리</a> </li> <li> A3.12 <a href="/book/ko/v2/%eb%b6%80%eb%a1%9d-C:-Git-%eb%aa%85%eb%a0%b9%ec%96%b4-Plumbing-%eb%aa%85%eb%a0%b9%ec%96%b4">Plumbing 명령어</a> </li> </ol> </li> </ol> </div> </div> </div> <span class="light" id="edition"> 2nd Edition </span> </div> <div id="main" data-pagefind-filter="category:book" data-pagefind-meta="category:Book" data-pagefind-weight="0.05" data-pagefind-body class="book edition2"> <h1>7.1 Git 도구 - 리비전 조회하기</h1> <div> <p>지금까지 일상적으로 자주 사용하는 명령들과 몇 가지 워크플로를 배웠다. 파일을 추적하고 커밋하는 등의 기본적인 명령뿐만 아니라 Staging Area가 왜 좋은지도 배웠고 가볍게 토픽 브랜치를 만들고 Merge 하는 방법도 다뤘다. 이제는 Git 저장소로 충분히 소스코드를 관리할 수 있을 것이다.</p><p>이 장에서는 일상적으로 사용하지는 않지만 위급한 상황에서 반드시 필요한 Git 도구를 살펴본다.</p> <h2 id="_revision_selection">리비전 조회하기</h2> <div class="paragraph"> <p>Git은 커밋 하나를 가리키거나 범위를 사용하여 여러 커밋을 가리키는 다양한 방법을 갖고 있다. 그 많은 방법을 아는 것이 필요하진 않지만 알아두면 좋다.</p> </div> <div class="sect3"> <h3 id="_리비전_하나_가리키기">리비전 하나 가리키기</h3> <div class="paragraph"> <p>40글자나 되는 긴긴 SHA-1 해시 값으로도 커밋을 외울 수 있지만 사람이 사용하기 좋은 방법이 있다. 이 절에서는 커밋을 가리키거나 표현하는 방법을 몇 가지 설명한다.</p> </div> </div> <div class="sect3"> <h3 id="_sha_1_줄여_쓰기">SHA-1 줄여 쓰기</h3> <div class="paragraph"> <p>Git은 해시 값의 앞 몇 글자만으로도 어떤 커밋인지 충분히 식별할 수 있다. 저장소 안에서 해시 값이 중복되지 않으면 해시 값의 앞 4자만으로도 나타낼 수 있다. 즉 짧은 SHA-1 값이라고 해도 유일해야 한다.</p> </div> <div class="paragraph"> <p>먼저 <code>git log</code> 명령으로 어떤 커밋이 있는지 조회하는 예제를 보자.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log commit 734713bc047d87bf7eac9674765ae793478c50d3 Author: Scott Chacon <schacon@gmail.com> Date: Fri Jan 2 18:32:33 2009 -0800 fixed refs handling, added gc auto, updated tests commit d921970aadf03b3cf0e71becdaab3147ba71cdef Merge: 1c002dd... 35cfb2b... Author: Scott Chacon <schacon@gmail.com> Date: Thu Dec 11 15:08:43 2008 -0800 Merge commit 'phedders/rdocs' commit 1c002dd4b536e7479fe34593e72e6c6c1819e53b Author: Scott Chacon <schacon@gmail.com> Date: Thu Dec 11 14:58:32 2008 - added some blame and merge stuff</code></pre> </div> </div> <div class="paragraph"> <p>위의 내용은 <code>1c002dd…</code> 로 시작하는 커밋에 대해 로그를 살펴보겠다는 말이다. <code>git show</code> 명령을 사용하는 다음 결과는 모두 같다(단 짧은 해시 값이 다른 커밋과 중복되지 않다고 가정).</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b $ git show 1c002dd4b536e7479f $ git show 1c002d</code></pre> </div> </div> <div class="paragraph"> <p><code>git log</code> 명령에 <code>--abbrev-commit</code> 이라는 옵션을 추가하면 짧고 중복되지 않는 해시 값을 보여준다. 기본으로 7자를 보여주고 해시 값이 중복되는 경우 더 긴 해시 값을 보여준다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --abbrev-commit --pretty=oneline ca82a6d changed the version number 085bb3b removed unnecessary test code a11bef0 first commit</code></pre> </div> </div> <div class="paragraph"> <p>보통은 8자에서 10자 내외로도 충분히 유일하게 커밋을 나타낼 수 있다. 2018년 6월 현재 꽤 큰 프로젝트인 Linux 커널은 79만 개 이상의 커밋, 650만 개 이상의 오브젝트가 있다. Linux 커널 프로젝트는 해시 값 11개만 사용해도 충돌이 없다.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">노트</div> </td> <td class="content"> <div class="title">SHA-1 해시 값에 대한 단상</div> <div class="paragraph"> <p>Git을 쓰는 사람들은 가능성이 작긴 하지만 언젠가 SHA-1 값이 중복될까 봐 걱정한다. 정말 그렇게 되면 어떤 일이 벌어질까?</p> </div> <div class="paragraph"> <p>이미 있는 SHA-1 값이 Git 데이터베이스에 커밋되면 새로운 개체라고 해도 이미 커밋된 것으로 생각하고 이전의 커밋을 재사용한다. 그래서 해당 SHA-1 값의 커밋을 Checkout 하면 항상 처음 저장한 커밋만 Checkout 된다.</p> </div> <div class="paragraph"> <p>그러나 해시 값이 중복되는 일은 일어나기 어렵다. SHA-1 값의 크기는 20 바이트(160비트)이다. 해시 값이 중복될 확률이 50%가 되는 데 필요한 개체의 수는 2<sup>80</sup>이다. 이 수는 1자 2,000해 ('자’는 '경’의 '억’배 - 10<sup>24</sup>, 충돌 확률을 구하는 공식은 <code>p = (n(n-1)/2) * (1/2^160)</code> )이다. 즉, 지구에 존재하는 모래알의 수에 1,200을 곱한 수와 맞먹는다.</p> </div> <div class="paragraph"> <p>아직도 SHA-1 해시 값이 중복될까 봐 걱정하는 사람들을 위해 좀 더 덧붙이겠다. 지구에서 약 6억 5천만 명의 인구가 개발하고 각자 매초 Linux 커널 히스토리 전체와(650만 개) 맞먹는 개체를 쏟아 내고 바로 Push 한다고 가정하자. 이런 상황에서 해시 값의 충돌 날 확률이 50%가 되기까지는 약 2년이 걸린다. 그냥 어느 날 동료가 한 순간에 모두 늑대에게 물려 죽을 확률이 훨씬 더 높다.</p> </div> </td> </tr> </table> </div> </div> <div class="sect3"> <h3 id="_branch_references">브랜치로 가리키기</h3> <div class="paragraph"> <p>커밋을 가리키는 방법 중에 가장 많이 사용하는 방법이 있다. 어떤 커밋이 브랜치의 가장 최신 커밋이라면 간단히 브랜치 이름으로 커밋을 가리킬 수 있다. 브랜치 이름을 Git 명령에 전달하면 브랜치가 가리키는 커밋을 가리키게 된다. 만약 <code>topic1</code> 브랜치의 최근 커밋을 보고 싶으면 아래와 같이 실행한다. <code>topic1</code> 브랜치가 <code>ca82a6d…</code> 를 가리키고 있기 때문에 두 명령의 결과는 같다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show ca82a6dff817ec66f44342007202690a93763949 $ git show topic1</code></pre> </div> </div> <div class="paragraph"> <p>브랜치가 가리키는 개체의 SHA-1 값에 대한 궁금증은 <code>rev-parse</code> 이라는 Plumbing 도구가 해결해 준다. <a href="/book/ko/v2/ch00/ch10-git-internals">Git의 내부</a>에서 이 뚫어뻥에 대해 시원하게 설명한다. 기본적으로 <code>rev-parse</code> 은 저수준 명령이기 때문에 평소에는 전혀 필요하지 않다. 그래도 한번 사용해보고 어떤 결과가 나오는지 알아 두자.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git rev-parse topic1 ca82a6dff817ec66f44342007202690a93763949</code></pre> </div> </div> </div> <div class="sect3"> <h3 id="_git_reflog">RefLog로 가리키기</h3> <div class="paragraph"> <p>Git은 자동으로 브랜치와 HEAD가 지난 몇 달 동안에 가리켰었던 커밋을 모두 기록하는데 이 로그를 “Reflog” 라고 부른다.</p> </div> <div class="paragraph"> <p><code>git reflog</code> 를 실행하면 Reflog를 볼 수 있다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git reflog 734713b HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970 HEAD@{1}: merge phedders/rdocs: Merge made by the 'recursive' strategy. 1c002dd HEAD@{2}: commit: added some blame and merge stuff 1c36188 HEAD@{3}: rebase -i (squash): updating HEAD 95df984 HEAD@{4}: commit: # This is a combination of two commits. 1c36188 HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5 HEAD@{6}: rebase -i (pick): updating HEAD</code></pre> </div> </div> <div class="paragraph"> <p>Git은 브랜치가 가리키는 것이 달라질 때마다 그 정보를 임시 영역에 저장한다. 그래서 예전에 가리키던 것이 무엇인지 확인해 볼 수 있다. <code>@{n}</code> 규칙을 사용하면 아래와 같이 HEAD가 5번 전에 가리켰던 것을 알 수 있다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show HEAD@{5}</code></pre> </div> </div> <div class="paragraph"> <p>순서뿐 아니라 시간도 사용할 수 있다. 어제 날짜의 <code>master</code> 브랜치를 보고 싶으면 아래와 같이 한다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show master@{yesterday}</code></pre> </div> </div> <div class="paragraph"> <p>이 명령은 어제 <code>master</code> 브랜치가 가리키고 있던 것이 무엇인지 보여준다. Reflog에 남아있을 때만 조회할 수 있기 때문에 너무 오래된 커밋은 조회할 수 없다.</p> </div> <div class="paragraph"> <p><code>git log -g</code> 명령을 사용하면 <code>git reflog</code> 결과를 <code>git log</code> 명령과 같은 형태로 볼 수 있다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log -g master commit 734713bc047d87bf7eac9674765ae793478c50d3 Reflog: master@{0} (Scott Chacon <schacon@gmail.com>) Reflog message: commit: fixed refs handling, added gc auto, updated Author: Scott Chacon <schacon@gmail.com> Date: Fri Jan 2 18:32:33 2009 -0800 fixed refs handling, added gc auto, updated tests commit d921970aadf03b3cf0e71becdaab3147ba71cdef Reflog: master@{1} (Scott Chacon <schacon@gmail.com>) Reflog message: merge phedders/rdocs: Merge made by recursive. Author: Scott Chacon <schacon@gmail.com> Date: Thu Dec 11 15:08:43 2008 -0800 Merge commit 'phedders/rdocs'</code></pre> </div> </div> <div class="paragraph"> <p>Reflog의 일은 모두 로컬의 일이기 때문에 내 Reflog가 동료의 저장소에는 있을 수 없다. 이제 막 Clone 한 저장소는 아무것도 한 것이 없어서 Reflog가 하나도 없다. <code>git show HEAD@{2.months.ago}</code> 같은 명령은 적어도 두 달 전에 Clone 한 저장소에서나 사용할 수 있다. 그러니까 이 명령을 5분 전에 Clone 한 저장소에 사용하면 아무 결과도 나오지 않는다.</p> </div> <div class="admonitionblock tip"> <table> <tr> <td class="icon"> <div class="title">힌트</div> </td> <td class="content"> Reflog를 Git의 Shell의 명령 히스토리 기능 버전으로 생각하기 </td> </tr> </table> </div> <div class="exampleblock"> <div class="content"> <div class="paragraph"> <p>Unix나 Linux 사용 경험이 있는 경우 reflog를 Git의 Shell의 명령 히스토리 기능 버전으로 생각해볼 수 있다. 여기서 중요한 점은 오직 나의 “세션” 에서만 확인할 수 있는 내용이라는 점으로 같은 시스템에 있더라도 다른이와 공유되지 않는 정보라는 점이다.</p> </div> </div> </div> </div> <div class="sect3"> <h3 id="_계통_관계로_가리키기">계통 관계로 가리키기</h3> <div class="paragraph"> <p>계통 관계로도 커밋을 표현할 수 있다. 이름 끝에 <code>^</code> (캐럿) 기호를 붙이면 Git은 해당 커밋의 부모를 찾는다. 프로젝트 히스토리가 아래와 같을 때는 아래처럼 한다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --pretty=format:'%h %s' --graph * 734713b fixed refs handling, added gc auto, updated tests * d921970 Merge commit 'phedders/rdocs' |\ | * 35cfb2b Some rdoc changes * | 1c002dd added some blame and merge stuff |/ * 1c36188 ignore *.gem * 9b29157 add open3_detach to gemspec file list</code></pre> </div> </div> <div class="paragraph"> <p><code>HEAD^</code> 는 바로 “HEAD의 부모” 를 의미하므로 바로 이전 커밋을 보여준다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show HEAD^ commit d921970aadf03b3cf0e71becdaab3147ba71cdef Merge: 1c002dd... 35cfb2b... Author: Scott Chacon <schacon@gmail.com> Date: Thu Dec 11 15:08:43 2008 -0800 Merge commit 'phedders/rdocs'</code></pre> </div> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">노트</div> </td> <td class="content"> Windows에서 캐럿 기호 사용하기 </td> </tr> </table> </div> <div class="exampleblock"> <div class="content"> <div class="paragraph"> <p>Windows에서 실행한 <code>cmd.exe</code> 에서는 <code>^</code> 기호가 이미 다른 의미로 사용되고 있어서 Git 에서 사용하려면 좀 다른 방식을 사용해야 한다. 기호 두 개를 연속으로 사용하거나 쌍따옴표 안에서 사용해야 한다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show HEAD^ # will NOT work on Windows $ git show HEAD^^ # OK $ git show "HEAD^" # OK</code></pre> </div> </div> </div> </div> <div class="paragraph"> <p><code>^</code> 뒤에 숫자도 사용할 수 있다. 예를 들어 <code>d921970^2</code> 는 “d921970의 두 번째 부모” 를 의미한다. 그래서 두 번째 부모가 있는 Merge 커밋에만 사용할 수 있다. 첫 번째 부모는 Merge 할 때 Checkout 했던 브랜치를 말하고 두 번째 부모는 Merge 한 대상 브랜치를 의미한다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show d921970^ commit 1c002dd4b536e7479fe34593e72e6c6c1819e53b Author: Scott Chacon <schacon@gmail.com> Date: Thu Dec 11 14:58:32 2008 -0800 added some blame and merge stuff $ git show d921970^2 commit 35cfb2b795a55793d7cc56a6cc2060b4bb732548 Author: Paul Hedderly <paul+git@mjr.org> Date: Wed Dec 10 22:22:03 2008 +0000 Some rdoc changes</code></pre> </div> </div> <div class="paragraph"> <p>계통을 표현하는 방법으로 <code>~</code> 라는 것도 있다. <code>HEAD~</code> 와 <code>HEAD^</code> 는 똑같이 첫 번째 부모를 가리킨다. 하지만, 그 뒤에 숫자를 사용하면 달라진다. <code>HEAD~2</code> 는 명령을 실행할 시점의 “첫 번째 부모의 첫 번째 부모” , 즉 “조부모” 를 가리킨다. 위의 예제에서 <code>HEAD~3</code> 은 아래와 같다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show HEAD~3 commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d Author: Tom Preston-Werner <tom@mojombo.com> Date: Fri Nov 7 13:47:59 2008 -0500 ignore *.gem</code></pre> </div> </div> <div class="paragraph"> <p>이것은 <code>HEAD<sup>^</sup></code> 와 같은 표현이다. 부모의 부모의 부모 즉 증조 부모쯤 되겠다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show HEAD^^^ commit 1c3618887afb5fbcbea25b7c013f4e2114448b8d Author: Tom Preston-Werner <tom@mojombo.com> Date: Fri Nov 7 13:47:59 2008 -0500 ignore *.gem</code></pre> </div> </div> <div class="paragraph"> <p>이 두 표현을 같이 사용할 수도 있다. 위의 예제에서 <code>HEAD~3^2</code> 를 사용하면 증조부모의 Merge 커밋의 부모의 부모를 조회한다.</p> </div> </div> <div class="sect3"> <h3 id="_commit_ranges">범위로 커밋 가리키기</h3> <div class="paragraph"> <p>커밋을 하나씩 조회할 수도 있지만, 범위를 주고 여러 커밋을 한꺼번에 조회할 수도 있다. 범위를 사용하여 조회할 수 있으면 브랜치를 관리할 때 유용하다. 상당히 많은 브랜치를 가지고 있고 “왜 이 브랜치들은 아직도 주 브랜치에 Merge도 안 되고 뭐임?” 라는 의문이 들면 범위를 주고 어떤 브랜치인지 쉽게 찾을 수 있다.</p> </div> <div class="sect4"> <h4 id="_double_dot">Double Dot</h4> <div class="paragraph"> <p>범위를 표현하는 문법으로 Double Dot(..)을 많이 쓴다. Double Dot은 어떤 커밋들이 한쪽에는 관련됐고 다른 쪽에는 관련되지 않았는지 Git에게 물어보는 것이다. 예들 들어 <a href="/book/ko/v2/ch00/double_dot">범위를 설명하는 데 사용할 예제</a>과 같은 커밋 히스토리가 있다고 가정하자.</p> </div> <div id="double_dot" class="imageblock"> <div class="content"> <img src="/book/ko/v2/images/double-dot.png" alt="범위를 설명하는 데 사용할 예제"> </div> <div class="title">그림 137. 범위를 설명하는 데 사용할 예제</div> </div> <div class="paragraph"> <p><code>experiment</code> 브랜치의 커밋들 중에서 아직 master 브랜치에 Merge 하지 않은 것들만 보고 싶으면 <code>master..experiment</code> 라고 사용한다. 이 표현은 “master에는 없지만, experiment에는 있는 커밋” 을 의미한다. 여기에서는 설명을 쉽게 하려고 실제 조회 결과가 아니라 그림의 커밋을 의미하는 문자를 사용한다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log master..experiment D C</code></pre> </div> </div> <div class="paragraph"> <p>반대로 <code>experiment</code> 에는 없고 <code>master</code> 에만 있는 커밋이 궁금하면 브랜치 순서를 거꾸로 사용한다. <code>experiment..master</code> 는 <code>experiment</code> 에는 없고 <code>master</code> 에만 있는 것을 알려준다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log experiment..master F E</code></pre> </div> </div> <div class="paragraph"> <p><code>experiment</code> 브랜치를 Merge 할 때마다 Merge 하기 전에 무엇이 변경됐는지 확인해보고 싶을 것이다. 그리고 리모트 저장소에 Push 할 때도 마찬가지로 차이점을 확인해보고 싶을 것이다. 이럴 때 굉장히 유용하다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log origin/master..HEAD</code></pre> </div> </div> <div class="paragraph"> <p>이 명령은 <code>origin</code> 저장소의 <code>master</code> 브랜치에는 없고 현재 Checkout 중인 브랜치에만 있는 커밋을 보여준다. Checkout 한 브랜치가 <code>origin/master</code> 라면 <code>git log origin/master..HEAD</code> 가 보여주는 커밋이 Push 하면 서버에 전송될 커밋들이다. 그리고 한쪽의 Refs를 생략하면 Git은 <code>HEAD</code> 라고 가정하기 때문에 <code>git log origin/master..</code> 는 <code>git log origin/master..HEAD</code> 와 같다.</p> </div> </div> <div class="sect4"> <h4 id="_세_개_이상의_refs">세 개 이상의 Refs</h4> <div class="paragraph"> <p>Double Dot은 간단하고 유용하지만 두 개 이상의 브랜치에는 사용할 수 없다. 그러니까 현재 작업 중인 브랜치에는 있지만 다른 여러 브랜치에는 없는 커밋을 보고 싶으면 <code>..</code> 으로는 확인할 수 없다. Git은 <code>^</code> 이나 <code>--not</code> 옵션 뒤에 브랜치 이름을 넣으면 그 브랜치에 없는 커밋을 찾아준다. 아래의 명령 세 가지는 모두 같은 명령이다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log refA..refB $ git log ^refA refB $ git log refB --not refA</code></pre> </div> </div> <div class="paragraph"> <p>이 옵션들은 Double Dot으로는 할 수 없는, 세 개 이상의 Refs에 사용할 수 있는 장점이 있다. 예를 들어 <code>refA</code> 나 <code>refB</code> 에는 있지만 <code>refC</code> 에는 없는 커밋을 보려면 아래 중 한 명령을 사용한다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log refA refB ^refC $ git log refA refB --not refC</code></pre> </div> </div> <div class="paragraph"> <p>이 조건을 잘 응용하면 작업 중인 브랜치와 다른 브랜치을 매우 상세하게 비교해볼 수 있다.</p> </div> </div> <div class="sect4"> <h4 id="_triple_dot">Triple Dot</h4> <div class="paragraph"> <p>Triple Dot은 양쪽에 있는 두 Refs 사이에서 공통으로 가지는 것을 제외하고 서로 다른 커밋만 보여준다. <a href="/book/ko/v2/ch00/double_dot">범위를 설명하는 데 사용할 예제</a>의 커밋 히스토리를 다시 보자. 만약 <code>master</code> 와 <code>experiment</code> 의 공통부분은 빼고 다른 커밋만 보고 싶으면 아래와 같이 하면 된다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log master...experiment F E D C</code></pre> </div> </div> <div class="paragraph"> <p>우리가 아는 <code>log</code> 명령의 결과를 최근 날짜순으로 보여준다. 이 예제에서는 커밋을 네 개 보여준다.</p> </div> <div class="paragraph"> <p>그리고 <code>log</code> 명령에 <code>--left-right</code> 옵션을 추가하면 각 커밋이 어느 브랜치에 속하는지도 보여주기 때문에 좀 더 이해하기 쉽다.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --left-right master...experiment < F < E > D > C</code></pre> </div> </div> <div class="paragraph"> <p>위와 같은 명령을 사용하면 원하는 커밋을 좀 더 꼼꼼하게 살펴볼 수 있다.</p> </div> </div> </div> <div id="nav"><a href="/book/ko/v2/GitHub-요약">prev</a> | <a href="/book/ko/v2/Git-도구-대화형-명령">next</a></div> </div> </div> </div> </div> <footer> <div class="site-source"> <a href="/site">About this site</a><br> Patches, suggestions, and comments are welcome. </div> <div class="sfc-member"> Git is a member of <a href="/sfc">Software Freedom Conservancy</a> </div> </footer> <a href="#top" class="no-js scrollToTop" id="scrollToTop" data-label="Scroll to top"> <img src="/images/icons/chevron-up@2x.png" width="20" height="20" alt="scroll-to-top"/> </a> <script src="/js/jquery-1.7.1.min.js"></script> <script src="/js/jquery-ui-1.8.18.custom.min.js"></script> <script src="/js/jquery.defaultvalue.js"></script> <script src="/js/session.min.js"></script> <script src="/js/application.min.js"></script> </div> </body> </html>