CINXE.COM

Git - 分支的新建与合并

<!DOCTYPE html> <html lang="zh"> <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-Branching-Basic-Branching-and-Merging">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99d%c9%99-Branch-Sad%c9%99-Branching-v%c9%99-Birl%c9%99%c5%9fdirm%c9%99">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/%d0%9a%d0%bb%d0%be%d0%bd%d0%be%d0%b2%d0%b5-%d0%b2-Git-%d0%9e%d1%81%d0%bd%d0%be%d0%b2%d0%b8-%d0%bd%d0%b0-%d0%ba%d0%bb%d0%be%d0%bd%d0%be%d0%b2%d0%b5%d1%82%d0%b5-%d0%ba%d0%be%d0%b4-%d0%b8-%d1%81%d0%bb%d0%b8%d0%b2%d0%b0%d0%bd%d0%b5%d1%82%d0%be">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Branching-Einfaches-Branching-und-Merging">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Ramificaciones-en-Git-Procedimientos-B%c3%a1sicos-para-Ramificar-y-Fusionar">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Les-branches-avec-Git-Branches-et-fusions%c2%a0:-les-bases">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%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>,</td></tr> <tr><td><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">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Branchen-in-Git-Eenvoudig-branchen-en-mergen">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%92%d0%b5%d1%82%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b2-Git-%d0%9e%d1%81%d0%bd%d0%be%d0%b2%d1%8b-%d0%b2%d0%b5%d1%82%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b8-%d1%81%d0%bb%d0%b8%d1%8f%d0%bd%d0%b8%d1%8f">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Veje-Git-Osnove-vej-in-zdru%c5%beevanja">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Pag-branch-ng-Git-Batayan-ng-Pag-branch-at-Pag-merge">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%93%d0%b0%d0%bb%d1%83%d0%b6%d0%b5%d0%bd%d0%bd%d1%8f-%d0%b2-git-%d0%9e%d1%81%d0%bd%d0%be%d0%b2%d0%b8-%d0%b3%d0%b0%d0%bb%d1%83%d0%b6%d0%b5%d0%bd%d0%bd%d1%8f-%d1%82%d0%b0-%d0%b7%d0%bb%d0%b8%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%9a%84%e6%96%b0%e5%bb%ba%e4%b8%8e%e5%90%88%e5%b9%b6">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/V%c4%9btve-v-syst%c3%a9mu-Git-Z%c3%a1klady-v%c4%9btven%c3%ad-a-slu%c4%8dov%c3%a1n%c3%ad">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%93%d1%80%d0%b0%d0%bd%d0%b5%d1%9a%d0%b5-%d0%b2%d0%be-Git-%d0%9e%d1%81%d0%bd%d0%be%d0%b2%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d0%b3%d1%80%d0%b0%d0%bd%d1%83%d0%b2%d0%b0%d1%9a%d0%b5-%d0%b8-%d1%81%d0%bf%d0%be%d1%98%d1%83%d0%b2%d0%b0%d1%9a%d0%b5">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Podstawy-rozga%c5%82%c4%99ziania-i-scalania">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d1%80%d0%b0%d0%bd%d0%b0%d1%9a%d0%b5-%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d1%83-%d0%93%d0%b8%d1%82-%d0%9e%d1%81%d0%bd%d0%be%d0%b2%d0%b5-%d0%b3%d1%80%d0%b0%d0%bd%d0%b0%d1%9a%d0%b0-%d0%b8-%d1%81%d0%bf%d0%b0%d1%98%d0%b0%d1%9a%d0%b0">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-%d0%b4%d0%b0-%d1%82%d0%b0%d1%80%d0%bc%d0%be%d2%9b%d0%bb%d0%b0%d0%bd%d0%b8%d1%88-%d0%a2%d0%b0%d1%80%d0%bc%d0%be%d2%9b%d0%bb%d0%b0%d0%bd%d0%b8%d1%88-%d0%b2%d0%b0-%d0%b1%d0%b8%d1%80%d0%bb%d0%b0%d1%88%d0%b8%d1%88-%d0%b0%d1%81%d0%be%d1%81%d0%bb%d0%b0%d1%80%d0%b8">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/%e4%bd%bf%e7%94%a8-Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e5%92%8c%e5%90%88%e4%bd%b5%e7%9a%84%e5%9f%ba%e6%9c%ac%e7%94%a8%e6%b3%95">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Branching-Basic-Branching-and-Merging">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/%d8%b4%d8%a7%d8%ae%d9%87%e2%80%8c%d8%b3%d8%a7%d8%b2%db%8c-%d8%af%d8%b1-%da%af%db%8c%d8%aa-%d8%b4%d8%a7%d8%ae%d9%87%e2%80%8c%d8%b3%d8%a7%d8%b2%db%8c-%d9%88-%d8%a7%d8%af%d8%ba%d8%a7%d9%85-%d9%85%d9%82%d8%af%d9%85%d8%a7%d8%aa%db%8c" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Branching-Basic-Branching-and-Merging">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Branching-Basic-Branching-and-Merging">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Branching-Basic-Branching-and-Merging">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Branches-no-Git-O-b%c3%a1sico-de-Ramifica%c3%a7%c3%a3o-Branch-e-Mesclagem-Merge">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Ramifica%c3%a7%c3%a3o-do-Git-Basic-Branching-and-Merging">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-f%c3%b6rgreningar-Grundl%c3%a4ggande-f%c3%b6rgrening-och-sammanslagning">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-Dallar%c4%b1-K%c4%b1saca-Dalland%c4%b1rma-ve-Birle%c5%9ftirme-Temelleri">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-zh">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/zh/v2/%e8%b5%b7%e6%ad%a5-%e5%85%b3%e4%ba%8e%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6">起步</a></h2> <ol> <li> 1.1 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-%e5%85%b3%e4%ba%8e%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6">关于版本控制</a> </li> <li> 1.2 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-Git-%e7%ae%80%e5%8f%b2">Git 简史</a> </li> <li> 1.3 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-Git-%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9f">Git 是什么?</a> </li> <li> 1.4 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-%e5%91%bd%e4%bb%a4%e8%a1%8c">命令行</a> </li> <li> 1.5 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-%e5%ae%89%e8%a3%85-Git">安装 Git</a> </li> <li> 1.6 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-%e5%88%9d%e6%ac%a1%e8%bf%90%e8%a1%8c-Git-%e5%89%8d%e7%9a%84%e9%85%8d%e7%bd%ae">初次运行 Git 前的配置</a> </li> <li> 1.7 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-%e8%8e%b7%e5%8f%96%e5%b8%ae%e5%8a%a9">获取帮助</a> </li> <li> 1.8 <a href="/book/zh/v2/%e8%b5%b7%e6%ad%a5-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e8%8e%b7%e5%8f%96-Git-%e4%bb%93%e5%ba%93">Git 基础</a></h2> <ol> <li> 2.1 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e8%8e%b7%e5%8f%96-Git-%e4%bb%93%e5%ba%93">获取 Git 仓库</a> </li> <li> 2.2 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e8%ae%b0%e5%bd%95%e6%af%8f%e6%ac%a1%e6%9b%b4%e6%96%b0%e5%88%b0%e4%bb%93%e5%ba%93">记录每次更新到仓库</a> </li> <li> 2.3 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e6%9f%a5%e7%9c%8b%e6%8f%90%e4%ba%a4%e5%8e%86%e5%8f%b2">查看提交历史</a> </li> <li> 2.4 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e6%92%a4%e6%b6%88%e6%93%8d%e4%bd%9c">撤消操作</a> </li> <li> 2.5 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e8%bf%9c%e7%a8%8b%e4%bb%93%e5%ba%93%e7%9a%84%e4%bd%bf%e7%94%a8">远程仓库的使用</a> </li> <li> 2.6 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e6%89%93%e6%a0%87%e7%ad%be">打标签</a> </li> <li> 2.7 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-Git-%e5%88%ab%e5%90%8d">Git 别名</a> </li> <li> 2.8 <a href="/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%ae%80%e4%bb%8b">Git 分支</a></h2> <ol> <li> 3.1 <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%ae%80%e4%bb%8b">分支简介</a> </li> <li> 3.2 <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%9a%84%e6%96%b0%e5%bb%ba%e4%b8%8e%e5%90%88%e5%b9%b6" class="active">分支的新建与合并</a> </li> <li> 3.3 <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%ae%a1%e7%90%86">分支管理</a> </li> <li> 3.4 <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e5%bc%80%e5%8f%91%e5%b7%a5%e4%bd%9c%e6%b5%81">分支开发工作流</a> </li> <li> 3.5 <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e8%bf%9c%e7%a8%8b%e5%88%86%e6%94%af">远程分支</a> </li> <li> 3.6 <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%8f%98%e5%9f%ba">变基</a> </li> <li> 3.7 <a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-%e5%8d%8f%e8%ae%ae">服务器上的 Git</a></h2> <ol> <li> 4.1 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-%e5%8d%8f%e8%ae%ae">协议</a> </li> <li> 4.2 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-%e5%9c%a8%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e6%90%ad%e5%bb%ba-Git">在服务器上搭建 Git</a> </li> <li> 4.3 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-%e7%94%9f%e6%88%90-SSH-%e5%85%ac%e9%92%a5">生成 SSH 公钥</a> </li> <li> 4.4 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-%e9%85%8d%e7%bd%ae%e6%9c%8d%e5%8a%a1%e5%99%a8">配置服务器</a> </li> <li> 4.5 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-Git-%e5%ae%88%e6%8a%a4%e8%bf%9b%e7%a8%8b">Git 守护进程</a> </li> <li> 4.6 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-Smart-HTTP">Smart HTTP</a> </li> <li> 4.7 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-%e7%ac%ac%e4%b8%89%e6%96%b9%e6%89%98%e7%ae%a1%e7%9a%84%e9%80%89%e6%8b%a9">第三方托管的选择</a> </li> <li> 4.10 <a href="/book/zh/v2/%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84-Git-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/zh/v2/%e5%88%86%e5%b8%83%e5%bc%8f-Git-%e5%88%86%e5%b8%83%e5%bc%8f%e5%b7%a5%e4%bd%9c%e6%b5%81%e7%a8%8b">分布式 Git</a></h2> <ol> <li> 5.1 <a href="/book/zh/v2/%e5%88%86%e5%b8%83%e5%bc%8f-Git-%e5%88%86%e5%b8%83%e5%bc%8f%e5%b7%a5%e4%bd%9c%e6%b5%81%e7%a8%8b">分布式工作流程</a> </li> <li> 5.2 <a href="/book/zh/v2/%e5%88%86%e5%b8%83%e5%bc%8f-Git-%e5%90%91%e4%b8%80%e4%b8%aa%e9%a1%b9%e7%9b%ae%e8%b4%a1%e7%8c%ae">向一个项目贡献</a> </li> <li> 5.3 <a href="/book/zh/v2/%e5%88%86%e5%b8%83%e5%bc%8f-Git-%e7%bb%b4%e6%8a%a4%e9%a1%b9%e7%9b%ae">维护项目</a> </li> <li> 5.4 <a href="/book/zh/v2/%e5%88%86%e5%b8%83%e5%bc%8f-Git-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/zh/v2/GitHub-%e8%b4%a6%e6%88%b7%e7%9a%84%e5%88%9b%e5%bb%ba%e5%92%8c%e9%85%8d%e7%bd%ae">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/zh/v2/GitHub-%e8%b4%a6%e6%88%b7%e7%9a%84%e5%88%9b%e5%bb%ba%e5%92%8c%e9%85%8d%e7%bd%ae">账户的创建和配置</a> </li> <li> 6.2 <a href="/book/zh/v2/GitHub-%e5%af%b9%e9%a1%b9%e7%9b%ae%e5%81%9a%e5%87%ba%e8%b4%a1%e7%8c%ae">对项目做出贡献</a> </li> <li> 6.3 <a href="/book/zh/v2/GitHub-%e7%bb%b4%e6%8a%a4%e9%a1%b9%e7%9b%ae">维护项目</a> </li> <li> 6.4 <a href="/book/zh/v2/GitHub-%e7%ae%a1%e7%90%86%e7%bb%84%e7%bb%87">管理组织</a> </li> <li> 6.5 <a href="/book/zh/v2/GitHub-%e8%84%9a%e6%9c%ac-GitHub">脚本 GitHub</a> </li> <li> 6.6 <a href="/book/zh/v2/GitHub-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>7. <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">Git 工具</a></h2> <ol> <li> 7.1 <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> </li> <li> 7.2 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e4%ba%a4%e4%ba%92%e5%bc%8f%e6%9a%82%e5%ad%98">交互式暂存</a> </li> <li> 7.3 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e8%b4%ae%e8%97%8f%e4%b8%8e%e6%b8%85%e7%90%86">贮藏与清理</a> </li> <li> 7.4 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e7%ad%be%e7%bd%b2%e5%b7%a5%e4%bd%9c">签署工作</a> </li> <li> 7.5 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e6%90%9c%e7%b4%a2">搜索</a> </li> <li> 7.6 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e9%87%8d%e5%86%99%e5%8e%86%e5%8f%b2">重写历史</a> </li> <li> 7.7 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e9%87%8d%e7%bd%ae%e6%8f%ad%e5%af%86">重置揭密</a> </li> <li> 7.8 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e9%ab%98%e7%ba%a7%e5%90%88%e5%b9%b6">高级合并</a> </li> <li> 7.9 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e4%bd%bf%e7%94%a8-Git-%e8%b0%83%e8%af%95">使用 Git 调试</a> </li> <li> 7.11 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e5%ad%90%e6%a8%a1%e5%9d%97">子模块</a> </li> <li> 7.12 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e6%89%93%e5%8c%85">打包</a> </li> <li> 7.13 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e6%9b%bf%e6%8d%a2">替换</a> </li> <li> 7.14 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e5%87%ad%e8%af%81%e5%ad%98%e5%82%a8">凭证存储</a> </li> <li> 7.15 <a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-%e9%85%8d%e7%bd%ae-Git">自定义 Git</a></h2> <ol> <li> 8.1 <a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-%e9%85%8d%e7%bd%ae-Git">配置 Git</a> </li> <li> 8.2 <a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-Git-%e5%b1%9e%e6%80%a7">Git 属性</a> </li> <li> 8.3 <a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-Git-%e9%92%a9%e5%ad%90">Git 钩子</a> </li> <li> 8.4 <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> </li> <li> 8.5 <a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/zh/v2/Git-%e4%b8%8e%e5%85%b6%e4%bb%96%e7%b3%bb%e7%bb%9f-%e4%bd%9c%e4%b8%ba%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9a%84-Git">Git 与其他系统</a></h2> <ol> <li> 9.1 <a href="/book/zh/v2/Git-%e4%b8%8e%e5%85%b6%e4%bb%96%e7%b3%bb%e7%bb%9f-%e4%bd%9c%e4%b8%ba%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9a%84-Git">作为客户端的 Git</a> </li> <li> 9.2 <a href="/book/zh/v2/Git-%e4%b8%8e%e5%85%b6%e4%bb%96%e7%b3%bb%e7%bb%9f-%e8%bf%81%e7%a7%bb%e5%88%b0-Git">迁移到 Git</a> </li> <li> 9.3 <a href="/book/zh/v2/Git-%e4%b8%8e%e5%85%b6%e4%bb%96%e7%b3%bb%e7%bb%9f-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e5%ba%95%e5%b1%82%e5%91%bd%e4%bb%a4%e4%b8%8e%e4%b8%8a%e5%b1%82%e5%91%bd%e4%bb%a4">Git 内部原理</a></h2> <ol> <li> 10.1 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e5%ba%95%e5%b1%82%e5%91%bd%e4%bb%a4%e4%b8%8e%e4%b8%8a%e5%b1%82%e5%91%bd%e4%bb%a4">底层命令与上层命令</a> </li> <li> 10.2 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-Git-%e5%af%b9%e8%b1%a1">Git 对象</a> </li> <li> 10.3 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-Git-%e5%bc%95%e7%94%a8">Git 引用</a> </li> <li> 10.4 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e5%8c%85%e6%96%87%e4%bb%b6">包文件</a> </li> <li> 10.5 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e5%bc%95%e7%94%a8%e8%a7%84%e8%8c%83">引用规范</a> </li> <li> 10.6 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e4%bc%a0%e8%be%93%e5%8d%8f%e8%ae%ae">传输协议</a> </li> <li> 10.7 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e7%bb%b4%e6%8a%a4%e4%b8%8e%e6%95%b0%e6%8d%ae%e6%81%a2%e5%a4%8d">维护与数据恢复</a> </li> <li> 10.8 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f">环境变量</a> </li> <li> 10.9 <a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-%e5%9b%be%e5%bd%a2%e7%95%8c%e9%9d%a2">附录 A: 在其它环境中使用 Git</a></h2> <ol> <li> A1.1 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-%e5%9b%be%e5%bd%a2%e7%95%8c%e9%9d%a2">图形界面</a> </li> <li> A1.2 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-Visual-Studio-%e4%b8%ad%e7%9a%84-Git">Visual Studio 中的 Git</a> </li> <li> A1.3 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-Visual-Studio-Code-%e4%b8%ad%e7%9a%84-Git">Visual Studio Code 中的 Git</a> </li> <li> A1.4 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-IntelliJ-/-PyCharm-/-WebStorm-/-PhpStorm-/-RubyMine-%e4%b8%ad%e7%9a%84-Git">IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git</a> </li> <li> A1.5 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-Sublime-Text-%e4%b8%ad%e7%9a%84-Git">Sublime Text 中的 Git</a> </li> <li> A1.6 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-Bash-%e4%b8%ad%e7%9a%84-Git">Bash 中的 Git</a> </li> <li> A1.7 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-Zsh-%e4%b8%ad%e7%9a%84-Git">Zsh 中的 Git</a> </li> <li> A1.8 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-Git-%e5%9c%a8-PowerShell-%e4%b8%ad%e4%bd%bf%e7%94%a8-Git">Git 在 PowerShell 中使用 Git</a> </li> <li> A1.9 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-A:-%e5%9c%a8%e5%85%b6%e5%ae%83%e7%8e%af%e5%a2%83%e4%b8%ad%e4%bd%bf%e7%94%a8-Git-%e6%80%bb%e7%bb%93">总结</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/zh/v2/%e9%99%84%e5%bd%95-B:-%e5%9c%a8%e4%bd%a0%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%ad%e5%b5%8c%e5%85%a5-Git-%e5%91%bd%e4%bb%a4%e8%a1%8c-Git-%e6%96%b9%e5%bc%8f">附录 B: 在你的应用中嵌入 Git</a></h2> <ol> <li> A2.1 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-B:-%e5%9c%a8%e4%bd%a0%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%ad%e5%b5%8c%e5%85%a5-Git-%e5%91%bd%e4%bb%a4%e8%a1%8c-Git-%e6%96%b9%e5%bc%8f">命令行 Git 方式</a> </li> <li> A2.2 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-B:-%e5%9c%a8%e4%bd%a0%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%ad%e5%b5%8c%e5%85%a5-Git-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-B:-%e5%9c%a8%e4%bd%a0%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%ad%e5%b5%8c%e5%85%a5-Git-JGit">JGit</a> </li> <li> A2.4 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-B:-%e5%9c%a8%e4%bd%a0%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%ad%e5%b5%8c%e5%85%a5-Git-go-git">go-git</a> </li> <li> A2.5 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-B:-%e5%9c%a8%e4%bd%a0%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%ad%e5%b5%8c%e5%85%a5-Git-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e8%ae%be%e7%bd%ae%e4%b8%8e%e9%85%8d%e7%bd%ae">附录 C: Git 命令</a></h2> <ol> <li> A3.1 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e8%ae%be%e7%bd%ae%e4%b8%8e%e9%85%8d%e7%bd%ae">设置与配置</a> </li> <li> A3.2 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e8%8e%b7%e5%8f%96%e4%b8%8e%e5%88%9b%e5%bb%ba%e9%a1%b9%e7%9b%ae">获取与创建项目</a> </li> <li> A3.3 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e5%bf%ab%e7%85%a7%e5%9f%ba%e7%a1%80">快照基础</a> </li> <li> A3.4 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e5%88%86%e6%94%af%e4%b8%8e%e5%90%88%e5%b9%b6">分支与合并</a> </li> <li> A3.5 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e9%a1%b9%e7%9b%ae%e5%88%86%e4%ba%ab%e4%b8%8e%e6%9b%b4%e6%96%b0">项目分享与更新</a> </li> <li> A3.6 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e6%a3%80%e6%9f%a5%e4%b8%8e%e6%af%94%e8%be%83">检查与比较</a> </li> <li> A3.7 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e8%b0%83%e8%af%95">调试</a> </li> <li> A3.8 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e8%a1%a5%e4%b8%81">补丁</a> </li> <li> A3.9 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e9%82%ae%e4%bb%b6">邮件</a> </li> <li> A3.10 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e5%a4%96%e9%83%a8%e7%b3%bb%e7%bb%9f">外部系统</a> </li> <li> A3.11 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e7%ae%a1%e7%90%86">管理</a> </li> <li> A3.12 <a href="/book/zh/v2/%e9%99%84%e5%bd%95-C:-Git-%e5%91%bd%e4%bb%a4-%e5%ba%95%e5%b1%82%e5%91%bd%e4%bb%a4">底层命令</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>3.2 Git 分支 - 分支的新建与合并</h1> <div> <h2 id="_分支的新建与合并">分支的新建与合并</h2> <div class="paragraph"> <p>让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。 你将经历如下步骤:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>开发某个网站。</p> </li> <li> <p>为实现某个新的用户需求,创建一个分支。</p> </li> <li> <p>在这个分支上开展工作。</p> </li> </ol> </div> <div class="paragraph"> <p>正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>切换到你的线上分支(production branch)。</p> </li> <li> <p>为这个紧急任务新建一个分支,并在其中修复它。</p> </li> <li> <p>在测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支。</p> </li> <li> <p>切换回你最初工作的分支上,继续工作。</p> </li> </ol> </div> <div class="sect3"> <h3 id="_basic_branching">新建分支</h3> <div class="paragraph"> <p> 首先,我们假设你正在你的项目上工作,并且在 <code>master</code> 分支上已经有了一些提交。</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-branching-1.png" alt="一个简单的提交历史。"> </div> <div class="title">Figure 18. 一个简单提交历史</div> </div> <div class="paragraph"> <p>现在,你已经决定要解决你的公司使用的问题追踪系统中的 #53 问题。 想要新建一个分支并同时切换到那个分支上,你可以运行一个带有 <code>-b</code> 参数的 <code>git checkout</code> 命令:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -b iss53 Switched to a new branch "iss53"</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">$ git branch iss53 $ git checkout iss53</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-branching-2.png" alt="创建一个新分支指针。"> </div> <div class="title">Figure 19. 创建一个新分支指针</div> </div> <div class="paragraph"> <p>你继续在 #53 问题上工作,并且做了一些提交。 在此过程中,<code>iss53</code> 分支在不断的向前推进,因为你已经检出到该分支 (也就是说,你的 <code>HEAD</code> 指针指向了 <code>iss53</code> 分支)</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ vim index.html $ git commit -a -m 'added a new footer [issue 53]'</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-branching-3.png" alt="`iss53` 分支随着工作的进展向前推进。"> </div> <div class="title">Figure 20. <code>iss53</code> 分支随着工作的进展向前推进</div> </div> <div class="paragraph"> <p>现在你接到那个电话,有个紧急问题等待你来解决。 有了 Git 的帮助,你不必把这个紧急问题和 <code>iss53</code> 的修改混在一起, 你也不需要花大力气来还原关于 53# 问题的修改,然后再添加关于这个紧急问题的修改,最后将这个修改提交到线上分支。 你所要做的仅仅是切换回 <code>master</code> 分支。</p> </div> <div class="paragraph"> <p>但是,在你这么做之前,要留意你的工作目录和暂存区里那些还没有被提交的修改, 它可能会和你即将检出的分支产生冲突从而阻止 Git 切换到该分支。 最好的方法是,在你切换分支之前,保持好一个干净的状态。 有一些方法可以绕过这个问题(即,贮藏(stashing) 和 修补提交(commit amending)), 我们会在 <a href="/book/zh/v2/ch00/_git_stashing">贮藏与清理</a> 中看到关于这两个命令的介绍。 现在,我们假设你已经把你的修改全部提交了,这时你可以切换回 <code>master</code> 分支了:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master Switched to branch 'master'</code></pre> </div> </div> <div class="paragraph"> <p>这个时候,你的工作目录和你在开始 #53 问题之前一模一样,现在你可以专心修复紧急问题了。 请牢记:当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。</p> </div> <div class="paragraph"> <p>接下来,你要修复这个紧急问题。 我们来建立一个 <code>hotfix</code> 分支,在该分支上工作直到问题解决:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -b hotfix Switched to a new branch 'hotfix' $ vim index.html $ git commit -a -m 'fixed the broken email address' [hotfix 1fb7853] fixed the broken email address 1 file changed, 2 insertions(+)</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-branching-4.png" alt="基于 `master` 分支的紧急问题分支(hotfix branch)。"> </div> <div class="title">Figure 21. 基于 <code>master</code> 分支的紧急问题分支 <code>hotfix branch</code> </div> </div> <div class="paragraph"> <p>你可以运行你的测试,确保你的修改是正确的,然后将 <code>hotfix</code> 分支合并回你的 <code>master</code> 分支来部署到线上。 你可以使用 <code>git merge</code> 命令来达到上述目的:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master $ git merge hotfix Updating f42c576..3a0874c Fast-forward index.html | 2 ++ 1 file changed, 2 insertions(+)</code></pre> </div> </div> <div class="paragraph"> <p>在合并的时候,你应该注意到了“快进(fast-forward)”这个词。 由于你想要合并的分支 <code>hotfix</code> 所指向的提交 <code>C4</code> 是你所在的提交 <code>C2</code> 的直接后继, 因此 Git 会直接将指针向前移动。换句话说,当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。</p> </div> <div class="paragraph"> <p>现在,最新的修改已经在 <code>master</code> 分支所指向的提交快照中,你可以着手发布该修复了。</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-branching-5.png" alt="`master` 被快进到 `hotfix`。"> </div> <div class="title">Figure 22. <code>master</code> 被快进到 <code>hotfix</code> </div> </div> <div class="paragraph"> <p>关于这个紧急问题的解决方案发布之后,你准备回到被打断之前时的工作中。 然而,你应该先删除 <code>hotfix</code> 分支,因为你已经不再需要它了 —— <code>master</code> 分支已经指向了同一个位置。 你可以使用带 <code>-d</code> 选项的 <code>git branch</code> 命令来删除分支:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git branch -d hotfix Deleted branch hotfix (3a0874c).</code></pre> </div> </div> <div class="paragraph"> <p>现在你可以切换回你正在工作的分支继续你的工作,也就是针对 #53 问题的那个分支(iss53 分支)。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout iss53 Switched to branch "iss53" $ vim index.html $ git commit -a -m 'finished the new footer [issue 53]' [iss53 ad82d7a] finished the new footer [issue 53] 1 file changed, 1 insertion(+)</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-branching-6.png" alt="继续在 `iss53` 分支上的工作。"> </div> <div class="title">Figure 23. 继续在 <code>iss53</code> 分支上的工作</div> </div> <div class="paragraph"> <p>你在 <code>hotfix</code> 分支上所做的工作并没有包含到 <code>iss53</code> 分支中。 如果你需要拉取 <code>hotfix</code> 所做的修改,你可以使用 <code>git merge master</code> 命令将 <code>master</code> 分支合并入 <code>iss53</code> 分支,或者你也可以等到 <code>iss53</code> 分支完成其使命,再将其合并回 <code>master</code> 分支。</p> </div> </div> <div class="sect3"> <h3 id="_basic_merging">分支的合并</h3> <div class="paragraph"> <p> 假设你已经修正了 #53 问题,并且打算将你的工作合并入 <code>master</code> 分支。 为此,你需要合并 <code>iss53</code> 分支到 <code>master</code> 分支,这和之前你合并 <code>hotfix</code> 分支所做的工作差不多。 你只需要检出到你想合并入的分支,然后运行 <code>git merge</code> 命令:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master Switched to branch 'master' $ git merge iss53 Merge made by the 'recursive' strategy. index.html | 1 + 1 file changed, 1 insertion(+)</code></pre> </div> </div> <div class="paragraph"> <p>这和你之前合并 <code>hotfix</code> 分支的时候看起来有一点不一样。 在这种情况下,你的开发历史从一个更早的地方开始分叉开来(diverged)。 因为,<code>master</code> 分支所在提交并不是 <code>iss53</code> 分支所在提交的直接祖先,Git 不得不做一些额外的工作。 出现这种情况的时候,Git 会使用两个分支的末端所指的快照(<code>C4</code> 和 <code>C5</code>)以及这两个分支的公共祖先(<code>C2</code>),做一个简单的三方合并。</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-merging-1.png" alt="一次典型合并中所用到的三个快照。"> </div> <div class="title">Figure 24. 一次典型合并中所用到的三个快照</div> </div> <div class="paragraph"> <p>和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/zh/v2/images/basic-merging-2.png" alt="一个合并提交。"> </div> <div class="title">Figure 25. 一个合并提交</div> </div> <div class="paragraph"> <p>既然你的修改已经合并进来了,就不再需要 <code>iss53</code> 分支了。 现在你可以在任务追踪系统中关闭此项任务,并删除这个分支。</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git branch -d iss53</code></pre> </div> </div> </div> <div class="sect3"> <h3 id="_basic_merge_conflicts">遇到冲突时的分支合并</h3> <div class="paragraph"> <p> 有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。 如果你对 #53 问题的修改和有关 <code>hotfix</code> 分支的修改都涉及到同一个文件的同一处,在合并它们的时候就会产生合并冲突:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge iss53 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.</code></pre> </div> </div> <div class="paragraph"> <p>此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 <code>git status</code> 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add &lt;file&gt;..." to mark resolution) both modified: index.html no changes added to commit (use "git add" and/or "git commit -a")</code></pre> </div> </div> <div class="paragraph"> <p>任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-html" data-lang="html">&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD:index.html &lt;div id="footer"&gt;contact : email.support@github.com&lt;/div&gt; ======= &lt;div id="footer"&gt; please contact us at support@github.com &lt;/div&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; iss53:index.html</code></pre> </div> </div> <div class="paragraph"> <p>这表示 <code>HEAD</code> 所指示的版本(也就是你的 <code>master</code> 分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(<code>=======</code> 的上半部分),而 <code>iss53</code> 分支所指示的版本在 <code>=======</code> 的下半部分。 为了解决冲突,你必须选择使用由 <code>=======</code> 分割的两部分中的一个,或者你也可以自行合并这些内容。 例如,你可以通过把这段内容换成下面的样子来解决冲突:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-html" data-lang="html">&lt;div id="footer"&gt; please contact us at email.support@github.com &lt;/div&gt;</code></pre> </div> </div> <div class="paragraph"> <p>上述的冲突解决方案仅保留了其中一个分支的修改,并且 <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code> , <code>=======</code> , 和 <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code> 这些行被完全删除了。 在你解决了所有文件里的冲突之后,对每个文件使用 <code>git add</code> 命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。</p> </div> <div class="paragraph"> <p>如果你想使用图形化工具来解决冲突,你可以运行 <code>git mergetool</code>,该命令会为你启动一个合适的可视化合并工具,并带领你一步一步解决这些冲突:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git mergetool This message is displayed because 'merge.tool' is not configured. See 'git mergetool --tool-help' or 'git help config' for more details. 'git mergetool' will now attempt to use one of the following tools: opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge Merging: index.html Normal merge conflict for 'index.html': {local}: modified file {remote}: modified file Hit return to start merge resolution tool (opendiff):</code></pre> </div> </div> <div class="paragraph"> <p>如果你想使用除默认工具(在这里 Git 使用 <code>opendiff</code> 做为默认的合并工具,因为作者在 Mac 上运行该程序) 外的其他合并工具,你可以在 “下列工具中(one of the following tools)” 这句后面看到所有支持的合并工具。 然后输入你喜欢的工具名字就可以了。</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Note</div> </td> <td class="content"> <div class="paragraph"> <p>如果你需要更加高级的工具来解决复杂的合并冲突,我们会在 <a href="/book/zh/v2/ch00/_advanced_merging">高级合并</a> 介绍更多关于分支合并的内容。</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>等你退出合并工具之后,Git 会询问刚才的合并是否成功。 如果你回答是,Git 会暂存那些文件以表明冲突已解决: 你可以再次运行 <code>git status</code> 来确认所有的合并冲突都已被解决:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git status On branch master All conflicts fixed but you are still merging. (use "git commit" to conclude merge) Changes to be committed: modified: index.html</code></pre> </div> </div> <div class="paragraph"> <p>如果你对结果感到满意,并且确定之前有冲突的文件都已经暂存了,这时你可以输入 <code>git commit</code> 来完成合并提交。 默认情况下提交信息看起来像下面这个样子:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">Merge branch 'iss53' Conflicts: index.html # # It looks like you may be committing a merge. # If this is not correct, please remove the file # .git/MERGE_HEAD # and try again. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # All conflicts fixed but you are still merging. # # Changes to be committed: # modified: index.html #</code></pre> </div> </div> <div class="paragraph"> <p>如果你觉得上述的信息不够充分,不能完全体现分支合并的过程,你可以修改上述信息, 添加一些细节给未来检视这个合并的读者一些帮助,告诉他们你是如何解决合并冲突的,以及理由是什么。</p> </div> </div> <div id="nav"><a href="/book/zh/v2/Git-分支-分支简介">prev</a> | <a href="/book/zh/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