CINXE.COM

Git - Git ポリシーの実施例

<!DOCTYPE html> <html lang="ja"> <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 - 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/Customizing-Git-An-Example-Git-Enforced-Policy">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99i-F%c9%99rdil%c9%99%c5%9fdirm%c9%99k-Git-Enforced-Siyas%c9%99t-N%c3%bcmun%c9%99si">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/Git-%d0%bd%d0%b0-%d0%bd%d0%b8%d1%81%d0%ba%d0%be-%d0%bd%d0%b8%d0%b2%d0%be-Packfiles">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-einrichten-Beispiel-f%c3%bcr-Git-forcierte-Regeln">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Un-ejemplo-de-implantaci%c3%b3n-de-una-determinada-pol%c3%adtica-en-Git">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Personnalisation-de-Git-Exemple-de-politique-g%c3%a9r%c3%a9e-par-Git">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%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%83%9d%e3%83%aa%e3%82%b7%e3%83%bc%e3%81%ae%e5%ae%9f%e6%96%bd%e4%be%8b">日本語</a>,</td></tr> <tr><td><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>,</td></tr> <tr><td><a href="/book/nl/v2/Git-aanpassen-Een-voorbeeld-van-Git-afgedwongen-beleid">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%9d%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-Git-%d0%9f%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d0%bf%d1%80%d0%b8%d0%bd%d1%83%d0%b4%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b9-%d0%bf%d0%be%d0%bb%d0%b8%d1%82%d0%b8%d0%ba%d0%b8-Git">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Prilagoditev-Gita-Primer-pravilnika,-ki-ga-uveljavlja-Git">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Pag-aangkop-sa-Sariling-Pangangailagan-ng-Git-An-Example-Git-Enforced-Policy">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%9d%d0%b0%d0%bb%d0%b0%d1%88%d1%82%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f-Git-%d0%9f%d1%80%d0%b8%d0%ba%d0%bb%d0%b0%d0%b4-%d0%bf%d0%be%d0%bb%d1%96%d1%82%d0%b8%d0%ba%d0%b8-%d0%ba%d0%be%d1%80%d0%b8%d1%81%d1%82%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f-%d0%b2%d0%b8%d0%ba%d0%be%d0%bd%d1%83%d0%b2%d0%b0%d0%bd%d0%be%d1%97-Git-%d0%be%d0%bc">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-%e4%bd%bf%e7%94%a8%e5%bc%ba%e5%88%b6%e7%ad%96%e7%95%a5%e7%9a%84%e4%b8%80%e4%b8%aa%e4%be%8b%e5%ad%90">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Customizing-Git-An-Example-Git-Enforced-Policy">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%9f%d0%b5%d1%80%d1%81%d0%be%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%98%d0%b0-%d0%bd%d0%b0-Git-An-Example-Git-Enforced-Policy">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Dostosowywanie-Gita-An-Example-Git-Enforced-Policy">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%9f%d1%80%d0%b8%d0%bb%d0%b0%d0%b3%d0%be%d1%92%d0%b0%d0%b2%d0%b0%d1%9a%d0%b5-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%b0-%d0%93%d0%b8%d1%82-%d0%9f%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d0%bf%d0%be%d0%bb%d0%b8%d1%81%d0%b5-%d0%ba%d0%be%d1%98%d1%83-%d1%81%d0%bf%d1%80%d0%be%d0%b2%d0%be%d0%b4%d0%b8-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc-%d0%93%d0%b8%d1%82">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Customizing-Git-An-Example-Git-Enforced-Policy">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Customizing-Git-An-Example-Git-Enforced-Policy">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Customizing-Git-An-Example-Git-Enforced-Policy">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Customizing-Git-An-Example-Git-Enforced-Policy" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Kostumisasi-Git-An-Example-Git-Enforced-Policy">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Customizing-Git-An-Example-Git-Enforced-Policy">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Customizing-Git-An-Example-Git-Enforced-Policy">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Customizing-Git-An-Example-Git-Enforced-Policy">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Personalizar-o-Git-An-Example-Git-Enforced-Policy">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Customizing-Git-An-Example-Git-Enforced-Policy">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Bir-%c3%96rnek:-Mecburi-Git-Politikas%c4%b1">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-ja">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/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e7%ae%a1%e7%90%86%e3%81%ab%e9%96%a2%e3%81%97%e3%81%a6">使い始める</a></h2> <ol> <li> 1.1 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e7%ae%a1%e7%90%86%e3%81%ab%e9%96%a2%e3%81%97%e3%81%a6">バージョン管理に関して</a> </li> <li> 1.2 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-Git%e7%95%a5%e5%8f%b2">Git略史</a> </li> <li> 1.3 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-Git%e3%81%ae%e5%9f%ba%e6%9c%ac">Gitの基本</a> </li> <li> 1.4 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%a9%e3%82%a4%e3%83%b3">コマンドライン</a> </li> <li> 1.5 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-Git%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab">Gitのインストール</a> </li> <li> 1.6 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-%e6%9c%80%e5%88%9d%e3%81%aeGit%e3%81%ae%e6%a7%8b%e6%88%90">最初のGitの構成</a> </li> <li> 1.7 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-%e3%83%98%e3%83%ab%e3%83%97%e3%82%92%e8%a6%8b%e3%82%8b">ヘルプを見る</a> </li> <li> 1.8 <a href="/book/ja/v2/%e4%bd%bf%e3%81%84%e5%a7%8b%e3%82%81%e3%82%8b-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-Git-%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%ae%e5%8f%96%e5%be%97">Git の基本</a></h2> <ol> <li> 2.1 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-Git-%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%ae%e5%8f%96%e5%be%97">Git リポジトリの取得</a> </li> <li> 2.2 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-%e5%a4%89%e6%9b%b4%e5%86%85%e5%ae%b9%e3%81%ae%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%81%b8%e3%81%ae%e8%a8%98%e9%8c%b2">変更内容のリポジトリへの記録</a> </li> <li> 2.3 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e5%b1%a5%e6%ad%b4%e3%81%ae%e9%96%b2%e8%a6%a7">コミット履歴の閲覧</a> </li> <li> 2.4 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-%e4%bd%9c%e6%a5%ad%e3%81%ae%e3%82%84%e3%82%8a%e7%9b%b4%e3%81%97">作業のやり直し</a> </li> <li> 2.5 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%81%a7%e3%81%ae%e4%bd%9c%e6%a5%ad">リモートでの作業</a> </li> <li> 2.6 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-%e3%82%bf%e3%82%b0">タグ</a> </li> <li> 2.7 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-Git-%e3%82%a8%e3%82%a4%e3%83%aa%e3%82%a2%e3%82%b9">Git エイリアス</a> </li> <li> 2.8 <a href="/book/ja/v2/Git-%e3%81%ae%e5%9f%ba%e6%9c%ac-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%a8%e3%81%af">Git のブランチ機能</a></h2> <ol> <li> 3.1 <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%a8%e3%81%af">ブランチとは</a> </li> <li> 3.2 <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%a8%e3%83%9e%e3%83%bc%e3%82%b8%e3%81%ae%e5%9f%ba%e6%9c%ac">ブランチとマージの基本</a> </li> <li> 3.3 <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%ae%e7%ae%a1%e7%90%86">ブランチの管理</a> </li> <li> 3.4 <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%a7%e3%81%ae%e4%bd%9c%e6%a5%ad%e3%81%ae%e6%b5%81%e3%82%8c">ブランチでの作業の流れ</a> </li> <li> 3.5 <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81">リモートブランチ</a> </li> <li> 3.6 <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%aa%e3%83%99%e3%83%bc%e3%82%b9">リベース</a> </li> <li> 3.7 <a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab">Gitサーバー</a></h2> <ol> <li> 4.1 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab">プロトコル</a> </li> <li> 4.2 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e7%94%a8%e3%81%ae-Git-%e3%81%ae%e5%8f%96%e5%be%97">サーバー用の Git の取得</a> </li> <li> 4.3 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-SSH-%e5%85%ac%e9%96%8b%e9%8d%b5%e3%81%ae%e4%bd%9c%e6%88%90">SSH 公開鍵の作成</a> </li> <li> 4.4 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97">サーバーのセットアップ</a> </li> <li> 4.5 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-Git-%e3%83%87%e3%83%bc%e3%83%a2%e3%83%b3">Git デーモン</a> </li> <li> 4.6 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-Smart-HTTP">Smart HTTP</a> </li> <li> 4.7 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e3%82%b5%e3%83%bc%e3%83%89%e3%83%91%e3%83%bc%e3%83%86%e3%82%a3%e3%81%ab%e3%82%88%e3%82%8b-Git-%e3%83%9b%e3%82%b9%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0">サードパーティによる Git ホスティング</a> </li> <li> 4.10 <a href="/book/ja/v2/Git%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/ja/v2/Git-%e3%81%a7%e3%81%ae%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad-%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad%e3%81%ae%e6%b5%81%e3%82%8c">Git での分散作業</a></h2> <ol> <li> 5.1 <a href="/book/ja/v2/Git-%e3%81%a7%e3%81%ae%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad-%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad%e3%81%ae%e6%b5%81%e3%82%8c">分散作業の流れ</a> </li> <li> 5.2 <a href="/book/ja/v2/Git-%e3%81%a7%e3%81%ae%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%b8%e3%81%ae%e8%b2%a2%e7%8c%ae">プロジェクトへの貢献</a> </li> <li> 5.3 <a href="/book/ja/v2/Git-%e3%81%a7%e3%81%ae%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e9%81%8b%e5%96%b6">プロジェクトの運営</a> </li> <li> 5.4 <a href="/book/ja/v2/Git-%e3%81%a7%e3%81%ae%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/ja/v2/GitHub-%e3%82%a2%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88%e3%81%ae%e6%ba%96%e5%82%99%e3%81%a8%e8%a8%ad%e5%ae%9a">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/ja/v2/GitHub-%e3%82%a2%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88%e3%81%ae%e6%ba%96%e5%82%99%e3%81%a8%e8%a8%ad%e5%ae%9a">アカウントの準備と設定</a> </li> <li> 6.2 <a href="/book/ja/v2/GitHub-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%b8%e3%81%ae%e8%b2%a2%e7%8c%ae">プロジェクトへの貢献</a> </li> <li> 6.3 <a href="/book/ja/v2/GitHub-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e3%83%a1%e3%83%b3%e3%83%86%e3%83%8a%e3%83%b3%e3%82%b9">プロジェクトのメンテナンス</a> </li> <li> 6.4 <a href="/book/ja/v2/GitHub-%e7%b5%84%e7%b9%94%e3%81%ae%e7%ae%a1%e7%90%86">組織の管理</a> </li> <li> 6.5 <a href="/book/ja/v2/GitHub-%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%ab%e3%82%88%e3%82%8b-GitHub-%e3%81%ae%e6%93%8d%e4%bd%9c">スクリプトによる GitHub の操作</a> </li> <li> 6.6 <a href="/book/ja/v2/GitHub-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>7. <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">Git のさまざまなツール</a></h2> <ol> <li> 7.1 <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> </li> <li> 7.2 <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-%e5%af%be%e8%a9%b1%e7%9a%84%e3%81%aa%e3%82%b9%e3%83%86%e3%83%bc%e3%82%b8%e3%83%b3%e3%82%b0">対話的なステージング</a> </li> <li> 7.3 <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-%e4%bd%9c%e6%a5%ad%e3%81%ae%e9%9a%a0%e3%81%97%e3%81%8b%e3%81%9f%e3%81%a8%e6%b6%88%e3%81%97%e3%81%8b%e3%81%9f">作業の隠しかたと消しかた</a> </li> <li> 7.4 <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-%e4%bd%9c%e6%a5%ad%e5%86%85%e5%ae%b9%e3%81%b8%e3%81%ae%e7%bd%b2%e5%90%8d">作業内容への署名</a> </li> <li> 7.5 <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-%e6%a4%9c%e7%b4%a2">検索</a> </li> <li> 7.6 <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-%e6%ad%b4%e5%8f%b2%e3%81%ae%e6%9b%b8%e3%81%8d%e6%8f%9b%e3%81%88">歴史の書き換え</a> </li> <li> 7.7 <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%82%bb%e3%83%83%e3%83%88%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e8%a9%b3%e8%aa%ac">リセットコマンド詳説</a> </li> <li> 7.8 <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-%e9%ab%98%e5%ba%a6%e3%81%aa%e3%83%9e%e3%83%bc%e3%82%b8%e6%89%8b%e6%b3%95">高度なマージ手法</a> </li> <li> 7.9 <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-Rerere">Rerere</a> </li> <li> 7.10 <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-Git-%e3%81%ab%e3%82%88%e3%82%8b%e3%83%87%e3%83%90%e3%83%83%e3%82%b0">Git によるデバッグ</a> </li> <li> 7.11 <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%82%b5%e3%83%96%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab">サブモジュール</a> </li> <li> 7.12 <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%90%e3%83%b3%e3%83%89%e3%83%ab%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90">バンドルファイルの作成</a> </li> <li> 7.13 <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-Git-%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e7%bd%ae%e3%81%8d%e6%8f%9b%e3%81%88">Git オブジェクトの置き換え</a> </li> <li> 7.14 <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-%e8%aa%8d%e8%a8%bc%e6%83%85%e5%a0%b1%e3%81%ae%e4%bf%9d%e5%ad%98">認証情報の保存</a> </li> <li> 7.15 <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%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/ja/v2/Git-%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%81%ae%e8%a8%ad%e5%ae%9a">Git のカスタマイズ</a></h2> <ol> <li> 8.1 <a href="/book/ja/v2/Git-%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%81%ae%e8%a8%ad%e5%ae%9a">Git の設定</a> </li> <li> 8.2 <a href="/book/ja/v2/Git-%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%81%ae%e5%b1%9e%e6%80%a7">Git の属性</a> </li> <li> 8.3 <a href="/book/ja/v2/Git-%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%83%95%e3%83%83%e3%82%af">Git フック</a> </li> <li> 8.4 <a href="/book/ja/v2/Git-%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%83%9d%e3%83%aa%e3%82%b7%e3%83%bc%e3%81%ae%e5%ae%9f%e6%96%bd%e4%be%8b" class="active">Git ポリシーの実施例</a> </li> <li> 8.5 <a href="/book/ja/v2/Git-%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/ja/v2/Git%e3%81%a8%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e9%80%a3%e6%90%ba-Git-%e3%82%92%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%81%a8%e3%81%97%e3%81%a6%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b">Gitとその他のシステムの連携</a></h2> <ol> <li> 9.1 <a href="/book/ja/v2/Git%e3%81%a8%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e9%80%a3%e6%90%ba-Git-%e3%82%92%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%81%a8%e3%81%97%e3%81%a6%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b">Git をクライアントとして使用する</a> </li> <li> 9.2 <a href="/book/ja/v2/Git%e3%81%a8%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e9%80%a3%e6%90%ba-Git-%e3%81%b8%e7%a7%bb%e8%a1%8c%e3%81%99%e3%82%8b">Git へ移行する</a> </li> <li> 9.3 <a href="/book/ja/v2/Git%e3%81%a8%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e9%80%a3%e6%90%ba-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e9%85%8d%e7%ae%a1%ef%bc%88Plumbing%ef%bc%89%e3%81%a8%e7%a3%81%e5%99%a8%ef%bc%88Porcelain%ef%bc%89">Gitの内側</a></h2> <ol> <li> 10.1 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e9%85%8d%e7%ae%a1%ef%bc%88Plumbing%ef%bc%89%e3%81%a8%e7%a3%81%e5%99%a8%ef%bc%88Porcelain%ef%bc%89">配管(Plumbing)と磁器(Porcelain)</a> </li> <li> 10.2 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-Git%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88">Gitオブジェクト</a> </li> <li> 10.3 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-Git%e3%81%ae%e5%8f%82%e7%85%a7">Gitの参照</a> </li> <li> 10.4 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-Packfile">Packfile</a> </li> <li> 10.5 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-Refspec">Refspec</a> </li> <li> 10.6 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e8%bb%a2%e9%80%81%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab">転送プロトコル</a> </li> <li> 10.7 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e3%83%a1%e3%83%b3%e3%83%86%e3%83%8a%e3%83%b3%e3%82%b9%e3%81%a8%e3%83%87%e3%83%bc%e3%82%bf%e3%83%aa%e3%82%ab%e3%83%90%e3%83%aa">メンテナンスとデータリカバリ</a> </li> <li> 10.8 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e7%92%b0%e5%a2%83%e5%a4%89%e6%95%b0">環境変数</a> </li> <li> 10.9 <a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-%e3%82%b0%e3%83%a9%e3%83%95%e3%82%a3%e3%82%ab%e3%83%ab%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%95%e3%82%a7%e3%83%bc%e3%82%b9">付録 A: その他の環境でのGit</a></h2> <ol> <li> A1.1 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-%e3%82%b0%e3%83%a9%e3%83%95%e3%82%a3%e3%82%ab%e3%83%ab%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%95%e3%82%a7%e3%83%bc%e3%82%b9">グラフィカルインタフェース</a> </li> <li> A1.2 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-Visual-Studio%e3%81%a7Git%e3%82%92%e4%bd%bf%e3%81%86">Visual StudioでGitを使う</a> </li> <li> A1.3 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-Eclipse%e3%81%a7Git%e3%82%92%e4%bd%bf%e3%81%86">EclipseでGitを使う</a> </li> <li> A1.4 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-Bash%e3%81%a7Git%e3%82%92%e4%bd%bf%e3%81%86">BashでGitを使う</a> </li> <li> A1.5 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-Zsh%e3%81%a7Git%e3%82%92%e4%bd%bf%e3%81%86">ZshでGitを使う</a> </li> <li> A1.6 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-Powershell%e3%81%a7Git%e3%82%92%e4%bd%bf%e3%81%86">PowershellでGitを使う</a> </li> <li> A1.7 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-A:-%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%aeGit-%e3%81%be%e3%81%a8%e3%82%81">まとめ</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-B:-Git%e3%82%92%e3%81%82%e3%81%aa%e3%81%9f%e3%81%ae%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ab%e7%b5%84%e3%81%bf%e8%be%bc%e3%82%80-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%a9%e3%82%a4%e3%83%b3%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e4%bd%bf%e3%81%86%e6%96%b9%e6%b3%95">付録 B: Gitをあなたのアプリケーションに組み込む</a></h2> <ol> <li> A2.1 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-B:-Git%e3%82%92%e3%81%82%e3%81%aa%e3%81%9f%e3%81%ae%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ab%e7%b5%84%e3%81%bf%e8%be%bc%e3%82%80-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%a9%e3%82%a4%e3%83%b3%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e4%bd%bf%e3%81%86%e6%96%b9%e6%b3%95">Gitのコマンドラインツールを使う方法</a> </li> <li> A2.2 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-B:-Git%e3%82%92%e3%81%82%e3%81%aa%e3%81%9f%e3%81%ae%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ab%e7%b5%84%e3%81%bf%e8%be%bc%e3%82%80-Libgit2%e3%82%92%e4%bd%bf%e3%81%86%e6%96%b9%e6%b3%95">Libgit2を使う方法</a> </li> <li> A2.3 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-B:-Git%e3%82%92%e3%81%82%e3%81%aa%e3%81%9f%e3%81%ae%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ab%e7%b5%84%e3%81%bf%e8%be%bc%e3%82%80-JGit">JGit</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97%e3%81%a8%e8%a8%ad%e5%ae%9a">付録 C: Gitのコマンド</a></h2> <ol> <li> A3.1 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97%e3%81%a8%e8%a8%ad%e5%ae%9a">セットアップと設定</a> </li> <li> A3.2 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%8f%96%e5%be%97%e3%81%a8%e4%bd%9c%e6%88%90">プロジェクトの取得と作成</a> </li> <li> A3.3 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e5%9f%ba%e6%9c%ac%e7%9a%84%e3%81%aa%e3%82%b9%e3%83%8a%e3%83%83%e3%83%97%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88">基本的なスナップショット</a> </li> <li> A3.4 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%a8%e3%83%9e%e3%83%bc%e3%82%b8">ブランチとマージ</a> </li> <li> A3.5 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e5%85%b1%e6%9c%89%e3%81%a8%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88">プロジェクトの共有とアップデート</a> </li> <li> A3.6 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e6%a4%9c%e6%9f%bb%e3%81%a8%e6%af%94%e8%bc%83">検査と比較</a> </li> <li> A3.7 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%83%87%e3%83%90%e3%83%83%e3%82%b0">デバッグ</a> </li> <li> A3.8 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%83%91%e3%83%83%e3%83%81%e3%81%ae%e9%81%a9%e7%94%a8">パッチの適用</a> </li> <li> A3.9 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%83%a1%e3%83%bc%e3%83%ab">メール</a> </li> <li> A3.10 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e5%a4%96%e9%83%a8%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0">外部システム</a> </li> <li> A3.11 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e7%ae%a1%e7%90%86">システム管理</a> </li> <li> A3.12 <a href="/book/ja/v2/%e4%bb%98%e9%8c%b2-C:-Git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-%e9%85%8d%e7%ae%a1%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89">配管コマンド</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>8.4 Git のカスタマイズ - Git ポリシーの実施例</h1> <div> <h2 id="r_an_example_git_enforced_policy">Git ポリシーの実施例</h2> <div class="paragraph"> <p></p> </div> <div class="paragraph"> <p>このセクションでは、これまでに学んだ内容を使って実際に Git のワークフローを確立してみます。 コミットメッセージの書式をチェックし、またプロジェクト内の特定のサブディレクトリを特定のユーザーだけが変更できるようにします。 以降では、開発者に対して「なぜプッシュが却下されたのか」を伝えるためのクライアントスクリプトと、ポリシーを強制するためのサーバースクリプトを作成していきます。</p> </div> <div class="paragraph"> <p>以降で示すスクリプトは Ruby で書かれています。理由としては、我々の知的習慣によるところもありますが、Ruby は(たとえ書けないとしても)読むのが簡単というのも理由のひとつです。 しかし、それ以外の言語であってもきちんと動作します。Git に同梱されているサンプルスクリプトはすべて Perl あるいは Bash で書かれています。サンプルスクリプトを見れば、それらの言語による大量のフックの例を見ることができます。</p> </div> <div class="sect3"> <h3 id="_サーバーサイドフック_2">サーバーサイドフック</h3> <div class="paragraph"> <p>サーバーサイドで行う処理は、すべて <code>hooks</code> ディレクトリの <code>update</code> ファイルにまとめます。 <code>update</code> ファイルはプッシュされるブランチごとに実行され、次の3つの引数を取ります。</p> </div> <div class="ulist"> <ul> <li> <p>プッシュされる参照の名前</p> </li> <li> <p>操作前のブランチのリビジョン</p> </li> <li> <p>プッシュされる新しいリビジョン</p> </li> </ul> </div> <div class="paragraph"> <p>また、SSH 経由でのプッシュの場合は、プッシュしたユーザーを知ることもできます。 全員に共通のユーザー( “git” など)を使って公開鍵認証をしている場合は、公開鍵の情報に基づいて実際のユーザーを判断して環境変数を設定するというラッパーが必要です。 ここでは、接続しているユーザー名が環境変数 <code>$USER</code> に格納されているものとします。 <code>update</code> スクリプトは、まず必要な情報を取得するところから始まります。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">#!/usr/bin/env ruby $refname = ARGV[0] $oldrev = ARGV[1] $newrev = ARGV[2] $user = ENV['USER'] puts "Enforcing Policies..." puts "(#{$refname}) (#{$oldrev[0,6]}) (#{$newrev[0,6]})"</code></pre> </div> </div> <div class="paragraph"> <p>そう、グローバル変数を使ってますね。 が、責めないでください – 実例を示すには、こっちの方が簡単なんです。</p> </div> <div class="sect4"> <h4 id="r_enforcing_commit_message_format">特定のコミットメッセージ書式の強制</h4> <div class="paragraph"> <p>まずは、コミットメッセージを特定の書式に従わせることに挑戦してみましょう。 ここでは、コミットメッセージには必ず “ref: 1234” 形式の文字列を含むこと、というルールにします。個々のコミットをチケットシステムの作業項目とリンクさせたいという意図です。 やらなければならないことは、プッシュされてきた各コミットのコミットメッセージに上記の文字列があるか調べ、なければゼロ以外の値を返して終了し、プッシュを却下することです。</p> </div> <div class="paragraph"> <p>プッシュされたすべてのコミットの SHA-1 値を取得するには、<code>$newrev</code> と <code>$oldrev</code> の内容を <code>git rev-list</code> という Git の配管(plumbing)コマンドに渡します。 これは基本的には <code>git log</code> コマンドのようなものですが、デフォルトでは SHA-1 値だけを表示してそれ以外の情報は出力しません。 ふたつのコミットの間のすべてのコミットの SHA-1 を得るには、次のようなコマンドを実行します。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git rev-list 538c33..d14fc7 d14fc7c847ab946ec39590d87783c69b031bdfb7 9f585da4401b0a3999e84113824d15245c13f0be 234071a1be950e2a8d078e6141f5cd20c1e61ad3 dfa04c9ef3d5197182f13fb5b9b1fb7717d2222a 17716ec0f1ff5c77eff40b7fe912f9f6cfd0e475</code></pre> </div> </div> <div class="paragraph"> <p>この出力を受け取って、ループさせて各コミットの SHA-1 を取得し、個々のメッセージを取り出せば、正規表現でそのメッセージを調べることができます。</p> </div> <div class="paragraph"> <p>さて、これらのコミットからコミットメッセージを取り出す方法を見つけなければなりません。 生のコミットデータを取得するには、別の配管コマンド <code>git cat-file</code> を使います。 配管コマンドについては <a href="/book/ja/v2/ch00/ch10-git-internals">[ch10-git-internals]</a> で詳しく説明しますが、とりあえずはこのコマンドがどんな結果を返すのだけを示します。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file commit ca82a6 tree cfda3bf379e4f8dba8717dee55aab78aef7f4daf parent 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 author Scott Chacon &lt;schacon@gmail.com&gt; 1205815931 -0700 committer Scott Chacon &lt;schacon@gmail.com&gt; 1240030591 -0700 changed the version number</code></pre> </div> </div> <div class="paragraph"> <p>SHA-1 値がわかっているときにコミットからコミットメッセージを得るシンプルな方法は、空行を探してそれ以降をすべて取得するというものです。 これには、Unix システムの <code>sed</code> コマンドが使えます。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file commit ca82a6 | sed '1,/^$/d' changed the version number</code></pre> </div> </div> <div class="paragraph"> <p>プッシュしようとしているコミットから、この呪文を使ってコミットメッセージを取得し、もし条件にマッチしないものがあれば終了させればよいのです。 スクリプトを抜けてプッシュを却下するには、ゼロ以外の値を返して終了します。 以上を踏まえると、このメソッドは次のようになります。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">$regex = /\[ref: (\d+)\]/ # enforced custom commit message format def check_message_format missed_revs = `git rev-list #{$oldrev}..#{$newrev}`.split("\n") missed_revs.each do |rev| message = `git cat-file commit #{rev} | sed '1,/^$/d'` if !$regex.match(message) puts "[POLICY] Your message is not formatted correctly" exit 1 end end end check_message_format</code></pre> </div> </div> <div class="paragraph"> <p>これを <code>update</code> スクリプトに追加すると、ルールを守らないコミットメッセージが含まれるコミットのプッシュを却下するようになります。</p> </div> </div> <div class="sect4"> <h4 id="_ユーザーベースのアクセス制御">ユーザーベースのアクセス制御</h4> <div class="paragraph"> <p>アクセス制御リスト (ACL) を使って、ユーザーごとにプロジェクトのどの部分に対して変更をプッシュできるのかを指定できる仕組みを追加したいとしましょう。 全体にアクセスできるユーザーもいれば、特定のサブディレクトリやファイルにしか変更をプッシュできないユーザーもいる、といった具合です。 これを行うには、ルールを書いたファイル <code>acl</code> をサーバー上のベア Git リポジトリに置きます。 <code>update</code> フックにこのファイルを読ませ、プッシュされてきたコミットにどのようなファイルが含まれているのかを調べ、そしてプッシュしたユーザーにそのファイルを変更する権限があるのか判断します。</p> </div> <div class="paragraph"> <p>まずは ACL を作るところから始めましょう。 ここでは、CVS の ACL と似た書式を使います。これは各項目を一行で表し、最初のフィールドは <code>avail</code> あるいは <code>unavail</code>、そして次の行がそのルールを適用するユーザーの一覧(カンマ区切り)、そして最後のフィールドがそのルールを適用するパス(ブランクは全体へのアクセスを意味します)です。フィールドの区切りには、パイプ文字 (<code>|</code>) を使います。</p> </div> <div class="paragraph"> <p>ここでは、全体にアクセスできる管理者、 <code>doc</code> ディレクトリにアクセスできるドキュメント担当者、そして <code>lib</code> と <code>tests</code> ディレクトリだけにアクセスできる開発者を設定します。ACL ファイルは次のようになります。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>avail|nickh,pjhyett,defunkt,tpw avail|usinclair,cdickens,ebronte|doc avail|schacon|lib avail|schacon|tests</code></pre> </div> </div> <div class="paragraph"> <p>まずはこのデータを読み込んで、スクリプト内で使えるデータ構造にしてみましょう。 例をシンプルにするために、ここでは <code>avail</code> ディレクティブだけを使います。 次のメソッドは連想配列を返すものです。配列のキーはユーザー名、キーに対応する値はそのユーザーが書き込み権限を持つパスの配列になります。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">def get_acl_access_data(acl_file) # read in ACL data acl_file = File.read(acl_file).split("\n").reject { |line| line == '' } access = {} acl_file.each do |line| avail, users, path = line.split('|') next unless avail == 'avail' users.split(',').each do |user| access[user] ||= [] access[user] &lt;&lt; path end end access end</code></pre> </div> </div> <div class="paragraph"> <p>先ほどの ACL ファイルをこの <code>get_acl_access_data</code> メソッドに渡すと、このようなデータ構造を返します。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">{"defunkt"=&gt;[nil], "tpw"=&gt;[nil], "nickh"=&gt;[nil], "pjhyett"=&gt;[nil], "schacon"=&gt;["lib", "tests"], "cdickens"=&gt;["doc"], "usinclair"=&gt;["doc"], "ebronte"=&gt;["doc"]}</code></pre> </div> </div> <div class="paragraph"> <p>これで権限がわかったので、あとはプッシュされた各コミットがどのパスを変更しようとしているのかを調べれば、そのユーザーがプッシュできるのか判断できます。</p> </div> <div class="paragraph"> <p>あるコミットでどのファイルが変更されるのかを知るのはとても簡単で、<code>git log</code> コマンドに <code>--name-only</code> オプションを指定するだけです(<a href="/book/ja/v2/ch00/ch02-git-basics">[ch02-git-basics]</a> で簡単に説明しました)。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log -1 --name-only --pretty=format:'' 9f585d README lib/test.rb</code></pre> </div> </div> <div class="paragraph"> <p><code>get_acl_access_data</code> メソッドが返す ACL のデータとこのファイルリストを付き合わせれば、そのユーザーにコミットをプッシュする権限があるかどうかを判断できます。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby"># only allows certain users to modify certain subdirectories in a project def check_directory_perms access = get_acl_access_data('acl') # see if anyone is trying to push something they can't new_commits = `git rev-list #{$oldrev}..#{$newrev}`.split("\n") new_commits.each do |rev| files_modified = `git log -1 --name-only --pretty=format:'' #{rev}`.split("\n") files_modified.each do |path| next if path.size == 0 has_file_access = false access[$user].each do |access_path| if !access_path # user has access to everything || (path.start_with? access_path) # access to this path has_file_access = true end end if !has_file_access puts "[POLICY] You do not have access to push to #{path}" exit 1 end end end end check_directory_perms</code></pre> </div> </div> <div class="paragraph"> <p>最初に <code>git rev-list</code> でサーバへプッシュされるコミットの一覧を取得します。 次に、それぞれのコミットでどのファイルが変更されるのかを調べ、プッシュしてきたユーザーにそのファイルを変更する権限があるか確かめています。</p> </div> <div class="paragraph"> <p>これで、まずい形式のコミットメッセージや、指定されたパス以外のファイルの変更を含むコミットはプッシュできなくなりました。</p> </div> </div> <div class="sect4"> <h4 id="_テストを実施する">テストを実施する</h4> <div class="paragraph"> <p>これまでのコードを書き込んだファイルに対して <code>chmod u+x .git/hooks/update</code> を実行します。その上で、メッセージが規定に沿っていないコミットをプッシュしてみましょう。すると、こんなメッセージが表示されるでしょう。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push -f origin master Counting objects: 5, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 323 bytes, done. Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. Enforcing Policies... (refs/heads/master) (8338c5) (c5b616) [POLICY] Your message is not formatted correctly error: hooks/update exited with error code 1 error: hook declined to update refs/heads/master To git@gitserver:project.git ! [remote rejected] master -&gt; master (hook declined) error: failed to push some refs to 'git@gitserver:project.git'</code></pre> </div> </div> <div class="paragraph"> <p>この中には、興味深い点がいくつかあります。 まず、フックの実行が始まったときの次の表示に注目しましょう。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">Enforcing Policies... (refs/heads/master) (fb8c72) (c56860)</code></pre> </div> </div> <div class="paragraph"> <p>これは、スクリプトの先頭で標準出力に表示した内容でした。 ここで重要なのは「スクリプトから <code>stdout</code> に送った内容は、すべてクライアントにも送られる」ということです。</p> </div> <div class="paragraph"> <p>次に注目するのは、エラーメッセージです。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">[POLICY] Your message is not formatted correctly error: hooks/update exited with error code 1 error: hook declined to update refs/heads/master</code></pre> </div> </div> <div class="paragraph"> <p>最初の行はスクリプトから出力したもので、その他の 2 行は Git が出力したものです。この 2 行では、スクリプトがゼロ以外の値で終了したためにプッシュが却下されたということを説明しています。 最後に、次の部分に注目します。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">To git@gitserver:project.git ! [remote rejected] master -&gt; master (hook declined) error: failed to push some refs to 'git@gitserver:project.git'</code></pre> </div> </div> <div class="paragraph"> <p>フックで却下したすべての参照について、remote rejected メッセージが表示されます。これを見れば、フック内での処理のせいで却下されたのだということがわかります。</p> </div> <div class="paragraph"> <p>また、変更権限のないファイルを変更してそれを含むコミットをプッシュしようとしたときも、同様にエラーが表示されます。 たとえば、ドキュメント担当者が <code>lib</code> ディレクトリ内の何かを変更しようとした場合のメッセージは次のようになります。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">[POLICY] You do not have access to push to lib/test.rb</code></pre> </div> </div> <div class="paragraph"> <p>以降、この <code>update</code> スクリプトが動いてさえいれば、指定したパターンを含まないコミットメッセージがリポジトリに登録されることは二度とありません。また、ユーザーに変なところをさわられる心配もなくなります。</p> </div> </div> </div> <div class="sect3"> <h3 id="_クライアントサイドフック_2">クライアントサイドフック</h3> <div class="paragraph"> <p>この方式の弱点は、プッシュが却下されたときにユーザーが泣き寝入りせざるを得なくなるということです。 手間暇かけて仕上げた作業が最後の最後で却下されるというのは、非常にストレスがたまるし不可解です。さらに、プッシュするためには歴史を修正しなければならないのですが、気弱な人にとってそれはかなりつらいことです。</p> </div> <div class="paragraph"> <p>このジレンマに対する答えとして、サーバーが却下するであろう作業をするときに、それをユーザーに伝えるためのクライアントサイドフックを用意します。 そうすれば、何か問題があるときに、それをコミットする前に知ることができるので、取り返しのつかなくなる前に問題を修正できます。 なおプロジェクトをクローンしてもフックはコピーされないので、別の何らかの方法で各ユーザーにスクリプトを配布した上で、各ユーザーにそれを <code>.git/hooks</code> にコピーさせ、実行可能にさせる必要があります。 フックスクリプト自体をプロジェクトに含めたり別のプロジェクトにしたりすることはできますが、各自の環境でそれをフックとして自動的に設定することはできません。</p> </div> <div class="paragraph"> <p>はじめに、コミットを書き込む直前にコミットメッセージをチェックしなければなりません。コミットメッセージの書式に問題があったがために、変更がサーバーに却下されるということがないように、コミットメッセージの書式を調べるのです。 これを行うには <code>commit-msg</code> フックを使います。 最初の引数で渡されたファイルからコミットメッセージを読み込んでパターンと比較し、もしマッチしなければ Git の処理を中断させます。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">#!/usr/bin/env ruby message_file = ARGV[0] message = File.read(message_file) $regex = /\[ref: (\d+)\]/ if !$regex.match(message) puts "[POLICY] Your message is not formatted correctly" exit 1 end</code></pre> </div> </div> <div class="paragraph"> <p>このスクリプトを適切な場所 (<code>.git/hooks/commit-msg</code>) に置いて実行可能にしておくと、不適切なメッセージを書いてコミットしようとしたときに次のような結果となります。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git commit -am 'test' [POLICY] Your message is not formatted correctly</code></pre> </div> </div> <div class="paragraph"> <p>このとき、実際にはコミットされません。 もしメッセージが適切な書式になっていれば、Git はコミットを許可します。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git commit -am 'test [ref: 132]' [master e05c914] test [ref: 132] 1 file changed, 1 insertions(+), 0 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>次に、ACL で決められた範囲以外のファイルを変更していないことを確認しましょう。 先ほど使った ACL ファイルのコピーがプロジェクトの <code>.git</code> ディレクトリにあれば、次のような <code>pre-commit</code> スクリプトでチェックできます。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">#!/usr/bin/env ruby $user = ENV['USER'] # [ insert acl_access_data method from above ] # only allows certain users to modify certain subdirectories in a project def check_directory_perms access = get_acl_access_data('.git/acl') files_modified = `git diff-index --cached --name-only HEAD`.split("\n") files_modified.each do |path| next if path.size == 0 has_file_access = false access[$user].each do |access_path| if !access_path || (path.index(access_path) == 0) has_file_access = true end if !has_file_access puts "[POLICY] You do not have access to push to #{path}" exit 1 end end end check_directory_perms</code></pre> </div> </div> <div class="paragraph"> <p>大まかにはサーバーサイドのスクリプトと同じですが、重要な違いがふたつあります。 まず、ACL ファイルの場所が違います。このスクリプトは作業ディレクトリから実行するものであり、<code>.git</code> ディレクトリから実行するものではないからです。 ACL ファイルの場所を、先ほどの</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">access = get_acl_access_data('acl')</code></pre> </div> </div> <div class="paragraph"> <p>から次のように変更しなければなりません。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">access = get_acl_access_data('.git/acl')</code></pre> </div> </div> <div class="paragraph"> <p>もうひとつの違いは、変更されたファイルの一覧を取得する方法です。 サーバーサイドのメソッドではコミットログを調べていました。しかしこの時点ではまだコミットが記録されていないので、ファイルの一覧はステージング・エリアから取得しなければなりません。 つまり、先ほどの</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">files_modified = `git log -1 --name-only --pretty=format:'' #{ref}`</code></pre> </div> </div> <div class="paragraph"> <p>は次のようになります。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">files_modified = `git diff-index --cached --name-only HEAD`</code></pre> </div> </div> <div class="paragraph"> <p>しかし、違うのはこの二点だけで、それ以外はまったく同じように動作します。 ただしこのスクリプトは、ローカルで実行しているユーザーと、リモートマシンにプッシュするときのユーザーが同じであることを前提にしています。 もし異なる場合は、変数 <code>$user</code> を手動で設定しなければなりません。</p> </div> <div class="paragraph"> <p>最後に残ったのは fast-forward でないプッシュを止めることです。 fast-forward でない参照を取得するには、すでにプッシュした過去のコミットにリベースするか、別のローカルブランチにリモートブランチと同じところまでプッシュしなければなりません。</p> </div> <div class="paragraph"> <p>サーバーサイドではすでに <code>receive.denyDeletes</code> と <code>receive.denyNonFastForwards</code> でこのポリシーを強制しているでしょうから、あり得るのは、すでにプッシュ済みのコミットをリベースしようとするときくらいです。</p> </div> <div class="paragraph"> <p>それをチェックする pre-rebase スクリプトの例を示します。 これは書き換えようとしているコミットの一覧を取得し、それがリモート参照の中に存在するかどうかを調べます。 リモート参照から到達可能なコミットがひとつでもあれば、リベースを中断します。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">#!/usr/bin/env ruby base_branch = ARGV[0] if ARGV[1] topic_branch = ARGV[1] else topic_branch = "HEAD" end target_shas = `git rev-list #{base_branch}..#{topic_branch}`.split("\n") remote_refs = `git branch -r`.split("\n").map { |r| r.strip } target_shas.each do |sha| remote_refs.each do |remote_ref| shas_pushed = `git rev-list ^#{sha}^@ refs/remotes/#{remote_ref}` if shas_pushed.split("\n").include?(sha) puts "[POLICY] Commit #{sha} has already been pushed to #{remote_ref}" exit 1 end end end</code></pre> </div> </div> <div class="paragraph"> <p>このスクリプトでは、 <a href="/book/ja/v2/ch00/r_revision_selection">リビジョンの選択</a> ではカバーしていない構文を使っています。 既にプッシュ済みのコミットの一覧を得るために、次のコマンドを実行します。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">`git rev-list ^#{sha}^@ refs/remotes/#{remote_ref}`</code></pre> </div> </div> <div class="paragraph"> <p><code>SHA^@</code> 構文は、そのコミットのすべての親を解決します。 リモートの最後のコミットから到達可能で、これからプッシュしようとする SHA-1 の親のいずれかからもアクセスできないコミット(これによって fast-forward であることが分かります)を探します。</p> </div> <div class="paragraph"> <p>この方式の弱点は非常に時間がかかることで、多くの場合このチェックは不要です。<code>-f</code> つきで強制的にプッシュしようとしない限り、サーバーが警告を出してプッシュできないからです。 しかし練習用の課題としてはおもしろいもので、あとでリベースを取り消してやりなおすはめになることを理屈上は防げるようになります。</p> </div> </div> <div id="nav"><a href="/book/ja/v2/Git-のカスタマイズ-Git-フック">prev</a> | <a href="/book/ja/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>

Pages: 1 2 3 4 5 6 7 8 9 10