2018_10_22_02.html 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <!DOCTYPE html>
  2. <html lang="en-US">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <title>git~F.A.Q | 看白鹿的博客</title>
  7. <meta name="description" content="只有敢于尝试,才能品味人生.">
  8. <link rel="icon" href="/logo.png">
  9. <link rel="preload" href="/assets/css/0.styles.828f45ec.css" as="style"><link rel="preload" href="/assets/js/app.268f9f67.js" as="script"><link rel="preload" href="/assets/js/3.515b53d6.js" as="script"><link rel="preload" href="/assets/js/76.539f7625.js" as="script"><link rel="prefetch" href="/assets/js/10.dee33bc4.js"><link rel="prefetch" href="/assets/js/100.d2a60c39.js"><link rel="prefetch" href="/assets/js/101.74595f21.js"><link rel="prefetch" href="/assets/js/102.29b3d306.js"><link rel="prefetch" href="/assets/js/103.f271300d.js"><link rel="prefetch" href="/assets/js/104.43072e25.js"><link rel="prefetch" href="/assets/js/105.e14b9594.js"><link rel="prefetch" href="/assets/js/106.48e873e9.js"><link rel="prefetch" href="/assets/js/107.706275ab.js"><link rel="prefetch" href="/assets/js/108.e8e54758.js"><link rel="prefetch" href="/assets/js/109.b9ff54ab.js"><link rel="prefetch" href="/assets/js/11.5876b1fb.js"><link rel="prefetch" href="/assets/js/110.393bd110.js"><link rel="prefetch" href="/assets/js/111.ec6c71ae.js"><link rel="prefetch" href="/assets/js/112.607561e0.js"><link rel="prefetch" href="/assets/js/113.9eced018.js"><link rel="prefetch" href="/assets/js/114.5674d7c9.js"><link rel="prefetch" href="/assets/js/115.de57148c.js"><link rel="prefetch" href="/assets/js/116.6a5c1f56.js"><link rel="prefetch" href="/assets/js/117.f6a71ed6.js"><link rel="prefetch" href="/assets/js/118.a1e7c870.js"><link rel="prefetch" href="/assets/js/119.b1f0371f.js"><link rel="prefetch" href="/assets/js/12.e8431088.js"><link rel="prefetch" href="/assets/js/120.8106c4ab.js"><link rel="prefetch" href="/assets/js/121.92de7c46.js"><link rel="prefetch" href="/assets/js/13.398dd7db.js"><link rel="prefetch" href="/assets/js/14.90bfbf87.js"><link rel="prefetch" href="/assets/js/15.f69596d7.js"><link rel="prefetch" href="/assets/js/16.3608be61.js"><link rel="prefetch" href="/assets/js/17.7820a766.js"><link rel="prefetch" href="/assets/js/18.8f99a19b.js"><link rel="prefetch" href="/assets/js/19.45176d0e.js"><link rel="prefetch" href="/assets/js/20.232982ac.js"><link rel="prefetch" href="/assets/js/21.1a51c65e.js"><link rel="prefetch" href="/assets/js/22.883de588.js"><link rel="prefetch" href="/assets/js/23.c9414590.js"><link rel="prefetch" href="/assets/js/24.6e67591d.js"><link rel="prefetch" href="/assets/js/25.6747357b.js"><link rel="prefetch" href="/assets/js/26.12c8e8e3.js"><link rel="prefetch" href="/assets/js/27.0783adaa.js"><link rel="prefetch" href="/assets/js/28.7a6ffcb0.js"><link rel="prefetch" href="/assets/js/29.08970e3a.js"><link rel="prefetch" href="/assets/js/30.abb98459.js"><link rel="prefetch" href="/assets/js/31.b8c17c43.js"><link rel="prefetch" href="/assets/js/32.5fe22297.js"><link rel="prefetch" href="/assets/js/33.b802736a.js"><link rel="prefetch" href="/assets/js/34.9893ce1f.js"><link rel="prefetch" href="/assets/js/35.c3a8a6fb.js"><link rel="prefetch" href="/assets/js/36.3bb4a7b9.js"><link rel="prefetch" href="/assets/js/37.f2ad4731.js"><link rel="prefetch" href="/assets/js/38.95bb1c88.js"><link rel="prefetch" href="/assets/js/39.2b5f646d.js"><link rel="prefetch" href="/assets/js/4.389f8161.js"><link rel="prefetch" href="/assets/js/40.42d10f93.js"><link rel="prefetch" href="/assets/js/41.5e607831.js"><link rel="prefetch" href="/assets/js/42.9a147000.js"><link rel="prefetch" href="/assets/js/43.3a493ecc.js"><link rel="prefetch" href="/assets/js/44.68dd983e.js"><link rel="prefetch" href="/assets/js/45.0eb19dd6.js"><link rel="prefetch" href="/assets/js/46.2bc4b680.js"><link rel="prefetch" href="/assets/js/47.3de0e22f.js"><link rel="prefetch" href="/assets/js/48.2aa9b621.js"><link rel="prefetch" href="/assets/js/49.4e0c7e81.js"><link rel="prefetch" href="/assets/js/5.d4651190.js"><link rel="prefetch" href="/assets/js/50.f9790d5d.js"><link rel="prefetch" href="/assets/js/51.d03e4d02.js"><link rel="prefetch" href="/assets/js/52.cd6e50d5.js"><link rel="prefetch" href="/assets/js/53.c56ed5e8.js"><link rel="prefetch" href="/assets/js/54.af31649a.js"><link rel="prefetch" href="/assets/js/55.e6c76277.js"><link rel="prefetch" href="/assets/js/56.59b2e0fa.js"><link rel="prefetch" href="/assets/js/57.e75a4f7d.js"><link rel="prefetch" href="/assets/js/58.49abcc13.js"><link rel="prefetch" href="/assets/js/59.62d47fda.js"><link rel="prefetch" href="/assets/js/6.4bfb03ad.js"><link rel="prefetch" href="/assets/js/60.d5bd9a2b.js"><link rel="prefetch" href="/assets/js/61.dc32bd44.js"><link rel="prefetch" href="/assets/js/62.552676dd.js"><link rel="prefetch" href="/assets/js/63.86db7a84.js"><link rel="prefetch" href="/assets/js/64.eb8d2554.js"><link rel="prefetch" href="/assets/js/65.405a53d2.js"><link rel="prefetch" href="/assets/js/66.2e2127ea.js"><link rel="prefetch" href="/assets/js/67.7958d7aa.js"><link rel="prefetch" href="/assets/js/68.5bb76a01.js"><link rel="prefetch" href="/assets/js/69.be77e031.js"><link rel="prefetch" href="/assets/js/7.5373c3ff.js"><link rel="prefetch" href="/assets/js/70.5f8c4d7e.js"><link rel="prefetch" href="/assets/js/71.6b83dc48.js"><link rel="prefetch" href="/assets/js/72.52e71197.js"><link rel="prefetch" href="/assets/js/73.ed29139b.js"><link rel="prefetch" href="/assets/js/74.2da95d6f.js"><link rel="prefetch" href="/assets/js/75.6bdfc674.js"><link rel="prefetch" href="/assets/js/77.bd2b1d1c.js"><link rel="prefetch" href="/assets/js/78.574e43b8.js"><link rel="prefetch" href="/assets/js/79.3f2b6e03.js"><link rel="prefetch" href="/assets/js/8.c12591c5.js"><link rel="prefetch" href="/assets/js/80.343ef6a4.js"><link rel="prefetch" href="/assets/js/81.dbea413c.js"><link rel="prefetch" href="/assets/js/82.72df572c.js"><link rel="prefetch" href="/assets/js/83.8dfa08ec.js"><link rel="prefetch" href="/assets/js/84.faf124d2.js"><link rel="prefetch" href="/assets/js/85.4b9fd62d.js"><link rel="prefetch" href="/assets/js/86.f7796237.js"><link rel="prefetch" href="/assets/js/87.b4b84c5c.js"><link rel="prefetch" href="/assets/js/88.e4e04624.js"><link rel="prefetch" href="/assets/js/89.8e8af2bc.js"><link rel="prefetch" href="/assets/js/9.d366d0b0.js"><link rel="prefetch" href="/assets/js/90.4ef24970.js"><link rel="prefetch" href="/assets/js/91.642c380b.js"><link rel="prefetch" href="/assets/js/92.d31cd825.js"><link rel="prefetch" href="/assets/js/93.61ebd91b.js"><link rel="prefetch" href="/assets/js/94.ce97a94d.js"><link rel="prefetch" href="/assets/js/95.2315c696.js"><link rel="prefetch" href="/assets/js/96.ee1be386.js"><link rel="prefetch" href="/assets/js/97.a4d99f7c.js"><link rel="prefetch" href="/assets/js/98.3470f3b8.js"><link rel="prefetch" href="/assets/js/99.bf865b2a.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.431cfe91.js">
  10. <link rel="stylesheet" href="/assets/css/0.styles.828f45ec.css">
  11. </head>
  12. <body>
  13. <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">看白鹿的博客</span></a> <div class="links"><form id="search-form" role="search" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端" class="dropdown-title"><span class="title">前端</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/CSS/" class="nav-link">CSS</a></li><li class="dropdown-item"><!----> <a href="/FLUTTER/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/GIT/" class="nav-link router-link-active">GIT</a></li><li class="dropdown-item"><!----> <a href="/JavaScript/" class="nav-link">JavaScript</a></li><li class="dropdown-item"><!----> <a href="/REACT/" class="nav-link">react</a></li><li class="dropdown-item"><!----> <a href="/VUE/" class="nav-link">vue</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="后台" class="dropdown-title"><span class="title">后台</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/NODE/" class="nav-link">node</a></li><li class="dropdown-item"><!----> <a href="/UBUNTU/" class="nav-link">ubuntu</a></li><li class="dropdown-item"><!----> <a href="/ffmpeg/" class="nav-link">ffmpeg</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其他" class="dropdown-title"><span class="title">其他</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/IDE/" class="nav-link">IDE</a></li><li class="dropdown-item"><!----> <a href="/About/WHY.html" class="nav-link">待了解</a></li><li class="dropdown-item"><!----> <a href="/INTERVIEW/" class="nav-link">面试</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/Johnhong9527" target="_blank" rel="noopener noreferrer" class="nav-link external">
  14. GitHub
  15. <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端" class="dropdown-title"><span class="title">前端</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/CSS/" class="nav-link">CSS</a></li><li class="dropdown-item"><!----> <a href="/FLUTTER/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/GIT/" class="nav-link router-link-active">GIT</a></li><li class="dropdown-item"><!----> <a href="/JavaScript/" class="nav-link">JavaScript</a></li><li class="dropdown-item"><!----> <a href="/REACT/" class="nav-link">react</a></li><li class="dropdown-item"><!----> <a href="/VUE/" class="nav-link">vue</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="后台" class="dropdown-title"><span class="title">后台</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/NODE/" class="nav-link">node</a></li><li class="dropdown-item"><!----> <a href="/UBUNTU/" class="nav-link">ubuntu</a></li><li class="dropdown-item"><!----> <a href="/ffmpeg/" class="nav-link">ffmpeg</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其他" class="dropdown-title"><span class="title">其他</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/IDE/" class="nav-link">IDE</a></li><li class="dropdown-item"><!----> <a href="/About/WHY.html" class="nav-link">待了解</a></li><li class="dropdown-item"><!----> <a href="/INTERVIEW/" class="nav-link">面试</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/Johnhong9527" target="_blank" rel="noopener noreferrer" class="nav-link external">
  16. GitHub
  17. <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav> <ul class="sidebar-links"><li><a href="/GIT/" class="sidebar-link">git目录</a></li><li><a href="/GIT/2018_10_22_01.html" class="sidebar-link">git命令</a></li><li><a href="/GIT/2018_10_22_02.html" class="active sidebar-link">git~F.A.Q</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#b-回滚最近一次commit" class="sidebar-link">B) 回滚最近一次commit</a></li><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#c-回滚最近几次commit,并把这几次commit放到叫做topic的branch上去。" class="sidebar-link">C) 回滚最近几次commit,并把这几次commit放到叫做topic的branch上去。</a></li><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#d-永久删除最后几个commit" class="sidebar-link">D) 永久删除最后几个commit</a></li><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#e-回滚merge和pull操作" class="sidebar-link">E) 回滚merge和pull操作</a></li><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#f-在被污染的working-tree中回滚merge或者pull" class="sidebar-link">F) 在被污染的working tree中回滚merge或者pull</a></li><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#g-被中断的工作流程" class="sidebar-link">G) 被中断的工作流程</a></li><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#h-reset单独的一个文件" class="sidebar-link">(H) Reset单独的一个文件</a></li><li class="sidebar-sub-header"><a href="/GIT/2018_10_22_02.html#i-保留working-tree并丢弃一些之前的commit" class="sidebar-link">(I) 保留working tree并丢弃一些之前的commit</a></li></ul></li><li><a href="/GIT/2018_10_31_01.html" class="sidebar-link">git commit 提交规范</a></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="git-f-a-q"><a href="#git-f-a-q" class="header-anchor">#</a> git~F.A.Q</h1> <p>在git的一般使用中,如果发现错误的将不想提交的文件add进入index之后,想回退取消,则可以使用命令:<code>git reset HEAD &lt;file&gt;...</code>,同时git add完毕之后,git也会做相应的提示,比如:
  18. 引用</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># Changes to be committed:</span>
  19. <span class="token comment"># (use &quot;git reset HEAD&lt;file&gt;...&quot; to unstage)</span>
  20. <span class="token comment">#</span>
  21. <span class="token comment"># new file: Test.scala</span>
  22. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p><code>git reset [--hard|soft|mixed|merge|keep] [&lt;commit&gt;或HEAD]</code>:将当前的分支重设(reset)到指定的<code>&lt;commit&gt;</code>或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index和working directory。
  23. 下面列出一些git reset的典型的应用场景:
  24. A) 回滚add操纵</p> <p>引用</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># 编辑文件frotz.c, filfre.c,做了些更改,并把更改添加到了index</span>
  25. edit
  26. <span class="token function">git</span> <span class="token function">add</span> frotz.c filfre.c
  27. <span class="token comment"># 查看邮件,发现某人要你pull,有一些改变需要你merge下来</span>
  28. mailx
  29. <span class="token comment"># 然而,你已经把index搞乱了,因为index同HEAD commit不匹配了,</span>
  30. <span class="token comment"># 但是你知道,即将pull的东西不会影响已经修改的frotz.c和filfre.c,</span>
  31. <span class="token comment"># 因此你可以revert这两个文件的改变。revert后,</span>
  32. <span class="token comment"># 那些改变应该依旧在working directory中,因此执行git reset。</span>
  33. <span class="token function">git</span> reset
  34. <span class="token comment"># 然后,执行了pull之后,自动merge,</span>
  35. <span class="token comment"># frotz.c和filfre.c这些改变依然在working directory中。</span>
  36. $ <span class="token function">git</span> pull git://info.example.com/ nitfol <span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span>
  37. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h2 id="b-回滚最近一次commit"><a href="#b-回滚最近一次commit" class="header-anchor">#</a> B) 回滚最近一次commit</h2> <p>引用</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token function">git</span> commit <span class="token punctuation">..</span>.
  38. <span class="token comment"># 当提交了之后,你又发现代码没有提交完整,</span>
  39. <span class="token comment"># 或者你想重新编辑一下提交的comment,</span>
  40. <span class="token comment"># 执行git reset --soft HEAD^,</span>
  41. <span class="token comment"># 让working tree还跟reset之前一样,不作任何改变。</span>
  42. <span class="token comment"># HEAD^指向HEAD之前最近的一次commit。</span>
  43. <span class="token function">git</span> reset --soft HEAD^
  44. <span class="token comment"># 对working tree下的文件做修改</span>
  45. edit
  46. <span class="token comment"># 然后使用reset之前那次commit的注释、作者、日期等信息重新提交。</span>
  47. <span class="token comment"># 注意,当执行git reset命令时,git会把老的HEAD拷贝到文件.git/ORIG_HEAD中,</span>
  48. <span class="token comment"># 在命令中可以使用ORIG_HEAD引用这个commit。</span>
  49. <span class="token comment"># commit 命令中 -a 参数的意思是告诉git,</span>
  50. <span class="token comment"># 自动把所有修改的和删除的文件都放进stage area,未被git跟踪的新建的文件不受影响。</span>
  51. <span class="token comment"># commit命令中-c &lt;commit&gt; 或者 -C &lt;commit&gt;意思是拿</span>
  52. <span class="token comment"># 已经提交的commit对象中的信息(作者,提交者,注释,时间戳等)提交,</span>
  53. <span class="token comment"># 那么这条commit命令的意思就非常清晰了,把所有更改的文件加入stage area,</span>
  54. <span class="token comment"># 并使用上次的提交信息重新提交。</span>
  55. <span class="token function">git</span> commit -a -c ORIG_HEAD
  56. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br></div></div><h2 id="c-回滚最近几次commit,并把这几次commit放到叫做topic的branch上去。"><a href="#c-回滚最近几次commit,并把这几次commit放到叫做topic的branch上去。" class="header-anchor">#</a> C) 回滚最近几次commit,并把这几次commit放到叫做topic的branch上去。</h2> <p>引用</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># 你已经提交了一些commit,但是此时发现这些commit还不够成熟,</span>
  57. <span class="token comment"># 不能进入master分支,但你希望在新的branch上润色这些commit改动。</span>
  58. <span class="token comment"># 因此执行了git branch命令在当前的HEAD上建立了新的叫做 topic/wip的分支。</span>
  59. <span class="token function">git</span> branch topic/wip
  60. <span class="token comment"># 然后回滚master branch上的最近三次提交。</span>
  61. <span class="token comment"># HEAD~3指向当前HEAD-3个commit的commit,</span>
  62. <span class="token comment"># git reset --hard HEAD~3即删除最近的三个commit</span>
  63. <span class="token comment">#(删除HEAD, HEAD^, HEAD~2),将HEAD指向HEAD~3。</span>
  64. <span class="token function">git</span> reset --hard HEAD~3
  65. <span class="token comment"># 切换到`topic/wip` 分支</span>
  66. $ <span class="token function">git</span> checkout topic/wip
  67. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h2 id="d-永久删除最后几个commit"><a href="#d-永久删除最后几个commit" class="header-anchor">#</a> D) 永久删除最后几个commit</h2> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token function">git</span> commit <span class="token punctuation">..</span>.
  68. <span class="token comment"># 最后三个commit(即HEAD, HEAD^和HEAD~2)提交有问题,你想永久删除这三个commit。</span>
  69. <span class="token function">git</span> reset --hard HEAD~3 <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
  70. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h2 id="e-回滚merge和pull操作"><a href="#e-回滚merge和pull操作" class="header-anchor">#</a> E) 回滚merge和pull操作</h2> <p>引用</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># 从origin拉下来一些更新,但是产生了很多冲突,</span>
  71. <span class="token comment"># 你暂时没有这么多时间去解决这些冲突,因此你决定稍候有空的时候再重新pull。</span>
  72. $ <span class="token function">git</span> pull
  73. Auto-merging nitfol
  74. CONFLICT <span class="token punctuation">(</span>content<span class="token punctuation">)</span>: Merge conflict innitfol
  75. Automatic merge failed<span class="token punctuation">;</span> fix conflicts andthen commit the result.
  76. <span class="token comment"># 由于pull操作产生了冲突,因此所有pull下来的改变尚未提交,</span>
  77. <span class="token comment"># 仍然再stage area中,</span>
  78. <span class="token comment"># 这种情况下git reset --hard与 git reset --hard HEAD意思相同,</span>
  79. <span class="token comment"># 即都是清除index和working tree中被搞乱的东西。</span>
  80. $ <span class="token function">git</span> reset --hard
  81. <span class="token comment"># 将topic/branch合并到当前的branch,这次没有产生冲突,并且合并后的更改自动提交。</span>
  82. $ <span class="token function">git</span> pull <span class="token builtin class-name">.</span> topic/branch
  83. Updating from <span class="token number">41223</span><span class="token punctuation">..</span>. to <span class="token number">13134</span><span class="token punctuation">..</span>.
  84. Fast-forward
  85. <span class="token comment"># 但是此时你又发现将topic/branch合并过来为时尚早,</span>
  86. <span class="token comment"># 因此决定退滚merge,执行git reset --hard ORIG_HEAD回滚刚才的pull/merge操作。</span>
  87. <span class="token comment"># 说明:前面讲过,执行git reset时,</span>
  88. <span class="token comment"># git会把reset之前的HEAD放入.git/ORIG_HEAD文件中,</span>
  89. <span class="token comment"># 命令行中使用ORIG_HEAD引用这个commit。</span>
  90. <span class="token comment"># 同样的,执行pull和merge操作时,</span>
  91. <span class="token comment"># git都会把执行操作前的HEAD放入ORIG_HEAD中,以防回滚操作。</span>
  92. $ <span class="token function">git</span> reset --hard ORIG_HEAD
  93. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br></div></div><h2 id="f-在被污染的working-tree中回滚merge或者pull"><a href="#f-在被污染的working-tree中回滚merge或者pull" class="header-anchor">#</a> F) 在被污染的working tree中回滚merge或者pull</h2> <p>引用</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># 即便你已经在本地更改了一些你的working tree,</span>
  94. <span class="token comment"># 你也可安全的git pull,</span>
  95. <span class="token comment"># 前提是你知道将要pull的内容不会覆盖你的working tree中的内容。</span>
  96. $ <span class="token function">git</span> pull
  97. Auto-merging nitfol
  98. Merge made by recursive.
  99. nitfol <span class="token operator">|</span> <span class="token number">20</span> +++++----
  100. <span class="token punctuation">..</span>.
  101. <span class="token comment"># git pull完后,你发现这次pull下来的修改不满意,</span>
  102. <span class="token comment"># 想要回滚到pull之前的状态,从前面的介绍知道,</span>
  103. <span class="token comment"># 我们可以执行git reset --hard ORIG_HEAD,</span>
  104. <span class="token comment"># 但是这个命令有个副作用就是清空你的working tree,</span>
  105. <span class="token comment"># 即丢弃你的本地未add的那些改变。为了避免丢弃working tree中的内容,</span>
  106. <span class="token comment"># 可以使用git reset --merge ORIG_HEAD,</span>
  107. <span class="token comment"># 注意其中的--hard 换成了--merge,</span>
  108. <span class="token comment"># 这样就可以避免在回滚时清除working tree。</span>
  109. $ <span class="token function">git</span> reset --merge ORIG_HEAD <span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>
  110. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><h2 id="g-被中断的工作流程"><a href="#g-被中断的工作流程" class="header-anchor">#</a> G) 被中断的工作流程</h2> <p>在实际开发中经常出现这样的情形:你正在开发一个大的feature,此时来了一个紧急的bug需要修复,但是目前在working tree中的内容还没有成型,还不足以commit,但是你又必须切换的另外的branch去fix bug。请看下面的例子</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>$ <span class="token function">git</span> checkout feature <span class="token punctuation">;</span><span class="token comment"># you were workingin &quot;feature&quot; branch and</span>
  111. $ work work work <span class="token punctuation">;</span><span class="token comment">#got interrupted</span>
  112. <span class="token comment"># 这次属于临时提交,因此随便添加一个临时注释即可。</span>
  113. $ <span class="token function">git</span> commit -a -m <span class="token string">&quot;snapshot WIP&quot;</span>
  114. $ <span class="token function">git</span> checkout master
  115. $ fix fix fix
  116. $ <span class="token function">git</span> commit <span class="token punctuation">;</span><span class="token comment"># commit with real log</span>
  117. $ <span class="token function">git</span> checkout feature
  118. <span class="token comment"># 这次reset删除了WIP commit,并且把working tree设置成提交WIP快照之前的状态。</span>
  119. $ <span class="token function">git</span> reset --soft HEAD^ <span class="token punctuation">;</span><span class="token comment"># go back to WIPstate</span>
  120. <span class="token comment"># 此时,在index中依然遗留着“snapshot WIP”提交时所做的uncommit changes,</span>
  121. <span class="token comment"># git reset将会清理index成为尚未提交&quot;snapshot WIP&quot;时的状态便于接下来继续工作。</span>
  122. $ <span class="token function">git</span> reset
  123. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h2 id="h-reset单独的一个文件"><a href="#h-reset单独的一个文件" class="header-anchor">#</a> (H) Reset单独的一个文件</h2> <p>假设你已经添加了一个文件进入index,但是而后又不打算把这个文件提交,此时可以使用git reset把这个文件从index中去除。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># 把文件frotz.c从index中去除,</span>
  124. $ <span class="token function">git</span> reset -- frotz.c
  125. <span class="token comment"># 把index中的文件提交</span>
  126. $ <span class="token function">git</span> commit -m <span class="token string">&quot;Commit files inindex&quot;</span>
  127. <span class="token comment"># 再次把frotz.c加入index</span>
  128. $ <span class="token function">git</span> <span class="token function">add</span> frotz.c
  129. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h2 id="i-保留working-tree并丢弃一些之前的commit"><a href="#i-保留working-tree并丢弃一些之前的commit" class="header-anchor">#</a> (I) 保留working tree并丢弃一些之前的commit</h2> <p>假设你正在编辑一些文件,并且已经提交,接着继续工作,但是现在你发现当前在working tree中的内容应该属于另一个branch,与这之前的commit没有什么关系。此时,你可以开启一个新的branch,并且保留着working tree中的内容。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token function">git</span> tag start
  130. <span class="token function">git</span> checkout -b branch1
  131. edit
  132. <span class="token comment"># 这次是把在branch1中的改变提交了。</span>
  133. <span class="token function">git</span> commit <span class="token punctuation">..</span>.
  134. edit
  135. <span class="token comment"># 此时发现,之前的提交不属于这个branch,此时你新建了branch2,并切换到了branch2上。</span>
  136. <span class="token function">git</span> checkout -b branch2
  137. <span class="token comment"># 此时你可以用reset --keep把在start之后的commit清除掉,但是保持working tree不变。</span>
  138. <span class="token function">git</span> reset --keep start
  139. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">Last Updated:</span> <span class="time">10/30/2018, 1:06:23 PM</span></div></footer> <div class="page-nav"><p class="inner"><span class="prev">
  140. <a href="/GIT/2018_10_22_01.html" class="prev">git命令</a></span> <span class="next"><a href="/GIT/2018_10_31_01.html">git commit 提交规范</a>
  141. </span></p></div> </main></div><div class="global-ui"></div></div>
  142. <script src="/assets/js/app.268f9f67.js" defer></script><script src="/assets/js/3.515b53d6.js" defer></script><script src="/assets/js/76.539f7625.js" defer></script>
  143. </body>
  144. </html>