-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathatom.xml
More file actions
478 lines (278 loc) · 456 KB
/
atom.xml
File metadata and controls
478 lines (278 loc) · 456 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Jerry's Blog - 碎碎念</title>
<subtitle>我想就这样牵着 你的手不放开</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://blog.myoss.app/"/>
<updated>2019-12-05T09:31:05.106Z</updated>
<id>https://blog.myoss.app/</id>
<author>
<name>Jerry</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Mac开发环境搭建-v2</title>
<link href="https://blog.myoss.app/2018/Mac%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA-v2/"/>
<id>https://blog.myoss.app/2018/Mac开发环境搭建-v2/</id>
<published>2018-07-28T17:33:00.000Z</published>
<updated>2019-12-05T09:31:05.106Z</updated>
<content type="html"><![CDATA[<h1 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h1><p>电脑不幸中招 <code>键盘事件</code>,已经换了一台了,苹果这质量是每况愈下啊,哎哎哎。这是第二次重装软件了,所以积累了不少经验。<br>将会从以下方面进行介绍,所有的软件安装,请按照顺序来操作,有些是有依赖关系的。</p><ul><li>系统设置</li><li>常用软件</li><li>Node开发配置</li><li>Java开发配置</li></ul><a id="more"></a><h1 id="系统设置"><a href="#系统设置" class="headerlink" title="系统设置"></a>系统设置</h1><h2 id="开启Mac三指拖拽的手势"><a href="#开启Mac三指拖拽的手势" class="headerlink" title="开启Mac三指拖拽的手势"></a>开启Mac三指拖拽的手势</h2><p>使用三指拖动文件、窗口等,非常好用的功能,<code>macOS</code>系统中默认关闭了这个功能,参考百度经验的设置方法:<a href="http://jingyan.baidu.com/article/0bc808fc5bceb21bd485b98e.html" target="_blank" rel="noopener">点击跳转</a></p><h1 id="常用软件"><a href="#常用软件" class="headerlink" title="常用软件"></a>常用软件</h1><h2 id="安装-Oh-My-ZSH"><a href="#安装-Oh-My-ZSH" class="headerlink" title="安装 Oh My ZSH"></a>安装 Oh My ZSH</h2><p>为什么装这个以及主题设置,网上搜索教程吧,一大把,官方地址:<a href="https://ohmyz.sh" target="_blank" rel="noopener">https://ohmyz.sh</a>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh -c <span class="string">"<span class="variable">$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>"</span></span><br></pre></td></tr></table></figure><h2 id="安装-homebrew-包管理"><a href="#安装-homebrew-包管理" class="headerlink" title="安装 homebrew 包管理"></a>安装 homebrew 包管理</h2><p>有了这个包管理工具之后,以后安装软件会非常方便,谁用谁知道。官方地址:<a href="http://brew.sh" target="_blank" rel="noopener">http://brew.sh</a>,使用下面的命令进行安装,耐心等待一会儿就安装好了。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/bin/ruby -e <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span></span><br></pre></td></tr></table></figure><p>使用<code>brew</code>安装软件,测试安装是否成功</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ brew install wget</span><br><span class="line">Updating Homebrew...</span><br><span class="line"></span><br><span class="line">$ wget</span><br><span class="line">wget: missing URL</span><br><span class="line">Usage: wget [OPTION]... [URL]...</span><br><span class="line"></span><br><span class="line">Try `wget --<span class="built_in">help</span><span class="string">' for more options.</span></span><br></pre></td></tr></table></figure><h2 id="安装-iTerm2-终端"><a href="#安装-iTerm2-终端" class="headerlink" title="安装 iTerm2 终端"></a>安装 iTerm2 终端</h2><p>比系统自带的“终端命令”更好用的软件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew cask install iterm2</span><br></pre></td></tr></table></figure><p>当你已经把 <code>zsh</code>、<code>homebrew</code>和 <code>iTerm2</code> 这三剑客安装完毕,是时候关闭 <code>系统自带的终端</code>,打开刚才安装完成的 <code>iTerm2</code> 骚起来吧。</p><h3 id="使用-expect-实现-SSH-自动登陆"><a href="#使用-expect-实现-SSH-自动登陆" class="headerlink" title="使用 expect 实现 SSH 自动登陆"></a>使用 expect 实现 SSH 自动登陆</h3><p>查看你的系统是否有 <code>expect</code> 命令,如果没有就先安装一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ expect -version</span><br><span class="line">expect version 5.45 # 说明已经安装过了,就不需要再安装了</span><br><span class="line">$</span><br><span class="line">$ brew install expect</span><br></pre></td></tr></table></figure><p><code>expect</code> 登陆脚本如下,找个目录保存下文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim ~/.ssh/iterm2login.sh</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/expect -f</span></span><br><span class="line"><span class="built_in">set</span> port 22</span><br><span class="line"><span class="built_in">set</span> host [lindex <span class="variable">$argv</span> 0]</span><br><span class="line"><span class="built_in">set</span> user [lindex <span class="variable">$argv</span> 1]</span><br><span class="line"><span class="built_in">set</span> password [lindex <span class="variable">$argv</span> 2]</span><br><span class="line"><span class="built_in">set</span> timeout -1</span><br><span class="line"></span><br><span class="line">spawn ssh -o <span class="string">"StrictHostKeyChecking no"</span> -o ServerAliveInterval=10 -p<span class="variable">$port</span> <span class="variable">$user</span>@<span class="variable">$host</span></span><br><span class="line">expect <span class="string">"*assword:*"</span></span><br><span class="line">send <span class="string">"<span class="variable">$password</span>\r"</span></span><br><span class="line">interact</span><br><span class="line">expect eof</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x ~/.ssh/iterm2login.sh</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="comment"># iterm2login.sh 主机地址 端口号 用户 密码</span></span><br><span class="line">$ sh iterm2login.sh 10.11.0.2 22 admin paswword</span><br></pre></td></tr></table></figure><p><code>iTerm2</code> 打开菜单 <code>Profiles</code> -> <code>Open Profiles...</code> -> <code>Edit Profiles...</code></p><p><img src="../../static/images/Mac开发环境搭建-v2/2018-07-29_12-26-41_iterm2_expect_config.png"></p><h2 id="安装-Alfred"><a href="#安装-Alfred" class="headerlink" title="安装 Alfred"></a>安装 Alfred</h2><p><code>alfred</code> 上手教程</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">http://www.jianshu.com/p/e9f3352c785f</span><br><span class="line">https://sspai.com/post/32979</span><br><span class="line">http://www.jianshu.com/p/0e78168da7ab</span><br><span class="line">https://sspai.com/post/32680</span><br></pre></td></tr></table></figure><h3 id="安装七牛云图床工具"><a href="#安装七牛云图床工具" class="headerlink" title="安装七牛云图床工具"></a>安装七牛云图床工具</h3><p>用于博客图床上传工具</p><p>七牛云<code>workflow</code>地址:<a href="https://github.com/onestark/alfred-workflow-qshell" target="_blank" rel="noopener">https://github.com/onestark/alfred-workflow-qshell</a></p><p>七牛云<code>qshell</code>地址:<a href="https://developer.qiniu.com/kodo/tools/1302/qshell" target="_blank" rel="noopener">https://developer.qiniu.com/kodo/tools/1302/qshell</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ wget http://devtools.qiniu.com/qshell-v2.1.8.zip</span><br><span class="line">$ unzip qshell-v2.1.8.zip</span><br><span class="line">$ cd qshell-v2.1.8</span><br><span class="line">$ mv qshell-darwin-x64 /usr/local/bin/qshell</span><br><span class="line">$ # 安装完成之后,新打开一个命令窗口</span><br><span class="line">$ qshell account [七牛账户下的AccessKey] [七牛账户下的SecretKey] # 密钥设置</span><br></pre></td></tr></table></figure><h2 id="安装-1Password"><a href="#安装-1Password" class="headerlink" title="安装 1Password"></a>安装 1Password</h2><p>日常密码管理工具</p><h2 id="安装-SizeUp"><a href="#安装-SizeUp" class="headerlink" title="安装 SizeUp"></a>安装 SizeUp</h2><p>日常窗口管理工具</p><h2 id="安装-Snipaste-截图工具"><a href="#安装-Snipaste-截图工具" class="headerlink" title="安装 Snipaste 截图工具"></a>安装 Snipaste 截图工具</h2><p>日常截图工具,替换系统自带的截图,功能强大,不依赖 <code>qq</code>、<code>微信</code> 的截图,官网地址:<a href="https://zh.snipaste.com" target="_blank" rel="noopener">https://zh.snipaste.com</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew cask install snipaste</span><br></pre></td></tr></table></figure><h2 id="安装-BetterTouchTool"><a href="#安装-BetterTouchTool" class="headerlink" title="安装 BetterTouchTool"></a>安装 BetterTouchTool</h2><p>强大的手势自定义工具,上手教程,参考网友的介绍文章</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://www.jianshu.com/p/ba8d766559ca</span><br></pre></td></tr></table></figure><p>个人日常使用最多的功能,就是使用 <code>三指选中文本内容进行搜索</code>,我是这么配置的,设置中打开 <code>Trackpads</code>,安装下面的 <code>2</code> 个步骤,新增多个同样的手势</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">"Touchpad Gesture" 设置为 "3 Finger Click" 手势</span><br><span class="line">"Predefined Action" 设置为 "Open URL/Open URL With Selection",填入你想要使用的搜索引擎地址</span><br></pre></td></tr></table></figure><p><img src="../../static/images/Mac开发环境搭建-v2/2018-07-29_13-13-39_touchtoobar.png"></p><h2 id="安装-HyperDock"><a href="#安装-HyperDock" class="headerlink" title="安装 HyperDock"></a>安装 HyperDock</h2><p>扩展 <code>Dock</code> 拦功能,安装完成之后,需要注销/重启系统。将鼠标放在 <code>Dock</code> 拦的应用程序上面,就可以进行快速预览,并且能通过数字键 <code>1~9</code> 进行快速移动到对应的桌面中,非常的方便</p><p><img src="../../static/images/Mac开发环境搭建-v2/2018-07-29_13-17-38_hyperdock.png"></p><h2 id="安装图形软件"><a href="#安装图形软件" class="headerlink" title="安装图形软件"></a>安装图形软件</h2><p>罗列一些常用的软件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install google-chrome # 安装 Google 浏览器</span><br><span class="line">$ brew cask install shadowsocksx-ng # 科学上网客户端</span><br><span class="line">$ brew cask install aria2gui # aria2下载软件客户端</span><br><span class="line">$ brew cask install mysqlworkbench # mysql workbench</span><br><span class="line">$ brew cask install sourcetree # git免费的客户端</span><br><span class="line">$ brew cask install postman # http请求测试客户端</span><br></pre></td></tr></table></figure><p>安装快速浏览插件,都是使用“空格键”快速查看文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install qlstephen <span class="comment"># 快速查看纯文本文件</span></span><br><span class="line">$ brew cask install qlcolorcode <span class="comment"># 在预览源代码文件,高亮代码</span></span><br><span class="line">$ brew cask install qlmarkdown <span class="comment"># 预览 Markdown 文件</span></span><br><span class="line">$ brew cask install quicklook-json <span class="comment"># 预览 JSON 文件</span></span><br><span class="line">$ brew cask install quicklook-csv <span class="comment"># 预览 CSV 文件</span></span><br></pre></td></tr></table></figure><h1 id="Node开发"><a href="#Node开发" class="headerlink" title="Node开发"></a>Node开发</h1><h2 id="推荐使用-n-管理-node-版本"><a href="#推荐使用-n-管理-node-版本" class="headerlink" title="推荐使用 n 管理 node 版本"></a>推荐使用 n 管理 node 版本</h2><p>不会遇到 <code>安装nvm之后</code> 导致终端启动慢的问题</p><ul><li><a href="https://github.com/tj/n" target="_blank" rel="noopener">https://github.com/tj/n</a></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line">$ brew install n</span><br><span class="line">==> Downloading https://homebrew.bintray.com/bottles/n-6.1.3.catalina.bottle.tar.gz</span><br><span class="line"><span class="comment">######################################################################## 100.0%</span></span><br><span class="line">==> Pouring n-6.1.3.catalina.bottle.tar.gz</span><br><span class="line">🍺 /usr/<span class="built_in">local</span>/Cellar/n/6.1.3: 6 files, 52.8KB</span><br><span class="line">$ n ls</span><br><span class="line">find: /usr/<span class="built_in">local</span>/n/versions: No such file or directory</span><br><span class="line">$ n ls-remote</span><br><span class="line">Listing remote... Displaying 20 matches (use --all to see all).</span><br><span class="line">13.3.0</span><br><span class="line">13.2.0</span><br><span class="line">13.1.0</span><br><span class="line">13.0.1</span><br><span class="line">13.0.0</span><br><span class="line">12.13.1</span><br><span class="line">12.13.0</span><br><span class="line">12.12.0</span><br><span class="line">12.11.1</span><br><span class="line">12.11.0</span><br><span class="line">12.10.0</span><br><span class="line">12.9.1</span><br><span class="line">12.9.0</span><br><span class="line">12.8.1</span><br><span class="line">12.8.0</span><br><span class="line">12.7.0</span><br><span class="line">12.6.0</span><br><span class="line">12.5.0</span><br><span class="line">12.4.0</span><br><span class="line">12.3.1</span><br><span class="line">$ n ls</span><br><span class="line">find: /usr/<span class="built_in">local</span>/n/versions: No such file or directory</span><br><span class="line">$ n 8.10</span><br><span class="line"></span><br><span class="line"> installing : node-v8.10.0</span><br><span class="line"> mkdir : /usr/<span class="built_in">local</span>/n/versions/node/8.10.0</span><br><span class="line">mkdir: /usr/<span class="built_in">local</span>/n/versions/node/8.10.0: Permission denied</span><br><span class="line"></span><br><span class="line"> Error: sudo required (or change ownership, or define N_PREFIX)</span><br><span class="line"></span><br><span class="line">$ <span class="built_in">which</span> n</span><br><span class="line">/usr/<span class="built_in">local</span>/bin/n</span><br><span class="line">$ mkdir /usr/<span class="built_in">local</span>/n</span><br><span class="line">mkdir: /usr/<span class="built_in">local</span>/n: Permission denied</span><br><span class="line">$ sudo mkdir /usr/<span class="built_in">local</span>/n</span><br><span class="line">$ sudo chown -R $(whoami) /usr/<span class="built_in">local</span>/n</span><br><span class="line">$ n 8.10</span><br><span class="line"></span><br><span class="line"> installing : node-v8.10.0</span><br><span class="line"> mkdir : /usr/<span class="built_in">local</span>/n/versions/node/8.10.0</span><br><span class="line"> fetch : https://nodejs.org/dist/v8.10.0/node-v8.10.0-darwin-x64.tar.gz</span><br><span class="line"> installed : v8.10.0 (with npm 5.6.0)</span><br><span class="line"></span><br><span class="line">$ n ls</span><br><span class="line">node/8.10.0</span><br><span class="line">$ node -v</span><br><span class="line">v8.10.0</span><br><span class="line">$ npm -v</span><br><span class="line">5.6.0</span><br></pre></td></tr></table></figure><h2 id="使用-nvm-管理-node-版本"><a href="#使用-nvm-管理-node-版本" class="headerlink" title="使用 nvm 管理 node 版本"></a>使用 nvm 管理 node 版本</h2><p>下载源代码到 <code>zsh</code> 插件目录。为什么要用这种方式?你有没有遇到过安装完<code>nvm</code>之后就遇到了终端启动慢的问题,要等2~3秒钟的时间,就是因为<code>$NVM_DIR/nvm.sh</code> 导致的,网友遇到到同样的问题,<a href="http://imushan.com/2016/07/29/js/tools/%E8%A7%A3%E5%86%B3nvm%E5%AF%BC%E8%87%B4%E7%BB%88%E7%AB%AF%E5%90%AF%E5%8A%A8%E6%85%A2%E7%9A%84%E9%97%AE%E9%A2%98/" target="_blank" rel="noopener">请移步查看</a>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> git@github.com:lukechilds/zsh-nvm.git ~/.oh-my-zsh/custom/plugins/zsh-nvm</span><br></pre></td></tr></table></figure><p>在 <code>vim ~/.zshrc</code> 中启用 <code>zsh-nvm</code> 插件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">plugins=(</span><br><span class="line"> zsh-nvm</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>在 <code>vim ~/.zshrc</code> 首行中启用 <code>nvm</code> 的延时加载,加快终端打开的速度</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export NVM_LAZY_LOAD=true</span><br></pre></td></tr></table></figure><p><code>nvm</code> 使用方法</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ nvm ls-remote <span class="comment">#查看官网 node 的所有版本</span></span><br><span class="line">$ nvm install 8.10.0 <span class="comment">#指定 node 的版本号进行安装</span></span><br><span class="line">$ nvm ls <span class="comment">#查看已经安装的 node 版本</span></span><br><span class="line">$ nvm use xxx <span class="comment">#使用指定版本的 node</span></span><br><span class="line">$ node -v</span><br><span class="line">$ npm -v</span><br></pre></td></tr></table></figure><h2 id="npm-常用命令"><a href="#npm-常用命令" class="headerlink" title="npm 常用命令"></a>npm 常用命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ npm list -g --depth 0 <span class="comment">#查看全局安装过的包命令</span></span><br><span class="line">/Users/jerry/.nvm/versions/node/v8.10.0/lib</span><br><span class="line">├── anywhere@1.5.0</span><br><span class="line">├── hexo-cli@1.1.0</span><br><span class="line">├── npm@5.6.0</span><br><span class="line">├── npm-check-updates@2.14.2</span><br><span class="line">└── nrm@1.0.2</span><br><span class="line">$</span><br></pre></td></tr></table></figure><h2 id="npm-常用插件"><a href="#npm-常用插件" class="headerlink" title="npm 常用插件"></a>npm 常用插件</h2><p>列举一些日常必备、使用较多的插件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ npm install -g nrm <span class="comment"># 管理 npm registry</span></span><br><span class="line">$ npm install -g anywhere <span class="comment"># 在任意目录就能启动一个文件浏览服务</span></span><br><span class="line">$ npm install -g npm-check-updates <span class="comment">#使用 ncu -u 更新 package.json 文件并,并保存新的版本号</span></span><br></pre></td></tr></table></figure><h2 id="安装-VS-Code"><a href="#安装-VS-Code" class="headerlink" title="安装 VS Code"></a>安装 VS Code</h2><p>微软出品的图形开发工具,官方网站:<a href="https://code.visualstudio.com" target="_blank" rel="noopener">https://code.visualstudio.com/</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew cask install visual-studio-code</span><br></pre></td></tr></table></figure><h1 id="Java-开发"><a href="#Java-开发" class="headerlink" title="Java 开发"></a>Java 开发</h1><h2 id="安装-Java-SDK"><a href="#安装-Java-SDK" class="headerlink" title="安装 Java SDK"></a>安装 Java SDK</h2><p>通过 <code>brew</code> 安装多个版本的 <code>Java SDK</code>,下面命令演示安装 <code>Java 8</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew cask install java8</span><br></pre></td></tr></table></figure><p>如果需要安装<code>JDK 6/7</code>,可以通过<code>homebrew-cask-versions</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">$ brew tap homebrew/cask-versions</span><br><span class="line"><span class="comment">## 这个可以考虑不安装</span></span><br><span class="line">==> Tapping homebrew/cask-versions</span><br><span class="line">Cloning into <span class="string">'/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask-versions'</span>...</span><br><span class="line">remote: Enumerating objects: 190, <span class="keyword">done</span>.</span><br><span class="line">remote: Counting objects: 100% (190/190), <span class="keyword">done</span>.</span><br><span class="line">remote: Compressing objects: 100% (187/187), <span class="keyword">done</span>.</span><br><span class="line">remote: Total 190 (delta 13), reused 38 (delta 0), pack-reused 0</span><br><span class="line">Receiving objects: 100% (190/190), 82.60 KiB | 209.00 KiB/s, <span class="keyword">done</span>.</span><br><span class="line">Resolving deltas: 100% (13/13), <span class="keyword">done</span>.</span><br><span class="line">Tapped 159 casks (207 files, 322.2KB).</span><br><span class="line"></span><br><span class="line">$ brew tap AdoptOpenJDK/openjdk</span><br><span class="line"><span class="comment">## 使用 OpenJDK</span></span><br><span class="line">==> Tapping adoptopenjdk/openjdk</span><br><span class="line">Cloning into <span class="string">'/usr/local/Homebrew/Library/Taps/adoptopenjdk/homebrew-openjdk'</span>...</span><br><span class="line">remote: Enumerating objects: 40, <span class="keyword">done</span>.</span><br><span class="line">remote: Counting objects: 100% (40/40), <span class="keyword">done</span>.</span><br><span class="line">remote: Compressing objects: 100% (37/37), <span class="keyword">done</span>.</span><br><span class="line">remote: Total 40 (delta 23), reused 6 (delta 0), pack-reused 0</span><br><span class="line">Unpacking objects: 100% (40/40), <span class="keyword">done</span>.</span><br><span class="line">Tapped 26 casks (98 files, 100.6KB).</span><br><span class="line"></span><br><span class="line">$ brew cask install adoptopenjdk8 <span class="comment"># 这个可能会执行失败,因为在多个 tap 组里,那就执行下面这个吧</span></span><br><span class="line">$ brew cask install adoptopenjdk/openjdk/adoptopenjdk8</span><br></pre></td></tr></table></figure><p>搜索其它版本的 <code>Java SDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ brew search openjdk</span><br><span class="line">==> Formulae</span><br><span class="line">openjdk openjdk@11 openjdk@12</span><br><span class="line"></span><br><span class="line">==> Casks</span><br><span class="line">adoptopenjdk adoptopenjdk11-openj9-jre adoptopenjdk12-openj9 adoptopenjdk13-jre adoptopenjdk8 adoptopenjdk8-openj9-jre-large</span><br><span class="line">adoptopenjdk10 adoptopenjdk11-openj9-jre-large adoptopenjdk12-openj9-jre adoptopenjdk13-openj9 adoptopenjdk8 adoptopenjdk8-openj9-large</span><br><span class="line">adoptopenjdk11 adoptopenjdk11-openj9-large adoptopenjdk12-openj9-jre-large adoptopenjdk13-openj9-jre adoptopenjdk8-jre adoptopenjdk9</span><br><span class="line">adoptopenjdk11-jre adoptopenjdk12 adoptopenjdk12-openj9-large adoptopenjdk13-openj9-jre-large adoptopenjdk8-openj9</span><br><span class="line">adoptopenjdk11-openj9 adoptopenjdk12-jre adoptopenjdk13 adoptopenjdk13-openj9-large adoptopenjdk8-openj9-jre</span><br></pre></td></tr></table></figure><p>查看系统安装中安装的所有<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ /usr/libexec/java_home -V</span><br><span class="line">Matching Java Virtual Machines (4):</span><br><span class="line"> 1.8.0_121, x86_64:<span class="string">"Java SE 8"</span>/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home</span><br><span class="line"> 1.7.0_80, x86_64:<span class="string">"Java SE 7"</span>/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home</span><br><span class="line"> 1.6.0_65-b14-468, x86_64:<span class="string">"Java SE 6"</span>/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br><span class="line"> 1.6.0_65-b14-468, i386:<span class="string">"Java SE 6"</span>/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br><span class="line"></span><br><span class="line">/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home</span><br><span class="line"></span><br><span class="line">$ /usr/libexec/java_home -v 1.6</span><br><span class="line">/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br></pre></td></tr></table></figure><h2 id="使用jEnv管理多个Java-SDK版本"><a href="#使用jEnv管理多个Java-SDK版本" class="headerlink" title="使用jEnv管理多个Java SDK版本"></a>使用jEnv管理多个Java SDK版本</h2><p><code>jEnv</code>帮助我们更简单的管理多个<code>JDK</code>:<a href="http://www.jenv.be/" target="_blank" rel="noopener">http://www.jenv.be/</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install jenv</span><br></pre></td></tr></table></figure><p><code>bash</code>中做以下配置,并记得重启终端/重新打开新的选项卡</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">echo</span> <span class="string">'export PATH="$HOME/.jenv/bin:$PATH"'</span> >> ~/.bash_profile</span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">'eval "$(jenv init -)"'</span> >> ~/.bash_profile</span><br></pre></td></tr></table></figure><p><code>Zsh</code>中做以下配置,并记得重启终端/重新打开新的选项卡</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">echo</span> <span class="string">'export PATH="$HOME/.jenv/bin:$PATH"'</span> >> ~/.zshrc</span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">'eval "$(jenv init -)"'</span> >> ~/.zshrc <span class="comment"># 不配置好像没有关系</span></span><br></pre></td></tr></table></figure><p><code>jEnv</code>不能自己安装任何版本的<code>JDK</code>,所以需要我们手动安装好之后再用<code>jEnv add xxx</code>指向它们。<br>第一次添加的时候如果出现下面的错误,后来在 <a href="https://github.com/gcuisinier/jenv/wiki/Trouble-Shooting" target="_blank" rel="noopener">jenv github wiki</a> 中找到解决方案,如果没有出现就忽略。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br><span class="line">ln: /Users/jerry/.jenv/versions/oracle64-1.6.0.65: No such file or directory</span><br><span class="line"></span><br><span class="line"><span class="comment">#解决方案1: 修改 ~/.bash_profile,增加下面的内容</span></span><br><span class="line">$ vi ~/.bash_profile</span><br><span class="line"><span class="comment"># To enable shims and autocompletion add to your profile:</span></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">which</span> jenv > /dev/null; <span class="keyword">then</span> <span class="built_in">eval</span> <span class="string">"<span class="variable">$(jenv init -)</span>"</span>; <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># To use Homebrew's directories rather than ~/.jenv add to your profile:</span></span><br><span class="line"><span class="built_in">export</span> JENV_ROOT=/usr/<span class="built_in">local</span>/opt/jenv</span><br><span class="line"></span><br><span class="line"><span class="comment"># 解决方案2:</span></span><br><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home</span><br><span class="line">ln: /Users/jerry/.jenv/versions/openjdk64-1.8.0.232: No such file or directory</span><br><span class="line">$ mkdir -p .jenv/versions</span><br><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home</span><br><span class="line">openjdk64-1.8.0.232 added</span><br><span class="line">1.8.0.232 added</span><br><span class="line">1.8 added</span><br></pre></td></tr></table></figure><p>添加<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/</span><br><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents//Home/</span><br><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/</span><br></pre></td></tr></table></figure><p>查看所有<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ jenv versions</span><br><span class="line">* system (<span class="built_in">set</span> by /usr/<span class="built_in">local</span>/opt/jenv/version)</span><br><span class="line"> 1.6</span><br><span class="line"> 1.6.0.65</span><br><span class="line"> 1.7</span><br><span class="line"> 1.7.0.80</span><br><span class="line"> 1.8</span><br><span class="line"> 1.8.0.121</span><br><span class="line"> oracle64-1.6.0.65</span><br><span class="line"> oracle64-1.7.0.80</span><br><span class="line"> oracle64-1.8.0.121</span><br></pre></td></tr></table></figure><p>设置全局<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ jenv global 1.8</span><br></pre></td></tr></table></figure><p>设置文件夹的<code>JDK</code>,设置的信息保存在<code>.java-version</code>文件中</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ jenv <span class="built_in">local</span> 1.6</span><br><span class="line">$ cat .java-version</span><br><span class="line">1.6</span><br><span class="line">$ rm -rf .java-version</span><br></pre></td></tr></table></figure><p>设置shell的<code>JDK</code>,似乎只在当前shell窗口生效</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ jenv shell 1.7</span><br></pre></td></tr></table></figure><p>其它用法</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ jenv <span class="built_in">which</span> java</span><br><span class="line">/usr/<span class="built_in">local</span>/opt/jenv/versions/1.7/bin/java</span><br></pre></td></tr></table></figure><h2 id="安装Maven"><a href="#安装Maven" class="headerlink" title="安装Maven"></a>安装Maven</h2><p>官方网址:<a href="https://maven.apache.org" target="_blank" rel="noopener">https://maven.apache.org</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install maven</span><br></pre></td></tr></table></figure><p><code>maven</code>的java版本随<code>jenv</code>切换改变而改变,参考 <a href="https://github.com/gcuisinier/jenv/issues/74" target="_blank" rel="noopener">jenv issue</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ vi ~/.mavenrc</span><br><span class="line">JAVA_HOME=$(/usr/libexec/java_home -v $(jenv version-name))</span><br></pre></td></tr></table></figure><h2 id="安装IntelliJ-Idea"><a href="#安装IntelliJ-Idea" class="headerlink" title="安装IntelliJ Idea"></a>安装IntelliJ Idea</h2><p>官方网站:<a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener">https://www.jetbrains.com/idea/</a>。从 <code>2018.2</code> 版本已经支持 <code>MacBook Pro</code> 的 <code>Touch Bar</code>了,感觉不错。</p>]]></content>
<summary type="html">
<h1 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h1><p>电脑不幸中招 <code>键盘事件</code>,已经换了一台了,苹果这质量是每况愈下啊,哎哎哎。这是第二次重装软件了,所以积累了不少经验。<br>将会从以下方面进行介绍,所有的软件安装,请按照顺序来操作,有些是有依赖关系的。</p>
<ul>
<li>系统设置</li>
<li>常用软件</li>
<li>Node开发配置</li>
<li>Java开发配置</li>
</ul>
</summary>
<category term="Mac" scheme="https://blog.myoss.app/categories/Mac/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>Mac开发环境搭建-v1</title>
<link href="https://blog.myoss.app/2017/Mac%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA-v1/"/>
<id>https://blog.myoss.app/2017/Mac开发环境搭建-v1/</id>
<published>2017-02-12T10:29:00.000Z</published>
<updated>2018-07-29T05:26:04.000Z</updated>
<content type="html"><![CDATA[<p>前言,不知从何时开始向往能在<code>Mac</code>下开发,如今终于实现,感谢老婆大人的支持。废话不多,开始记录从零开始搭建开发环境,主要是<code>Java</code>、<code>node</code>的配置</p><h2 id="开启Mac三指拖拽的手势"><a href="#开启Mac三指拖拽的手势" class="headerlink" title="开启Mac三指拖拽的手势"></a>开启Mac三指拖拽的手势</h2><p>非常好用的功能,<code>macOS</code>系统中默认关闭了这个功能,参考百度经验的设置方法:<a href="http://jingyan.baidu.com/article/0bc808fc5bceb21bd485b98e.html" target="_blank" rel="noopener">点击跳转</a></p><a id="more"></a><h2 id="科学上网"><a href="#科学上网" class="headerlink" title="科学上网"></a>科学上网</h2><p>天朝的程序员此处伤害一万点,都是血泪史啊。</p><p>安装<code>shadowsocks</code>,参考wiki地址方法:<a href="https://github.com/shadowsocks/shadowsocks/wiki" target="_blank" rel="noopener">https://github.com/shadowsocks/shadowsocks/wiki</a>,安装完成之后使用ss账户进行登陆,能打开Google即可,完成第一步。</p><p>安装<code>chrome</code>和<code>SwitchyOmega</code>插件,按照插件的配置方法,设置浏览器的动态代理。</p><h2 id="安装-homebrew"><a href="#安装-homebrew" class="headerlink" title="安装 homebrew"></a>安装 homebrew</h2><p>有了这个包管理工具之后,以后安装软件会非常方便,谁用谁知道。参考官方地址方法进行安装:<a href="http://brew.sh/" target="_blank" rel="noopener">http://brew.sh/</a>,耐心等待一会儿就安装好了。</p><p>使用<code>brew</code>安装软件,测试安装是否成功</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ brew install wget</span><br><span class="line">Updating Homebrew...</span><br><span class="line"></span><br><span class="line">$ wget</span><br><span class="line">wget: missing URL</span><br><span class="line">Usage: wget [OPTION]... [URL]...</span><br><span class="line"></span><br><span class="line">Try `wget --<span class="built_in">help</span><span class="string">' for more options.</span></span><br></pre></td></tr></table></figure><p>你已经感受到了使用 Homebrew 安装命令行程序的便利。那么接下来,我们将通过 Homebrew Cask 优雅、简单、快速的安装和管理 OS X 图形界面程序,比如 Google Chrome 和 Dropbox。<a href="https://caskroom.github.io/" target="_blank" rel="noopener">https://caskroom.github.io/</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ brew install caskroom/cask/brew-cask</span><br><span class="line">$ brew cask install google-chrome // 安装 Google 浏览器</span><br><span class="line">$ brew update && brew upgrade brew-cask && brew cleanup // 更新</span><br></pre></td></tr></table></figure><p><code>brew</code>是从下载源码解压然后<code>./configure && make install</code>,同时会包含相关依存库。并自动配置好各种环境变量,而且易于卸载。这个对程员来说简直是福音,简单的指令,就能快速安装和升级本地的各种开发环境。</p><p><code>brew cask</code>是将已经编译好了的应用包(.dmg/.pkg),仅仅是下载解压,省掉了自己去下载、解压、拖拽(安装)等蛋疼步骤,同样,卸载相当容易与干净。这个对一般用户来说会比较方便,包含很多在 AppStore 里没有的常用软件。</p><h2 id="通过NVM安装不同版本的node"><a href="#通过NVM安装不同版本的node" class="headerlink" title="通过NVM安装不同版本的node"></a>通过NVM安装不同版本的node</h2><p>众所周知,node版本更新是非常的频繁,如果是全局安装,之后需要临时切换或者升级,是非常不方便多。通过<code>nvm</code>非常方便的来管理<code>node</code>的不同版本,跟上节奏嗨起来。</p><p>通过<code>brew</code>安装<code>nvm</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ brew install nvm</span><br><span class="line">$ mkdir ~/.nvm</span><br></pre></td></tr></table></figure><p>修改<code>~/.bash_profile</code>文件,追加以下内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 brew install nvm,需要做以下配置</span></span><br><span class="line"><span class="built_in">export</span> NVM_DIR=<span class="string">"<span class="variable">$HOME</span>/.nvm"</span></span><br><span class="line"><span class="built_in">source</span> $(brew --prefix nvm)/nvm.sh</span><br></pre></td></tr></table></figure><p>使刚才的修改生效</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">source</span> ~/.bash_profile</span><br></pre></td></tr></table></figure><p>安装<code>node</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ nvm ls-remote <span class="comment">#查看官网node的所有版本</span></span><br><span class="line">$ nvm install 7.5.0 <span class="comment">#指定node的版本号进行安装</span></span><br><span class="line">$ nvm use xxx <span class="comment">#使用指定版本的node </span></span><br><span class="line">$ node -v</span><br><span class="line">$ npm -v</span><br></pre></td></tr></table></figure><h2 id="安装Atom前端开发工具"><a href="#安装Atom前端开发工具" class="headerlink" title="安装Atom前端开发工具"></a>安装Atom前端开发工具</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install atom</span><br></pre></td></tr></table></figure><p>安装插件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">activate-power-mode</span><br><span class="line">atom-clock</span><br><span class="line">color-picker</span><br><span class="line">editorconfig</span><br><span class="line">emmet</span><br><span class="line">file-icons</span><br><span class="line">git-plus</span><br><span class="line">linter</span><br><span class="line">linter-eslint</span><br><span class="line">linter-stylelint</span><br><span class="line">minimap</span><br><span class="line">platformio-ide-terminal</span><br><span class="line">react</span><br></pre></td></tr></table></figure><h2 id="安装Java-SDK"><a href="#安装Java-SDK" class="headerlink" title="安装Java SDK"></a>安装Java SDK</h2><p>通过<code>brew</code>安装<code>JDK 8</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install java</span><br></pre></td></tr></table></figure><p>如果需要安装<code>JDK 6/7</code>,可以通过<code>homebrew-cask-versions</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ brew tap caskroom/versions</span><br><span class="line">$ brew cask install java6</span><br><span class="line">$ brew cask install java7</span><br></pre></td></tr></table></figure><p>查看系统安装中安装的所有<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ /usr/libexec/java_home -V</span><br><span class="line">Matching Java Virtual Machines (4):</span><br><span class="line"> 1.8.0_121, x86_64:<span class="string">"Java SE 8"</span>/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home</span><br><span class="line"> 1.7.0_80, x86_64:<span class="string">"Java SE 7"</span>/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home</span><br><span class="line"> 1.6.0_65-b14-468, x86_64:<span class="string">"Java SE 6"</span>/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br><span class="line"> 1.6.0_65-b14-468, i386:<span class="string">"Java SE 6"</span>/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br><span class="line"></span><br><span class="line">/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home</span><br><span class="line"></span><br><span class="line">$ /usr/libexec/java_home -v 1.6</span><br><span class="line">/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br></pre></td></tr></table></figure><h2 id="使用jEnv管理多个Java-SDK版本"><a href="#使用jEnv管理多个Java-SDK版本" class="headerlink" title="使用jEnv管理多个Java SDK版本"></a>使用jEnv管理多个Java SDK版本</h2><p><code>jEnv</code>帮助我们更简单的管理多个<code>JDK</code>:<a href="http://www.jenv.be/" target="_blank" rel="noopener">http://www.jenv.be/</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install jenv</span><br></pre></td></tr></table></figure><p><code>bash</code>中做以下配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">echo</span> <span class="string">'export PATH="$HOME/.jenv/bin:$PATH"'</span> >> ~/.bash_profile</span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">'eval "$(jenv init -)"'</span> >> ~/.bash_profile</span><br></pre></td></tr></table></figure><p><code>Zsh</code>中做以下配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">echo</span> <span class="string">'export PATH="$HOME/.jenv/bin:$PATH"'</span> >> ~/.zshrc</span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">'eval "$(jenv init -)"'</span> >> ~/.zshrc</span><br></pre></td></tr></table></figure><p><code>jEnv</code>不能自己安装任何版本的<code>JDK</code>,所以需要我们手动安装好之后再用<code>jEnv add xxx</code>指向它们。<br>第一次添加的时候出现下面的错误,后来在 <a href="https://github.com/gcuisinier/jenv/wiki/Trouble-Shooting" target="_blank" rel="noopener">jenv github wiki</a> 中找到解决方案,如果没有出现就忽略。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home</span><br><span class="line">ln: /Users/jerry/.jenv/versions/oracle64-1.6.0.65: No such file or directory</span><br><span class="line"></span><br><span class="line"><span class="comment">#解决方案,修改 ~/.bash_profile,增加下面的内容</span></span><br><span class="line">$ vi ~/.bash_profile</span><br><span class="line"><span class="comment"># To enable shims and autocompletion add to your profile:</span></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">which</span> jenv > /dev/null; <span class="keyword">then</span> <span class="built_in">eval</span> <span class="string">"<span class="variable">$(jenv init -)</span>"</span>; <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># To use Homebrew's directories rather than ~/.jenv add to your profile:</span></span><br><span class="line"><span class="built_in">export</span> JENV_ROOT=/usr/<span class="built_in">local</span>/opt/jenv</span><br></pre></td></tr></table></figure><p>添加<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/</span><br><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents//Home/</span><br><span class="line">$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/</span><br></pre></td></tr></table></figure><p>查看所有<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ jenv versions</span><br><span class="line">* system (<span class="built_in">set</span> by /usr/<span class="built_in">local</span>/opt/jenv/version)</span><br><span class="line"> 1.6</span><br><span class="line"> 1.6.0.65</span><br><span class="line"> 1.7</span><br><span class="line"> 1.7.0.80</span><br><span class="line"> 1.8</span><br><span class="line"> 1.8.0.121</span><br><span class="line"> oracle64-1.6.0.65</span><br><span class="line"> oracle64-1.7.0.80</span><br><span class="line"> oracle64-1.8.0.121</span><br></pre></td></tr></table></figure><p>设置全局<code>JDK</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ jenv global 1.8</span><br></pre></td></tr></table></figure><p>设置文件夹的<code>JDK</code>,设置的信息保存在<code>.java-version</code>文件中</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ jenv <span class="built_in">local</span> 1.6</span><br><span class="line">$ cat .java-version</span><br><span class="line">1.6</span><br><span class="line">$ rm -rf .java-version</span><br></pre></td></tr></table></figure><p>设置shell的<code>JDK</code>,似乎只在当前shell窗口生效</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ jenv shell 1.7</span><br></pre></td></tr></table></figure><p>其它用法</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ jenv <span class="built_in">which</span> java</span><br><span class="line">/usr/<span class="built_in">local</span>/opt/jenv/versions/1.7/bin/java</span><br></pre></td></tr></table></figure><h2 id="安装Maven"><a href="#安装Maven" class="headerlink" title="安装Maven"></a>安装Maven</h2><p><a href="https://maven.apache.org" target="_blank" rel="noopener">https://maven.apache.org</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install maven</span><br></pre></td></tr></table></figure><p><code>maven</code>的java版本随<code>jenv</code>切换改变而改变,参考 <a href="https://github.com/gcuisinier/jenv/issues/74" target="_blank" rel="noopener">jenv issue</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ vi ~/.mavenrc</span><br><span class="line">JAVA_HOME=$(/usr/libexec/java_home -v $(jenv version-name))</span><br></pre></td></tr></table></figure><h2 id="安装iTerm2"><a href="#安装iTerm2" class="headerlink" title="安装iTerm2"></a>安装iTerm2</h2><p><a href="https://www.iterm2.com/" target="_blank" rel="noopener">https://www.iterm2.com/</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install iterm2</span><br></pre></td></tr></table></figure><h2 id="安装go2shell"><a href="#安装go2shell" class="headerlink" title="安装go2shell"></a>安装go2shell</h2><p><a href="http://zipzapmac.com/go2shell" target="_blank" rel="noopener">http://zipzapmac.com/go2shell</a><br>这个软件能够让你在<code>Finder</code>中轻松地在当前路径打开<code>shell</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install go2shell</span><br></pre></td></tr></table></figure><p>安装完成之后,在应用程序中打开<code>go2shell</code>,然后点击<code>Thank The Developers</code>,会打开一个<code>donate</code>的网页,你可以选择捐钱或者复制<code>DONATE_BY_FOLLOW</code>填入<code>go2shell</code>的文本框中,回车即可。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Not Ready to Donate? Just follow us on twitter and enter DONATE_BY_FOLLOW in Go2Shell code field! Codes for other donation options will be available after checkout.</span><br></pre></td></tr></table></figure><p>完成上面步骤之后,在<code>Finder</code>的工具拦中会多一个<code>go2shell</code>的图标,点击它就能打开<code>shell</code>终端程序了。</p><p><img src="/2017/Mac开发环境搭建-v1/go2shell_config_complate.png"></p><h2 id="安装KeepingYouAwake"><a href="#安装KeepingYouAwake" class="headerlink" title="安装KeepingYouAwake"></a>安装KeepingYouAwake</h2><p><a href="https://github.com/newmarcel/KeepingYouAwake" target="_blank" rel="noopener">https://github.com/newmarcel/KeepingYouAwake</a><br>保持<code>Mac</code>不休眠的软件,方便<code>PPT</code>等演示的时候不出现尴尬的画面。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install keepingyouawake</span><br></pre></td></tr></table></figure><h2 id="安装MacDown编辑器"><a href="#安装MacDown编辑器" class="headerlink" title="安装MacDown编辑器"></a>安装MacDown编辑器</h2><p><a href="http://macdown.uranusjr.com/" target="_blank" rel="noopener">http://macdown.uranusjr.com/</a><br>免费开源的<code>MarkDown</code>编辑器</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew cask install macdown</span><br></pre></td></tr></table></figure><h2 id="安装IntelliJ-Idea"><a href="#安装IntelliJ-Idea" class="headerlink" title="安装IntelliJ Idea"></a>安装IntelliJ Idea</h2><p><a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener">https://www.jetbrains.com/idea/</a><br>下载配置文件:<a href="https://github.com/myoss/IntelliJIdea-Config-MacOS" target="_blank" rel="noopener">https://github.com/myoss/IntelliJIdea-Config-MacOS</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> /Users/jerry/Library/Preferences/IntelliJIdea2016.3</span><br><span class="line">$ git <span class="built_in">clone</span> git@github.com:myoss/IntelliJIdea-Config-MacOS.git .</span><br><span class="line"></span><br><span class="line">$ vi fileTemplates/includes/File\ Header.java</span><br><span class="line"><span class="comment"># 将 ` * @author ${USER} $fdate` 中的 `${USER}` 替换为你需要的名字,默认是电脑的账户名</span></span><br></pre></td></tr></table></figure><h2 id="安装git-gui工具SourceTree"><a href="#安装git-gui工具SourceTree" class="headerlink" title="安装git gui工具SourceTree"></a>安装git gui工具SourceTree</h2><p><a href="https://www.sourcetreeapp.com/" target="_blank" rel="noopener">https://www.sourcetreeapp.com/</a> 目前是免费的工具,需要注册一下他们家的账户才能使用。</p><h2 id="安装dos2unix命令转化文件的换行符"><a href="#安装dos2unix命令转化文件的换行符" class="headerlink" title="安装dos2unix命令转化文件的换行符"></a>安装dos2unix命令转化文件的换行符</h2><p>Windows和Linux中文件的换行符的不同,导致文件见的一些“不兼容”问题,通过unix2dos 和dos2unix来实现互相转换。为了解决<code>git add</code>的时候的错误<code>fatal: CRLF would be replaced by LF</code>,或者用来将文件中的<code>CRLF</code>转换为<code>LF</code>。<a href="http://linuxcommand.org/man_pages/dos2unix1.html" target="_blank" rel="noopener">http://linuxcommand.org/man_pages/dos2unix1.html</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ brew install dos2unix</span><br></pre></td></tr></table></figure><p><code>-k</code> 保持文件时间戳不变<br><code>-n</code> 新文件模式,待修改的源文件重定向到新的文件中<br><code>-o</code> 旧文件模式,将修改后的内容保存在源文件中,默认就是此模式</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ dos2unix -k -n source.sql target.sql <span class="comment">#将替换后的文件保存在target.sql中,不改变source.sql原始文件</span></span><br><span class="line">$ dos2unix -k source.sql <span class="comment">#替换文件</span></span><br><span class="line">$ find . -name *.sql | xargs dos2unix -k <span class="comment">#批量替换文件</span></span><br></pre></td></tr></table></figure><p><code>unix2dos</code> UNIX(LF) -> DOS(CRLF)<br><code>dos2unix</code> DOS(CRLF) -> UNIX(LF)<br><code>mac2unix</code> MAC(R) -> UNIX(LF)</p><p>使用<code>cat</code>命令查看不可见的字符:<a href="http://os.51cto.com/art/201310/413568.htm" target="_blank" rel="noopener">http://os.51cto.com/art/201310/413568.htm</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">$ cat -T test.txt <span class="comment">#用cat -T命令来显示TAB键的字符^I</span></span><br><span class="line">testing </span><br><span class="line">^I^Itesting </span><br><span class="line"> </span><br><span class="line">more testing </span><br><span class="line">^I </span><br><span class="line"></span><br><span class="line">$ cat -E /tmp/test.txt <span class="comment">#用cat -E命令来显示行尾的结束字符$</span></span><br><span class="line">testing$ </span><br><span class="line"> testing </span><br><span class="line"> $ </span><br><span class="line"></span><br><span class="line">$ cat -A /tmp/testing.txt <span class="comment">#用cat -A命令就可以显示所有不可见的字符</span></span><br><span class="line">testing$ </span><br><span class="line">^I^Itesting^L^H$</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>前言,不知从何时开始向往能在<code>Mac</code>下开发,如今终于实现,感谢老婆大人的支持。废话不多,开始记录从零开始搭建开发环境,主要是<code>Java</code>、<code>node</code>的配置</p>
<h2 id="开启Mac三指拖拽的手势"><a href="#开启Mac三指拖拽的手势" class="headerlink" title="开启Mac三指拖拽的手势"></a>开启Mac三指拖拽的手势</h2><p>非常好用的功能,<code>macOS</code>系统中默认关闭了这个功能,参考百度经验的设置方法:<a href="http://jingyan.baidu.com/article/0bc808fc5bceb21bd485b98e.html" target="_blank" rel="noopener">点击跳转</a></p>
</summary>
<category term="Mac" scheme="https://blog.myoss.app/categories/Mac/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>vim编辑器用法</title>
<link href="https://blog.myoss.app/2016/vim%E7%BC%96%E8%BE%91%E5%99%A8%E7%94%A8%E6%B3%95/"/>
<id>https://blog.myoss.app/2016/vim编辑器用法/</id>
<published>2016-03-28T04:53:00.000Z</published>
<updated>2018-07-29T05:26:04.000Z</updated>
<content type="html"><![CDATA[<h2 id="vim编辑器使用笔记"><a href="#vim编辑器使用笔记" class="headerlink" title="vim编辑器使用笔记"></a>vim编辑器使用笔记</h2><a id="more"></a><h3 id="vim快捷操作一览(网友制作)"><a href="#vim快捷操作一览(网友制作)" class="headerlink" title="vim快捷操作一览(网友制作)"></a>vim快捷操作一览(网友制作)</h3><p><img src="/2016/vim编辑器用法/vim-usage.png"></p><h3 id="vim编辑器操作模式"><a href="#vim编辑器操作模式" class="headerlink" title="vim编辑器操作模式"></a>vim编辑器操作模式</h3><p>vim编辑器提供了三种操作模式</p><p><img src="/2016/vim编辑器用法/vim_three_mode.png"></p><h4 id="命令行模式(Command)"><a href="#命令行模式(Command)" class="headerlink" title="命令行模式(Command)"></a>命令行模式(Command)</h4><p>进入<code>vim</code>编辑器后的默认模式就是命令行模式,在其它两个模式中,按<code>Ecs</code>/<code>Escape</code>键回到命令行模式</p><h4 id="文本输入模式(Input)"><a href="#文本输入模式(Input)" class="headerlink" title="文本输入模式(Input)"></a>文本输入模式(Input)</h4><p>在命令行模式中,按<code>i</code>、<code>o</code>、<code>a</code>键进入文本输入模式</p><h4 id="末行模式(Last-Line)"><a href="#末行模式(Last-Line)" class="headerlink" title="末行模式(Last Line)"></a>末行模式(Last Line)</h4><p>在命令行模式中,按<code>:</code>键进入末行模式,输入命令完成之后按<code>Enter</code>键触发相应的动作</p><h3 id="在vim编辑器中进行移动光标操作"><a href="#在vim编辑器中进行移动光标操作" class="headerlink" title="在vim编辑器中进行移动光标操作"></a>在vim编辑器中进行移动光标操作</h3><table><thead><tr><th>按键</th><th>描述(大写的字母,可以用<code>Shift</code>+字母,也可以是大写模式下的字母)</th></tr></thead><tbody><tr><td><code>h</code> 或 方向键<code>←</code> 或 <code>Backspace</code></td><td>向左移动一个字符</td></tr><tr><td><code>j</code> 或 方向键<code>↓</code></td><td>向下移动一行</td></tr><tr><td><code>l</code> 或 方向键<code>→</code></td><td>向右移动一个字符</td></tr><tr><td><code>k</code> 或 方向键<code>↑</code></td><td>向上移动一行</td></tr><tr><td><code>w</code> 或 <code>W</code></td><td>移动到当前或者下一个单词的词首</td></tr><tr><td><code>b</code> 或 <code>B</code></td><td>移动到当前或者上一个单词的词首</td></tr><tr><td><code>e</code> 或 <code>E</code></td><td>移动到当前或者下一个单词的词尾</td></tr><tr><td><code>$</code></td><td>移动到当前行末尾</td></tr><tr><td><code>^</code></td><td>移动到当前行开头第一个非空格字符</td></tr><tr><td><code>0</code>(数字0)</td><td>移动到当前行行首</td></tr><tr><td><code>n</code> + <code>丨</code></td><td>移动到当前行的第<code>n</code>个字符,从行首开始记数</td></tr><tr><td><code>H</code></td><td>移动到屏幕顶端第一个非空格字符</td></tr><tr><td><code>M</code></td><td>移动到屏幕中间第一个非空格字符</td></tr><tr><td><code>L</code></td><td>移动到屏幕底部第一个非空格字符</td></tr><tr><td><code>Enter</code>(回车键)</td><td>移动到下一行行首</td></tr><tr><td><code>G</code></td><td>移动到文件的最后一行</td></tr><tr><td><code>1G</code> 或 <code>gg</code></td><td>移动到文件的第一行</td></tr><tr><td><code>nG</code></td><td>移动到第<code>n</code>行,先输入数字,再输入<code>G</code></td></tr><tr><td><code>:n</code></td><td>移动到第<code>n</code>行</td></tr><tr><td><code>Ctrl</code> + <code>F</code></td><td>向下滚动一屏</td></tr><tr><td><code>Ctrl</code> + <code>D</code></td><td>向下滚动半屏(down)</td></tr><tr><td><code>Ctrl</code> + <code>B</code></td><td>向上滚动一屏</td></tr><tr><td><code>Ctrl</code> + <code>U</code></td><td>向上滚动半屏(up)</td></tr><tr><td><code>Ctrl</code> + <code>G</code></td><td>显示当前文件缓冲信息(如:文件名、文件数、光标所在行在总行数中所处的百分比位置等)</td></tr></tbody></table><h3 id="使用vim编辑器进行文本修改"><a href="#使用vim编辑器进行文本修改" class="headerlink" title="使用vim编辑器进行文本修改"></a>使用vim编辑器进行文本修改</h3><h4 id="输入文本命令"><a href="#输入文本命令" class="headerlink" title="输入文本命令"></a>输入文本命令</h4><table><thead><tr><th>按键</th><th>描述</th></tr></thead><tbody><tr><td><code>a</code></td><td>在光标位置后进行输入文本(append)</td></tr><tr><td><code>A</code></td><td>在当前行末尾进行输入文本(append)</td></tr><tr><td><code>i</code></td><td>在光标位置前进行输入文本(insert)</td></tr><tr><td><code>I</code></td><td>在当前行行首进行输入文本(insert)</td></tr><tr><td><code>o</code></td><td>在光标下新插入一行进行输入文本(open)</td></tr><tr><td><code>O</code></td><td>在光标上新插入一行进行输入文本(open)</td></tr></tbody></table><h4 id="删除文本命令"><a href="#删除文本命令" class="headerlink" title="删除文本命令"></a>删除文本命令</h4><table><thead><tr><th>按键</th><th>描述</th></tr></thead><tbody><tr><td><code>x</code>(小写)</td><td>删除光标所在的字符(删除单个字符)</td></tr><tr><td><code>X</code></td><td>删除光标前的字符(删除单个字符)</td></tr><tr><td><code>dw</code></td><td>删除一个单词,不适用中文</td></tr><tr><td><code>dd</code></td><td>删除光标所在的行</td></tr><tr><td><code>D</code> 或者 <code>d$</code></td><td>删除光标到行末尾的字符(包含光标所在字符)</td></tr><tr><td><code>d0</code> 或者 <code>d^</code></td><td>删除光标前一个字符到行首的字符(不包含光标所在字符)</td></tr><tr><td><code>dG</code></td><td>删除当前行到文件的最后一行之间的内容</td></tr><tr><td><code>d1G</code> 或者 <code>dgg</code></td><td>删除当前行到文件的第一行之间的内容</td></tr><tr><td><code>:m,nd</code></td><td>删除第<code>m</code>行到第<code>n</code>行的内容(例如: 4,9d,即删除4~9行)</td></tr></tbody></table><h4 id="替换文本命令"><a href="#替换文本命令" class="headerlink" title="替换文本命令"></a>替换文本命令</h4><table><thead><tr><th>按键</th><th>描述</th></tr></thead><tbody><tr><td><code>:r filename</code></td><td>将读取<code>filename</code>文件中的内容插入到当前文件夹光标所在位置(filename可以使用目录+文件名,用<code>Tab</code>键补全,确认后就按<code>Enter</code>)</td></tr><tr><td><code>R</code></td><td>覆盖式替换光标所在的字符。先按<code>R</code>,然后输入字符,替换当前光标所在的字符,替换后会移动到下一个字符,按<code>ESC</code>键退出替换模式</td></tr><tr><td><code>S</code></td><td>插入式替换光标所在的字符,按<code>S</code>之后,先会删除当前字符,继续输入字符,进行插入字符操作,而不是像<code>R</code>进行后续字符的替换动作</td></tr><tr><td><code>cc</code> 或者 <code>S</code></td><td>用空白替换当前行的内容(直接删除当前行的内容,使之成为空行)</td></tr><tr><td><code>c$</code> 或者 <code>C</code></td><td>用空白替换当前行光标到行尾的字符</td></tr><tr><td><code>c^</code> 或者 <code>c0</code></td><td>用空白替换当前行光标前一个字符到行首的字符(不包含光标所在字符)</td></tr><tr><td><code>~</code></td><td>光标所在字母进行大小写转换,转换之后移动到下一个字符</td></tr></tbody></table><h4 id="回退操作命令"><a href="#回退操作命令" class="headerlink" title="回退操作命令"></a>回退操作命令</h4><table><thead><tr><th>按键</th><th>描述</th></tr></thead><tbody><tr><td><code>u</code></td><td>回退之前执行的命令,多次操作则执行多次回退操作</td></tr><tr><td><code>U</code></td><td>回退对于当前行所执行的命令,多次操作则执行多次回退操作</td></tr></tbody></table><h4 id="重复执行命令"><a href="#重复执行命令" class="headerlink" title="重复执行命令"></a>重复执行命令</h4><table><thead><tr><th>按键</th><th>描述</th></tr></thead><tbody><tr><td><code>.</code></td><td>重复执行上一个命令</td></tr><tr><td><code>n</code> + <code>命令</code></td><td><code>数字</code> + <code>命令</code>,重复执行某动作</td></tr><tr><td><code>5dd</code></td><td>删除5行,从当前行开始</td></tr><tr><td><code>3r</code></td><td>按了<code>3r</code>之后,输入一个字符,则从光标处开始的3个字符都会被输入的字符给替换掉</td></tr><tr><td><code>5J</code></td><td>将5行合并成一行,从当前行开始</td></tr><tr><td><code>3x</code></td><td>删除3个字符</td></tr><tr><td><code>5i</code> + <code>任意或者多个字符</code></td><td>输入<code>5ihelllo</code>按<code>Esc</code>,将插入5遍hello</td></tr><tr><td><code>3G</code></td><td>移动到第3行</td></tr><tr><td><code>5l</code>(小写的L)</td><td>将光标向右移动5个字符,其它方向键类似</td></tr><tr><td><code>5k</code>(小写的K)</td><td>将光标向上移动5行,其它方向键类似</td></tr></tbody></table><h3 id="使用vim编辑器查找和替换文本"><a href="#使用vim编辑器查找和替换文本" class="headerlink" title="使用vim编辑器查找和替换文本"></a>使用vim编辑器查找和替换文本</h3><h4 id="查找命令"><a href="#查找命令" class="headerlink" title="查找命令"></a>查找命令</h4><table><thead><tr><th>按键</th><th>描述</th></tr></thead><tbody><tr><td><code>/string</code></td><td>从光标位置开始向下</td></tr></tbody></table>]]></content>
<summary type="html">
<h2 id="vim编辑器使用笔记"><a href="#vim编辑器使用笔记" class="headerlink" title="vim编辑器使用笔记"></a>vim编辑器使用笔记</h2>
</summary>
<category term="linux" scheme="https://blog.myoss.app/categories/linux/"/>
<category term="linux" scheme="https://blog.myoss.app/tags/linux/"/>
</entry>
<entry>
<title>redis 简单配置和集群</title>
<link href="https://blog.myoss.app/2016/redis-%E7%AE%80%E5%8D%95%E9%85%8D%E7%BD%AE%E5%92%8C%E9%9B%86%E7%BE%A4/"/>
<id>https://blog.myoss.app/2016/redis-简单配置和集群/</id>
<published>2016-03-12T13:08:54.000Z</published>
<updated>2018-07-29T05:26:04.000Z</updated>
<content type="html"><![CDATA[<h3 id="下载和编译"><a href="#下载和编译" class="headerlink" title="下载和编译"></a>下载和编译</h3><p>redis官网:<a href="http://redis.io/" target="_blank" rel="noopener">http://redis.io/</a><br>redis中文:<a href="http://www.redis.cn/" target="_blank" rel="noopener">http://www.redis.cn/</a><br>redis快速上手:<a href="http://redis.io/topics/quickstart" target="_blank" rel="noopener">http://redis.io/topics/quickstart</a></p><a id="more"></a><h4 id="下载,解压,编译"><a href="#下载,解压,编译" class="headerlink" title="下载,解压,编译"></a>下载,解压,编译</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Downloads]<span class="comment"># wget http://download.redis.io/releases/redis-3.0.7.tar.gz</span></span><br><span class="line">[root@linux1 Downloads]<span class="comment"># tar zxf redis-3.0.7.tar.gz</span></span><br><span class="line">[root@linux1 Downloads]<span class="comment"># cd redis-3.0.7</span></span><br><span class="line">[root@linux1 Downloads]<span class="comment"># make</span></span><br></pre></td></tr></table></figure><p>编译完成之后会在<code>./src</code>目录中生成4个文件</p><p><code>redis-server</code> Redis服务器的daemon启动程序<br><code>redis-cli</code> Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作<br><code>redis-benchmark</code> Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能<br><code>redis-stat</code> Redis状态检测工具,可以检测Redis当前状态参数及延迟状况</p><h4 id="初次运行"><a href="#初次运行" class="headerlink" title="初次运行"></a>初次运行</h4><p>二进制文件是编译完成后在src目录下。默认端口是<code>6379</code>,运行如下:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 redis-3.0.7]<span class="comment"># src/redis-server</span></span><br></pre></td></tr></table></figure><p>redis默认运行不是静默的方式,使用<code>ctrl + c</code>停止redis服务</p><p>指定配置文件启动<code>redis</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 src]<span class="comment"># ./redis-server ../redis.conf</span></span><br></pre></td></tr></table></figure><p>自带的客户端连接<code>redis</code>服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 src]<span class="comment"># ./redis-cli</span></span><br><span class="line">127.0.0.1:6379></span><br></pre></td></tr></table></figure><p>停止<code>redis</code>服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ ./redis-cli shutdown</span><br><span class="line">$ ./redis-cli -p 6380 shutdown <span class="comment">#关闭指定端口的redis服务</span></span><br><span class="line"></span><br><span class="line">$ pkill redis</span><br><span class="line"></span><br><span class="line">$ ps -ef | grep redis</span><br><span class="line">$ <span class="built_in">kill</span> -9 pid</span><br></pre></td></tr></table></figure><hr><h3 id="install方式安装"><a href="#install方式安装" class="headerlink" title="install方式安装"></a>install方式安装</h3><h4 id="编译安装"><a href="#编译安装" class="headerlink" title="编译安装"></a>编译安装</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@linux2 redis-3.0.7]<span class="comment"># mkdir /usr/local/redis</span></span><br><span class="line">[root@linux2 redis-3.0.7]<span class="comment"># make</span></span><br><span class="line">[root@linux2 redis-3.0.7]<span class="comment"># make PREFIX=/usr/local/redis install</span></span><br><span class="line">[root@linux2 redis-3.0.7]<span class="comment"># ls /usr/local/redis</span></span><br><span class="line">bin</span><br></pre></td></tr></table></figure><h3 id="性能测试"><a href="#性能测试" class="headerlink" title="性能测试"></a>性能测试</h3><h4 id="使用redis-benchmark测试"><a href="#使用redis-benchmark测试" class="headerlink" title="使用redis-benchmark测试"></a>使用redis-benchmark测试</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">[root@linux2 bin]<span class="comment"># ./redis-benchmark -t GET,SET</span></span><br><span class="line">====== SET ======</span><br><span class="line"> 100000 requests completed <span class="keyword">in</span> 1.68 seconds</span><br><span class="line"> 50 parallel clients</span><br><span class="line"> 3 bytes payload</span><br><span class="line"> keep alive: 1</span><br><span class="line"></span><br><span class="line">94.12% <= 1 milliseconds</span><br><span class="line">99.62% <= 2 milliseconds</span><br><span class="line">99.90% <= 3 milliseconds</span><br><span class="line">99.92% <= 4 milliseconds</span><br><span class="line">99.95% <= 9 milliseconds</span><br><span class="line">100.00% <= 9 milliseconds</span><br><span class="line">59417.71 requests per second</span><br><span class="line"></span><br><span class="line">====== GET ======</span><br><span class="line"> 100000 requests completed <span class="keyword">in</span> 1.44 seconds</span><br><span class="line"> 50 parallel clients</span><br><span class="line"> 3 bytes payload</span><br><span class="line"> keep alive: 1</span><br><span class="line"></span><br><span class="line">98.93% <= 1 milliseconds</span><br><span class="line">99.91% <= 2 milliseconds</span><br><span class="line">99.95% <= 3 milliseconds</span><br><span class="line">99.97% <= 5 milliseconds</span><br><span class="line">100.00% <= 5 milliseconds</span><br><span class="line">69300.07 requests per second</span><br><span class="line"></span><br><span class="line">[root@linux2 bin]<span class="comment"># ./redis-benchmark -t GET,SET -q # 精简输出</span></span><br><span class="line">SET: 70422.54 requests per second</span><br><span class="line">GET: 69735.01 requests per second</span><br></pre></td></tr></table></figure><h3 id="redis服务集群配置"><a href="#redis服务集群配置" class="headerlink" title="redis服务集群配置"></a>redis服务集群配置</h3><p>使用单机的方式演示集群,多机器类似</p><h4 id="创建两个文件夹"><a href="#创建两个文件夹" class="headerlink" title="创建两个文件夹"></a>创建两个文件夹</h4><p>用于分别部署<code>master</code>和<code>slave</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 redis-3.0.7]<span class="comment"># mkdir -p /usr/local/redis/bin</span></span><br><span class="line">[root@linux1 redis-3.0.7]<span class="comment"># mkdir -p /usr/local/redis/run</span></span><br><span class="line">[root@linux1 redis-3.0.7]<span class="comment"># mkdir -p /usr/local/redis1/bin</span></span><br><span class="line">[root@linux1 redis-3.0.7]<span class="comment"># mkdir -p /usr/local/redis1/run</span></span><br></pre></td></tr></table></figure><h4 id="复制编译好的文件"><a href="#复制编译好的文件" class="headerlink" title="复制编译好的文件"></a>复制编译好的文件</h4><p>将刚才编译好的二进制文件和配置文件,分别复制到刚才创建好的文件夹中</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 redis-3.0.7]<span class="comment"># cd src/</span></span><br><span class="line">[root@linux1 src]<span class="comment"># cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin</span></span><br><span class="line">[root@linux1 src]<span class="comment"># cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis1/bin</span></span><br><span class="line"></span><br><span class="line">[root@linux1 src]<span class="comment"># cp ../redis.conf /usr/local/redis/bin</span></span><br><span class="line">[root@linux1 src]<span class="comment"># cp ../redis.conf /usr/local/redis1/bin</span></span><br></pre></td></tr></table></figure><h4 id="配置master"><a href="#配置master" class="headerlink" title="配置master"></a>配置master</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># cd /usr/local/redis/bin</span></span><br><span class="line">[root@linux1 bin]<span class="comment"># vi redis.conf </span></span><br><span class="line">daemonize no</span><br><span class="line">设置为后台运行:</span><br><span class="line">daemonize yes</span><br><span class="line"></span><br><span class="line">pidfile /var/run/redis.pid</span><br><span class="line">修改pid文件的位置,设置为:</span><br><span class="line">pidfile /usr/<span class="built_in">local</span>/redis/run/redis.pid</span><br></pre></td></tr></table></figure><h4 id="配置slave"><a href="#配置slave" class="headerlink" title="配置slave"></a>配置slave</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># cd /usr/local/redis1/bin</span></span><br><span class="line">[root@linux1 bin]<span class="comment"># vi redis.conf </span></span><br><span class="line">daemonize no</span><br><span class="line">设置为后台运行:</span><br><span class="line">daemonize yes</span><br><span class="line"></span><br><span class="line">port 6379</span><br><span class="line">将端口号6379修改为:</span><br><span class="line">port 6380</span><br><span class="line"></span><br><span class="line">pidfile /var/run/redis.pid</span><br><span class="line">修改pid文件的位置,设置为:</span><br><span class="line">pidfile /usr/<span class="built_in">local</span>/redis1/run/redis.pid</span><br><span class="line"></span><br><span class="line"><span class="comment"># slaveof <masterip> <masterport></span></span><br><span class="line">设置master机器的ip和端口号,设置为:</span><br><span class="line">slaveof 127.0.0.1 6379</span><br><span class="line"></span><br><span class="line"><span class="comment"># masterauth <master-password></span></span><br><span class="line">如果master主机设置了密码,设置为:</span><br><span class="line">masterauth <master-password></span><br></pre></td></tr></table></figure><h4 id="启动集群"><a href="#启动集群" class="headerlink" title="启动集群"></a>启动集群</h4><p>分别启动<code>master</code>和<code>slave</code>服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 bin]<span class="comment"># ./redis-server redis.conf</span></span><br><span class="line">[root@linux1 bin]<span class="comment"># ./redis-server redis.conf</span></span><br></pre></td></tr></table></figure><p>查看<code>master</code>服务的信息</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 bin]<span class="comment"># ./redis-cli</span></span><br><span class="line">127.0.0.1:6379> info</span><br><span class="line"></span><br><span class="line"><span class="comment"># Replication #查看此节点的信息</span></span><br><span class="line">role:master <span class="comment">#当前服务的角色是master</span></span><br><span class="line">connected_slaves:1 <span class="comment">#现在有一台`slave`的机器,下面显示的是IP和端口和状态信息</span></span><br><span class="line">slave0:ip=127.0.0.1,port=6380,state=online,offset=71,lag=1</span><br><span class="line">master_repl_offset:71</span><br><span class="line">repl_backlog_active:1</span><br><span class="line">repl_backlog_size:1048576</span><br><span class="line">repl_backlog_first_byte_offset:2</span><br><span class="line">repl_backlog_histlen:70</span><br></pre></td></tr></table></figure><p>查看<code>slave</code>服务的信息</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 bin]<span class="comment"># ./redis-cli -p 6380</span></span><br><span class="line">127.0.0.1:6380> info</span><br><span class="line"></span><br><span class="line"><span class="comment"># Replication</span></span><br><span class="line">role:slave <span class="comment">#当前服务的角色是slave</span></span><br><span class="line">master_host:127.0.0.1 <span class="comment">#master机器的IP</span></span><br><span class="line">master_port:6379 <span class="comment">#master机器的端口</span></span><br><span class="line">master_link_status:up</span><br><span class="line">master_last_io_seconds_ago:1</span><br><span class="line">master_sync_in_progress:0</span><br><span class="line">slave_repl_offset:323</span><br><span class="line">slave_priority:100</span><br><span class="line">slave_read_only:1</span><br><span class="line">connected_slaves:0</span><br><span class="line">master_repl_offset:0</span><br><span class="line">repl_backlog_active:0</span><br><span class="line">repl_backlog_size:1048576</span><br><span class="line">repl_backlog_first_byte_offset:0</span><br><span class="line">repl_backlog_histlen:0</span><br></pre></td></tr></table></figure><h4 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h4><p><code>master</code>和<code>slave</code>现在都没有数据</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379> keys *</span><br><span class="line">(empty list or <span class="built_in">set</span>)</span><br><span class="line"></span><br><span class="line">127.0.0.1:6380> keys *</span><br><span class="line">(empty list or <span class="built_in">set</span>)</span><br></pre></td></tr></table></figure><p>往<code>master</code>服务中写入数据</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379> <span class="built_in">set</span> name Jerry.Chen</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379> keys *</span><br><span class="line">1) <span class="string">"name"</span></span><br><span class="line">127.0.0.1:6379> get name</span><br><span class="line"><span class="string">"Jerry.Chen"</span></span><br></pre></td></tr></table></figure><p><code>slave</code>服务中查看数据</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6380> keys *</span><br><span class="line">1) <span class="string">"name"</span></span><br><span class="line">127.0.0.1:6380> get name</span><br><span class="line"><span class="string">"Jerry.Chen"</span></span><br></pre></td></tr></table></figure><hr><h3 id="redis-conf-配置文件"><a href="#redis-conf-配置文件" class="headerlink" title="redis.conf 配置文件"></a>redis.conf 配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># cd /usr/local/redis/bin</span></span><br><span class="line">[root@linux1 bin]<span class="comment"># vi redis.conf</span></span><br></pre></td></tr></table></figure><h4 id="daemonize"><a href="#daemonize" class="headerlink" title="daemonize"></a>daemonize</h4><p>是否后台运行,默认是<code>no</code>,修改为<code>yes</code>,即可以在后台运行了</p><h4 id="requirepass"><a href="#requirepass" class="headerlink" title="requirepass"></a>requirepass</h4><p>设置<code>redis</code>服务的密码,默认未开启,查找<code># requirepass foobared</code>,然后修改进行开启密码。如果开启了密码,命令行操作方式</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 bin]<span class="comment"># ./redis-server -a foobared</span></span><br><span class="line">127.0.0.1:6379> auth foobared</span><br></pre></td></tr></table></figure><h4 id="pidfile"><a href="#pidfile" class="headerlink" title="pidfile"></a>pidfile</h4><p><code>redis</code>服务的<code>pid</code>文件位置</p><h4 id="timeout"><a href="#timeout" class="headerlink" title="timeout"></a>timeout</h4><p>请求超时时间</p><h4 id="loglevel"><a href="#loglevel" class="headerlink" title="loglevel"></a>loglevel</h4><p>log信息级别</p><h4 id="logfile"><a href="#logfile" class="headerlink" title="logfile"></a>logfile</h4><p>log文件位置</p><h4 id="databases"><a href="#databases" class="headerlink" title="databases"></a>databases</h4><p>开启数据库的数量,默认是16个</p><h4 id="save"><a href="#save" class="headerlink" title="save "></a>save <em> </em></h4><p>保存快照的频率,第一个<em>表示多长时间,第三个</em>表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。</p><h4 id="appendonly"><a href="#appendonly" class="headerlink" title="appendonly"></a>appendonly</h4><p>默认是<code>no</code>,可以写<code>yes</code>。这个选项就是负责是否开启<code>AOF</code>日志的开关。<code>AOF</code>日志,你可以简单理解为<code>MySQL binlog</code>一样的东西,作用就是记录每次的写操作,在遇到断电等问题时可以用它来恢复数据库状态。但是他不是二进制的,而是文本的,一行一行,写得很规范。如果你是一台redis,那你也能人肉通过它恢复数据</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">############################## 仅追加方式 ###############################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#默认情况下Redis会异步的将数据导出到磁盘上。这种模式对许多应用程序已经足够了,</span></span><br><span class="line"><span class="comment">#但是如果断电或者redis进程出问题就会导致一段时间内的更新数据丢失(取决与配置项)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#这种只增文件是可选的能够提供更好的体验的数据持久化策略。</span></span><br><span class="line"><span class="comment">#举个例子,如果使用默认的配置数据fsync策略,在服务器意外断电的情况下redis只会丢失一秒中内的更新数据,</span></span><br><span class="line"><span class="comment">#或者当redis进程出问题但操作系统运转正常时,redis只会丢失一个数据更新操作。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#AOF 和 RDB 持久化方式可以同时启动并且无冲突。</span></span><br><span class="line"><span class="comment">#如果AOF开启,启动redis时会加载aof文件,这些文件能够提供更好的保证。</span></span><br><span class="line"><span class="comment">#请在 http://redis.io/topics/persistence 获取更多数据持久化信息。</span></span><br><span class="line"></span><br><span class="line">appendonly no</span><br><span class="line"></span><br><span class="line"><span class="comment"># 只增文件的文件名称。(默认是appendonly.aof)</span></span><br><span class="line"><span class="comment"># appendfilename appendonly.aof</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#调用fsync()函数会通知操作系统真正将数据写入磁盘,而不是等待缓冲区中有更多数据。</span></span><br><span class="line"><span class="comment">#有些操作系统会将数据输出到磁盘,有些操作系统只是ASAP。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#redis支持三种不同的方式:</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#no:不调用,之等待操作系统来清空缓冲区当操作系统要输出数据时。很快。</span></span><br><span class="line"><span class="comment"># always: 每次更新数据都写入仅增日志文件。慢,但是最安全。</span></span><br><span class="line"><span class="comment"># everysec: 每秒调用一次。折中。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#默认是每秒中一次,因为它往往是在速度和数据安全两者之间的折中选择。</span></span><br><span class="line"><span class="comment">#如果你可以接受让操作系统去自动清空缓存,你可以将这项配置降低到'no'(如果你可以接受一段时间的数据丢失,默认的rdb就足够了),</span></span><br><span class="line"><span class="comment">#这完全取决与你。如果你想要一个更好的体验或者从相反的角度,使用'always',这样会很慢,但是比'everysec'安全些。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#请在下面的文章中获取更多细节知识:</span></span><br><span class="line"><span class="comment"># http://antirez.com/post/redis-persistence-demystified.html</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#如果你不是很清楚这三项之间的区别,或者不知道哪种适合你的机器,就是用默认吧。</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># appendfsync always</span></span><br><span class="line">appendfsync everysec</span><br><span class="line"><span class="comment"># appendfsync no</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#当AOF策略设置为'always'或者'everysec'的时候,后台的保存进程会进行很多磁盘I/O操作,</span></span><br><span class="line"><span class="comment">#在某些linux结构中redis会在调用sync()方法时阻塞很长时间。记住,现在还没办法解决这个问题,即使在不同进程中进行调用也会block。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#使用如下配置可能会缓解这个问题,这样会在存储大数据或者BIGREWRITEAOF的时候不会在主进程中调用fsync()方法。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># 这表示,如果另外一个子进程在进行保存操作,redis的表现如同配置为‘appendfsync no’。</span></span><br><span class="line"><span class="comment">#在实际应用中,这表示在最坏的情景下(使用linux默认配置)可能会丢失30秒日志。</span></span><br><span class="line"><span class="comment"># </span></span><br><span class="line"><span class="comment">#如果你有特殊的情况可以配置为'yes'。但是配置为'no'是最为安全的选择。</span></span><br><span class="line">no-appendfsync-on-rewrite no</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#自动重写只增文件。</span></span><br><span class="line"><span class="comment">#redis可以自动盲从的调用‘BGREWRITEAOF’来重写日志文件,如果日志文件增长了指定的百分比。</span></span><br><span class="line"><span class="comment"># </span></span><br><span class="line"><span class="comment">#它是这样工作的:每次rewrite后redis会记录日志文件的大小。(如果重启后没有重写后的大小,就默认用日志文件大小)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># 这个基准日志大小和当前日志大小做比较。如果当前大小比指定的百分比,重写机制就会被触发。</span></span><br><span class="line"><span class="comment">#同时,你也要制定一个重写下线,用来避免增长百分比够了,但是日志文件还很小的情况。</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#指定百分比为0可以注掉自动重写日志文件功能。</span></span><br><span class="line"></span><br><span class="line">auto-aof-rewrite-percentage 100</span><br><span class="line">auto-aof-rewrite-min-size 64mb</span><br></pre></td></tr></table></figure><h5 id="运行流程"><a href="#运行流程" class="headerlink" title="运行流程"></a>运行流程</h5><p>既然是log文件,而且是要用于恢复的,那么我们动动脚趾都能想到,这玩意肯定会越来越大,不管你的应用是大是小,如果AOF文件只增不减的话,那文件将会无限长大,这个问题是所有binlog都会遇到的。而通常遇到这种问题都会有一个rotate方案。就是当日志达到一定大小或者每隔一段时间将日志写到新的一个文件中,旧日志文件可以用来备份或其它。</p><p>而Redis的AOF还和rotate略有不同,他用了一种比较简单的方法,就是先给当前的所有数据做一个快照。然后再在这个快照的基础上写接下来的日志。<br>照快照的好处是,你之前可能用了10w次操作共改变了100条数据(比如在一条数据上进行了多次操作)。那这时你AOF中的10w条写操作记录就变成了100条记录。相当于将前面的执行全部合并了。原本很大AOF变小了。</p><p>执行这个操作的命令是:<code>BGREWRITEAOF</code> (background rewrite append only file)</p><p>这个快照长什么样呢?基本和一般的写日志没什么两样,也是一条一条的写记录。。比如现在Redis中总共存了3条string类型的数据a=>1,b=>2,c=>3。那这个快照的基本内容就是写入<code>a=>1</code>,写入<code>b=>2</code>,写入<code>c=>3</code>。</p><p>这时候要用AOF进行恢复的时候,只要先执行了前面几条,就能够恢复当前状态,然后再执行之后来的写操作,就能完全重现数据了。</p>]]></content>
<summary type="html">
<h3 id="下载和编译"><a href="#下载和编译" class="headerlink" title="下载和编译"></a>下载和编译</h3><p>redis官网:<a href="http://redis.io/" target="_blank" rel="noopener">http://redis.io/</a><br>redis中文:<a href="http://www.redis.cn/" target="_blank" rel="noopener">http://www.redis.cn/</a><br>redis快速上手:<a href="http://redis.io/topics/quickstart" target="_blank" rel="noopener">http://redis.io/topics/quickstart</a></p>
</summary>
<category term="redis" scheme="https://blog.myoss.app/categories/redis/"/>
<category term="redis" scheme="https://blog.myoss.app/tags/redis/"/>
</entry>
<entry>
<title>ssh-keygen 密钥</title>
<link href="https://blog.myoss.app/2016/ssh-keygen-%E5%AF%86%E9%92%A5/"/>
<id>https://blog.myoss.app/2016/ssh-keygen-密钥/</id>
<published>2016-03-05T07:20:00.000Z</published>
<updated>2018-07-29T05:26:04.000Z</updated>
<content type="html"><![CDATA[<h3 id="ssh-keygen-使用"><a href="#ssh-keygen-使用" class="headerlink" title="ssh-keygen 使用"></a>ssh-keygen 使用</h3><p>生成、管理和转换认证密钥</p><a id="more"></a><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen --<span class="built_in">help</span></span><br><span class="line">ssh-keygen: unknown option -- -</span><br><span class="line">usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]</span><br><span class="line"> [-N new_passphrase] [-C comment] [-f output_keyfile]</span><br><span class="line"> ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]</span><br><span class="line"> ssh-keygen -i [-m key_format] [-f input_keyfile]</span><br><span class="line"> ssh-keygen -e [-m key_format] [-f input_keyfile]</span><br><span class="line"> ssh-keygen -y [-f input_keyfile]</span><br><span class="line"> ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]</span><br><span class="line"> ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]</span><br><span class="line"> ssh-keygen -B [-f input_keyfile]</span><br><span class="line"> ssh-keygen -D pkcs11</span><br><span class="line"> ssh-keygen -F hostname [-f known_hosts_file] [-l]</span><br><span class="line"> ssh-keygen -H [-f known_hosts_file]</span><br><span class="line"> ssh-keygen -R hostname [-f known_hosts_file]</span><br><span class="line"> ssh-keygen -r hostname [-f input_keyfile] [-g]</span><br><span class="line"> ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]</span><br><span class="line"> ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]</span><br><span class="line"> [-j start_line] [-K checkpt] [-W generator]</span><br><span class="line"> ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]</span><br><span class="line"> [-O option] [-V validity_interval] [-z serial_number] file ...</span><br><span class="line"> ssh-keygen -L [-f input_keyfile]</span><br><span class="line"> ssh-keygen -A</span><br><span class="line"> ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]</span><br><span class="line"> file ...</span><br><span class="line"> ssh-keygen -Q -f krl_file file ...</span><br></pre></td></tr></table></figure><p><code>-t</code> 指定要创建的密钥类型,如:<code>-t dsa | ecdsa | ed25519 | rsa | rsa1</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t ecdsa</span><br><span class="line">Generating public/private ecdsa key pair.</span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/c/Users/Administrator/.ssh/id_ecdsa):</span><br></pre></td></tr></table></figure><p><code>-b</code> <em>bits</em> 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -b 4096</span><br><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/c/Users/Administrator/.ssh/id_rsa):</span><br></pre></td></tr></table></figure><p><code>-C</code> <em>comment</em> 提供一个注释。生成<code>git</code>密钥的时候都会要求注释中写入邮箱名字。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -b 4096 -C <span class="string">"your_email@example.com"</span></span><br><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/c/Users/Administrator/.ssh/id_rsa): your_email <span class="comment">#如果需要指定生成的文件名,就输入,否则就回车</span></span><br><span class="line">Enter passphrase (empty <span class="keyword">for</span> no passphrase):</span><br><span class="line">Enter same passphrase again:</span><br><span class="line">Your identification has been saved <span class="keyword">in</span> jerry.myoss.</span><br><span class="line">Your public key has been saved <span class="keyword">in</span> jerry.myoss.pub.</span><br><span class="line">The key fingerprint is:</span><br><span class="line">SHA256:zIF+Fqb8qIJsHq1nBV07DTuOvF6ucxhaaIBZcIk2/uE jerry.myoss@gmail.com</span><br><span class="line">The key<span class="string">'s randomart image is:</span></span><br><span class="line"><span class="string">+---[RSA 4096]----+</span></span><br><span class="line"><span class="string">|.o.. |</span></span><br><span class="line"><span class="string">|.+o + |</span></span><br><span class="line"><span class="string">|+o. . o O |</span></span><br><span class="line"><span class="string">|oo o + X + |</span></span><br><span class="line"><span class="string">| + = * S |</span></span><br><span class="line"><span class="string">| .E * * |</span></span><br><span class="line"><span class="string">|.o..+ =.. |</span></span><br><span class="line"><span class="string">|.o++ =o. |</span></span><br><span class="line"><span class="string">|ooo.oo+. |</span></span><br><span class="line"><span class="string">+----[SHA256]-----+</span></span><br></pre></td></tr></table></figure><p><code>-f</code> <em>filename</em> 指定密钥文件名</p><p><code>-l</code> 显示公钥文件的指纹数据。它也支持 RSA1 的私钥。对于RSA和DSA密钥,将会寻找对应的公钥文件,然后显示其指纹数据。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -lf id_rsa.pub</span><br><span class="line">2048 SHA256:Ie1oJx+a9+iqZk1OUnUrJVH2e/aRFbGcfLvpG7YNJBY your_email@example.com (RSA)</span><br></pre></td></tr></table></figure><p><code>-E</code> 用md5的方式查看指纹数据</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -E md5 -lf id_rsa.pub</span><br><span class="line">2048 MD5:8a:f4:c3:8f:11:53:c9:12:a6:c0:3f:b9:70:a6:84:65 your_email@example.com (RSA)</span><br></pre></td></tr></table></figure><hr><h3 id="ssh密钥常见问题"><a href="#ssh密钥常见问题" class="headerlink" title="ssh密钥常见问题"></a>ssh密钥常见问题</h3><h4 id="Permissions-0644-for-‘-root-ssh-id-rsa’-are-too-open"><a href="#Permissions-0644-for-‘-root-ssh-id-rsa’-are-too-open" class="headerlink" title="Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open"></a>Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 workspace]<span class="comment"># git clone git@github.com:myoss/profile.git</span></span><br><span class="line">Initialized empty Git repository <span class="keyword">in</span> /root/workspace/profile/.git/</span><br><span class="line">The authenticity of host <span class="string">'github.com (192.30.252.128)'</span> can<span class="string">'t be established.</span></span><br><span class="line"><span class="string">RSA key fingerprint is 16:27:ac:b5:76:28:2d:37:63:1b:56:3d:sb:df:a6:68.</span></span><br><span class="line"><span class="string">Are you sure you want to continue connecting (yes/no)? yes</span></span><br><span class="line"><span class="string">Warning: Permanently added '</span>github.com,192.30.252.128<span class="string">' (RSA) to the list of known hosts.</span></span><br><span class="line"><span class="string">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span></span><br><span class="line"><span class="string">@ WARNING: UNPROTECTED PRIVATE KEY FILE! @</span></span><br><span class="line"><span class="string">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span></span><br><span class="line"><span class="string">Permissions 0644 for '</span>/root/.ssh/id_rsa<span class="string">' are too open.</span></span><br><span class="line"><span class="string">It is required that your private key files are NOT accessible by others.</span></span><br><span class="line"><span class="string">This private key will be ignored.</span></span><br><span class="line"><span class="string">bad permissions: ignore key: /root/.ssh/id_rsa</span></span><br><span class="line"><span class="string">Permission denied (publickey).</span></span><br><span class="line"><span class="string">fatal: The remote end hung up unexpectedly</span></span><br></pre></td></tr></table></figure><p>出现以上的错误,需要将私钥的权限降级到<code>0600</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 workspace]<span class="comment"># chmod 0600 ~/.ssh/id_rsa</span></span><br></pre></td></tr></table></figure><hr><h3 id="多个公钥与服务器上不同的GIT帐号交互"><a href="#多个公钥与服务器上不同的GIT帐号交互" class="headerlink" title="多个公钥与服务器上不同的GIT帐号交互"></a>多个公钥与服务器上不同的GIT帐号交互</h3><p>国外很有名的:<code>github.com</code>,国内:<code>git.oschina.net</code>等等,我们可能会在上面注册多个账户,但是如何使用不同的公钥了?</p><h4 id="生成不同账户的密钥"><a href="#生成不同账户的密钥" class="headerlink" title="生成不同账户的密钥"></a>生成不同账户的密钥</h4><p>假设我现在有2个<code>Github</code>账户,账户名分别是:<code>jerry1</code>和<code>jerry2</code>,我先在本地生成两个密钥,然后将密钥的公钥分别添加到<code>Github</code>账户中</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -b 4096 -C <span class="string">"jerry1@myoss.com"</span></span><br><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/c/Users/Administrator/.ssh/id_rsa): jerry1_rsa</span><br><span class="line"></span><br><span class="line">$ ssh-keygen -t rsa -b 4096 -C <span class="string">"jerry2@myoss.com"</span></span><br><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/c/Users/Administrator/.ssh/id_rsa): jerry2_rsa</span><br></pre></td></tr></table></figure><h4 id="添加公钥到服务器的账户中"><a href="#添加公钥到服务器的账户中" class="headerlink" title="添加公钥到服务器的账户中"></a>添加公钥到服务器的账户中</h4><p>将刚才生成的两个公钥,分别添加到<code>github.com</code>中(其它的网站也类似)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ cat jerry1_rsa.pub <span class="comment">#复制下面输出的内容,添加到github账户中</span></span><br><span class="line">ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC+vhrJRJZHJnLB/hu+4M1WJpWv+VICFUE1P/spsuPE6VZuCsTi/QfO5g9/ekxKgaw0vZs6F568UQbZQV+u3c88t0YWbp6VlvgsPPjJAUw96UkLswMJRmfkwPkZdmrwv5xjLW6eC3xrV0jnZfwzVJl0OHuBMLwfYCwrRjKo8n1dqiQWaAFI6STJpYwj9862o+Bob86h+CQl5CpKsSViyhnHcdrSC498fYptkd2CbaQ8IL0ShLdi/uJAHbVv1cGRyDe/pHpfg9/exJWr9E8zmBHJ1rVYNXWcSJQiaB8sJ2Gqx/Lr8sW3iDaavJEw3y3agx5XWyPG8FDh60g/VHR9PURlkpO28jl8whxiVZbCXUreRZZQy3VCMY+JP73lXsb6a8YJ00PsM5OdTDm1PRQCPUxq492PbysSNeS+k7/RiOSBp1CE1xuWGhvJiZdNAF8pcxxe4Hvbg06PvoDIiyPl6Q0w6N//MNIjiVAJlb8+4Lqdo/EG96QtR8hjGi5j2Pkf2UU6PcmH1Cgb28xNwKorris4JUfHoYq9d7hQBpFOraSzsgM/M7x9QRYLi/3Up8aSXSbbHNrLN4gbIlEjEyb+AjG2WXSAkFNYr6LSRXa3V6KTLttR9Cxqo85WOsdQpJYjeeZVocfWlUkHwl3pSh/x/8GAkAj1J+XenGoJvc+upL13xw== jerry1@myoss.com</span><br><span class="line"></span><br><span class="line">$ cat jerry2_rsa.pub</span><br><span class="line">ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDKn5jvaHbKnnZqDqDXpaos9CZZKWgdfYKK+oUWJ88hfjuD9GQOXcK23xedRQ8fXGGnuvNjjsKFHeJZOP70pSflQIladi6ZG2vNWtieDoWWfS65f8fEFd5kN7OS4GA9K7DHZkzr+IYm5tPjq9Znwvml2xN51BlJoqo0UUhPRKE+v7or3tqSS155LuEDyRBvHxA8TKeIK7TM80E2WDVaVzXvEFdgT5s3JrzmzVhgFjjJTS2dpER3DqSyhB168gMEE4Lhh+D+68vR6ED/7eFst0g7bBC5f8lAmAs7bWOFVKFkFTzOQj8nL4XM9ACZyCvgDMakLpOntQa/W9l4Av0FS5XFpMxm1Qza+SDycwIGYgAMDpiEiIzcuPiMFckGk8CV5C7ziV9oU+OZTYChskrnahaOJRZNvjGN/Y7kUIXjybgQUqwj25qxbmwXivT9OObKNtdT8lQZLdFPgBosT62aW0MpDKGg8JTGDG4IDfIXnOizz6PTT9s7XuIYFi23vsScFG/yttm7cUDsUKn9HI5bjv0u0YE7Q1oYYXZmq7ZdbJ5QgTjCY3OJhT+wZpiLdFdLFplj+OVT29PRVxB01njGqmuXrpij/AP9V3Hr2l7NM12xc597jOoDwBLHgxvt93jAzQTgsxalE0ZU73P/8ohnngWQiAi/vXe4oh8la7kj3gpe5Q== jerry2@myoss.com</span><br></pre></td></tr></table></figure><h4 id="配置ssh的config文件"><a href="#配置ssh的config文件" class="headerlink" title="配置ssh的config文件"></a>配置ssh的config文件</h4><p>在用户家目录的<code>.ssh</code>中,创建或者编辑文件<code>config</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">$ cat ~/.ssh/config</span><br><span class="line">Host jerry1-github</span><br><span class="line">HostName github.com</span><br><span class="line">user git</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/jerry1_rsa</span><br><span class="line"></span><br><span class="line">Host jerry2-github</span><br><span class="line">HostName github.com</span><br><span class="line">user git</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/jerry2_rsa</span><br></pre></td></tr></table></figure><h4 id="测试是否能连接git服务器"><a href="#测试是否能连接git服务器" class="headerlink" title="测试是否能连接git服务器"></a>测试是否能连接git服务器</h4><p>不输出错误信息,即连接成功。如果不是<code>github</code>账户,输出的信息和下面会不同</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ ssh -T jerry1-github</span><br><span class="line">Hi jerry1! You<span class="string">'ve successfully authenticated, but GitHub does not provide shell access.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">$ ssh -T jerry2-github</span></span><br><span class="line"><span class="string">Hi jerry2! You'</span>ve successfully authenticated, but GitHub does not provide shell access.</span><br></pre></td></tr></table></figure><h4 id="git服务器的仓库地址"><a href="#git服务器的仓库地址" class="headerlink" title="git服务器的仓库地址"></a>git服务器的仓库地址</h4><p><code>github</code>中默认ssh方式的项目地址类似如下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git@github.com:github的用户名/github的项目名字.git</span><br><span class="line"></span><br><span class="line">git@github.com:myoss/profile.git <span class="comment">#比如:这是我的账户中的profile项目</span></span><br></pre></td></tr></table></figure><p>这是时候克隆的ssh地址需要稍作改变</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">config文件中配置的Host名字:github的用户名/github的项目名字.git</span><br><span class="line"></span><br><span class="line">git <span class="built_in">clone</span> jerry1-github:jerry1/github的项目名字.git <span class="comment">#GitHub中jerry1的某某项目</span></span><br><span class="line"></span><br><span class="line">git <span class="built_in">clone</span> jerry2-github:jerry2/github的项目名字.git <span class="comment">#GitHub中jerry2的某某项目</span></span><br></pre></td></tr></table></figure><p>如果你的项目已经克隆到本地磁盘了,那么就修改下远程仓库的地址</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git remote <span class="built_in">set</span>-url <仓库的简写名字> <新的仓库地址></span><br><span class="line"></span><br><span class="line">git remote <span class="built_in">set</span>-url origin jerry1-github:jerry1/github的项目名字.git</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h3 id="ssh-keygen-使用"><a href="#ssh-keygen-使用" class="headerlink" title="ssh-keygen 使用"></a>ssh-keygen 使用</h3><p>生成、管理和转换认证密钥</p>
</summary>
<category term="linux" scheme="https://blog.myoss.app/categories/linux/"/>
<category term="ssh" scheme="https://blog.myoss.app/categories/linux/ssh/"/>
<category term="git" scheme="https://blog.myoss.app/categories/linux/ssh/git/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
<category term="linux" scheme="https://blog.myoss.app/tags/linux/"/>
</entry>
<entry>
<title>linux 常用命令</title>
<link href="https://blog.myoss.app/2016/linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/"/>
<id>https://blog.myoss.app/2016/linux-常用命令/</id>
<published>2016-02-28T08:56:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h3 id="开关机"><a href="#开关机" class="headerlink" title="开关机"></a>开关机</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">shutdown -d now <span class="comment">#立即关机</span></span><br><span class="line">reboot <span class="comment">#重启</span></span><br></pre></td></tr></table></figure><h3 id="开机模式切换"><a href="#开机模式切换" class="headerlink" title="开机模式切换"></a>开机模式切换</h3><p>设置开机之后,进入到何种模式(图像界面、单用户、多用户等)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># vi /etc/inittab </span></span><br><span class="line"><span class="comment"># inittab is only used by upstart for the default runlevel.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># System initialization is started by /etc/init/rcS.conf</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Individual runlevels are started by /etc/init/rc.conf</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,</span></span><br><span class="line"><span class="comment"># with configuration in /etc/sysconfig/init.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># For information on how to write upstart event handlers, or how</span></span><br><span class="line"><span class="comment"># upstart works, see init(5), init(8), and initctl(8).</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Default runlevel. The runlevels used are:</span></span><br><span class="line"><span class="comment"># 0 - halt (Do NOT set initdefault to this)</span></span><br><span class="line"><span class="comment"># 1 - Single user mode 单用户命令行模式</span></span><br><span class="line"><span class="comment"># 2 - Multiuser, without NFS (The same as 3, if you do not have networking)</span></span><br><span class="line"><span class="comment"># 3 - Full multiuser mode 完整的多用户命令行模式</span></span><br><span class="line"><span class="comment"># 4 - unused</span></span><br><span class="line"><span class="comment"># 5 - X11 图形界面</span></span><br><span class="line"><span class="comment"># 6 - reboot (Do NOT set initdefault to this)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">id:3:initdefault:</span><br></pre></td></tr></table></figure><p>从命令行模式切换到图形界面,需要在能够直接连接主机的地方(比如:VMware)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># startx</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># init 5 #可能不起作用</span></span><br></pre></td></tr></table></figure><p>在<code>VMware</code>虚拟主机模式下,从图形界面切换到命令行模式</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">windows系统快捷键:ctrl + alt + F1</span><br><span class="line"></span><br><span class="line">[root@linux1 ~]# init 3 #可能不起作用</span><br></pre></td></tr></table></figure><a id="more"></a><h3 id="shell命令"><a href="#shell命令" class="headerlink" title="shell命令"></a>shell命令</h3><p><code>Shell</code>是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。<br>实际上<code>Shell</code>是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 /]<span class="comment"># echo $SHELL #查看当前环境使用的shell命令解释器</span></span><br><span class="line">/bin/bash</span><br></pre></td></tr></table></figure><h3 id="用户家目录"><a href="#用户家目录" class="headerlink" title="用户家目录"></a>用户家目录</h3><p><code>root</code>用户的家目录和其它账户的家目录位置不一样。<code>$HOME</code>和<code>~</code>都能代表当前用户的家目录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 /]<span class="comment"># echo $HOME #查看当前用户的家目录</span></span><br><span class="line">/root</span><br><span class="line">[jerry@linux1 /]$ <span class="built_in">cd</span> ~ <span class="comment">#切换目录为当前用户的家目录</span></span><br><span class="line">[jerry@linux1 /]$ <span class="built_in">pwd</span> <span class="comment">#查看当前目录</span></span><br><span class="line">/home/jerry</span><br></pre></td></tr></table></figure><h3 id="su命令"><a href="#su命令" class="headerlink" title="su命令"></a>su命令</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[jerry@linux1 /]$ su - root <span class="comment">#切换用户为:root</span></span><br><span class="line">Password:</span><br></pre></td></tr></table></figure><h3 id="id命令"><a href="#id命令" class="headerlink" title="id命令"></a>id命令</h3><p><code>id</code>命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID是对一个用户的单一身份标识。组ID(GID)则对应多个UID。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># id</span></span><br><span class="line">uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023</span><br></pre></td></tr></table></figure><h3 id="uname命令"><a href="#uname命令" class="headerlink" title="uname命令"></a>uname命令</h3><p><code>uname</code>是Linux命令用途显示当前操作系统名称</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># uname</span></span><br><span class="line">Linux</span><br><span class="line">[root@linux1 ~]<span class="comment"># uname -a</span></span><br><span class="line">Linux linux1.jerry.com 2.6.32-504.el6.x86_64 <span class="comment">#1 SMP Tue Sep 16 01:56:35 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># uname -n</span></span><br><span class="line">linux1.jerry.com</span><br><span class="line">[root@linux1 ~]<span class="comment"># uname -in</span></span><br><span class="line">linux1.jerry.com x86_64</span><br><span class="line">[root@linux1 ~]<span class="comment"># uname -i</span></span><br><span class="line">x86_64</span><br><span class="line">[root@linux1 ~]<span class="comment"># uname -r</span></span><br><span class="line">2.6.32-504.el6.x86_64</span><br><span class="line">[root@linux1 ~]<span class="comment"># uname -s</span></span><br><span class="line">Linux</span><br><span class="line">[root@linux1 ~]<span class="comment"># uname -rs</span></span><br><span class="line">Linux 2.6.32-504.el6.x86_64</span><br></pre></td></tr></table></figure><h3 id="date命令"><a href="#date命令" class="headerlink" title="date命令"></a>date命令</h3><p><code>date</code>命令打印或设置系统日期和时间</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># date</span></span><br><span class="line">Mon Feb 29 21:42:48 CST 2016</span><br></pre></td></tr></table></figure><h3 id="连续执行多条命令"><a href="#连续执行多条命令" class="headerlink" title="连续执行多条命令"></a>连续执行多条命令</h3><p>如果每个命令被<code>;</code>所分隔,那么命令会连续的执行下去</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># date; uname</span></span><br><span class="line">Mon Feb 29 21:44:18 CST 2016</span><br><span class="line">Linux</span><br><span class="line">[root@linux1 ~]<span class="comment"># date; unamed; ls #第二条命令出错了,但是第三天命令还是会执行</span></span><br><span class="line">Mon Feb 29 21:47:42 CST 2016</span><br><span class="line">-bash: unamed: <span class="built_in">command</span> not found</span><br><span class="line">anaconda-ks.cfg Documents install.log Music Public Videos</span><br><span class="line">Desktop Downloads install.log.syslog Pictures Templates</span><br></pre></td></tr></table></figure><p>如果每个命令被<code>&&</code>分隔,那么这些命令会一直执行下去,如果中间有错误的命令存在,则不再执行后面的命令,没错则执行到完为止</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># date&& unamed&& ls</span></span><br><span class="line">Mon Feb 29 21:49:05 CST 2016</span><br><span class="line">-bash: unamed: <span class="built_in">command</span> not found</span><br></pre></td></tr></table></figure><p>如果每个命令被<code>||</code>分隔,如果命令遇到可以成功执行的命令,那么命令停止执行,即使后面还有正确的命令则后面的所有命令都将得不到执行。假如命令一开始就执行失败,那么就会执行<code>||</code>后的下一个命令,直到遇到有可以成功执行的命令为止,假如所有的都失败,则所有这些失败的命令都会被尝试执行一次</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># date || unamed || ls</span></span><br><span class="line">Mon Feb 29 21:50:58 CST 2016</span><br><span class="line">[root@linux1 ~]<span class="comment"># unamed || date || ls</span></span><br><span class="line">-bash: unamed: <span class="built_in">command</span> not found</span><br><span class="line">Mon Feb 29 21:51:12 CST 2016</span><br><span class="line">[root@linux1 ~]<span class="comment"># unamed || dated || lsd</span></span><br><span class="line">-bash: unamed: <span class="built_in">command</span> not found</span><br><span class="line">-bash: dated: <span class="built_in">command</span> not found</span><br><span class="line">-bash: lsd: <span class="built_in">command</span> not found</span><br></pre></td></tr></table></figure><h3 id="man命令操作手册"><a href="#man命令操作手册" class="headerlink" title="man命令操作手册"></a>man命令操作手册</h3><p>Linux系统提供了相对比较丰富的帮助手册(man),man是manual的缩写,在日常linux系统管理中经常用到</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">man ls</span><br></pre></td></tr></table></figure><h4 id="快捷键操作"><a href="#快捷键操作" class="headerlink" title="快捷键操作"></a>快捷键操作</h4><ul><li>下一页<ul><li>空格键</li><li>回车键</li></ul></li><li>上一页<ul><li>B键</li></ul></li></ul><h4 id="搜索"><a href="#搜索" class="headerlink" title="搜索"></a>搜索</h4><p>输入<code>/bala</code>向下搜索字符串<code>bala</code>,输入<code>?bala</code>向上搜索字符串<code>bala</code>。<br><code>N键</code>继续关键字的下一个搜索,<code>N键</code>反向搜索关键字。</p><h4 id="退出man"><a href="#退出man" class="headerlink" title="退出man"></a>退出man</h4><p><code>Q键</code>退出<code>man</code>命令</p><h3 id="stat命令"><a href="#stat命令" class="headerlink" title="stat命令"></a>stat命令</h3><p><code>stat</code>打印信息节点(inode)内容 </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># stat Videos/</span></span><br><span class="line"> File: `Videos/<span class="string">'</span></span><br><span class="line"><span class="string"> Size: 4096 Blocks: 8 IO Block: 4096 directory</span></span><br><span class="line"><span class="string">Device: fd00h/64768d Inode: 275645 Links: 2</span></span><br><span class="line"><span class="string">Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)</span></span><br><span class="line"><span class="string">Access: 2015-12-28 06:34:48.950999982 +0800</span></span><br><span class="line"><span class="string">Modify: 2015-12-28 06:34:48.950999982 +0800</span></span><br><span class="line"><span class="string">Change: 2015-12-28 06:34:48.950999982 +0800</span></span><br><span class="line"><span class="string">[root@linux1 ~]# stat Public/</span></span><br><span class="line"><span class="string"> File: `Public/'</span></span><br><span class="line"> Size: 4096 Blocks: 8 IO Block: 4096 directory</span><br><span class="line">Device: fd00h/64768d Inode: 275641 Links: 2</span><br><span class="line">Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)</span><br><span class="line">Access: 2015-12-28 06:34:48.950999982 +0800</span><br><span class="line">Modify: 2015-12-28 06:34:48.950999982 +0800</span><br><span class="line">Change: 2015-12-28 06:34:48.950999982 +0800</span><br></pre></td></tr></table></figure><h3 id="more命令"><a href="#more命令" class="headerlink" title="more命令"></a>more命令</h3><p><code>more</code>在显示器上阅读文件的过滤器, 用于分页显示 (一次一屏) 文本. 这个版本非常基本. <code>less</code>提供了<code>more</code>的模拟, 并且做了增强</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># more install.log #查看文件,一次一屏</span></span><br></pre></td></tr></table></figure><h4 id="快捷键操作-1"><a href="#快捷键操作-1" class="headerlink" title="快捷键操作"></a>快捷键操作</h4><ul><li>下一页<ul><li>空格键</li></ul></li><li>上一页<ul><li>B键</li></ul></li><li>下一行<ul><li>回车键</li></ul></li><li>退出<ul><li>Q键</li></ul></li></ul><h3 id="less命令"><a href="#less命令" class="headerlink" title="less命令"></a>less命令</h3><p><code>less</code>与<code>more</code>类似,但使用<code>less</code>可以更方便随意浏览文件,<code>less</code>在查看之前不会加载整个文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># ps -ef | less #ps查看进程信息并通过less分页显示</span></span><br></pre></td></tr></table></figure><h4 id="快捷键操作-2"><a href="#快捷键操作-2" class="headerlink" title="快捷键操作"></a>快捷键操作</h4><ul><li>下一页<ul><li>空格键</li></ul></li><li>上一页<ul><li>B键</li></ul></li><li>下一行<ul><li>回车键</li><li>方向键下</li></ul></li><li>上一行<ul><li>方向键上</li></ul></li><li>退出<ul><li>Q键</li></ul></li></ul><h4 id="搜索-1"><a href="#搜索-1" class="headerlink" title="搜索"></a>搜索</h4><p>输入<code>/bala</code>向下搜索字符串<code>bala</code>,输入<code>?bala</code>向上搜索字符串<code>bala</code>。<br><code>N键</code>继续关键字的下一个搜索,<code>N键</code>反向搜索关键字。</p><h3 id="head命令"><a href="#head命令" class="headerlink" title="head命令"></a>head命令</h3><p>在标准输出上显示每个FILE的起始10行。如果多于一个FILE,则一个接一个地显示,并且在每个文件显示的首部给出文件名。如果没有FILE或者FILE为-,那么就从标准输入上读取</p><p><code>-c, --bytes=[-]K</code> 显示起始的SIZE字节。<code>b</code>表示512, <code>kB</code>表示1000, <code>K</code>表示1024, <code>MB</code>表示1000<em>1000, <code>M</code>表示1024</em>1024, <code>GB</code>表示1000<em>1000</em>1000, <code>G</code>表示1024<em>1024</em>1024</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># head --bytes=1k install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># head -c 1k install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># head -c 1m install.log</span></span><br></pre></td></tr></table></figure><p><code>-n, --lines=[-]K</code> 显示起始的NUMBER行,而非默认的起始10行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># head -n 2 install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># head --lines 2 install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># head --lines=2 install.log</span></span><br></pre></td></tr></table></figure><p><code>-q, --quiet, --silent</code> 当输出多个文件的时候才会显示出差异,不输出文件名的首部</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># head install.log install.log.syslog -n 2</span></span><br><span class="line">==> install.log <== <span class="comment">#输出了文件的名字</span></span><br><span class="line">Installing libgcc-4.4.7-11.el6.x86_64</span><br><span class="line">warning: libgcc-4.4.7-11.el6.x86_64: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY</span><br><span class="line"></span><br><span class="line">==> install.log.syslog <== <span class="comment">#输出了文件的名字</span></span><br><span class="line"><86>Dec 28 06:01:22 groupadd[1541]: group added to /etc/group: name=dbus, GID=81</span><br><span class="line"><86>Dec 28 06:01:22 groupadd[1541]: group added to /etc/gshadow: name=dbus</span><br><span class="line">[root@linux1 ~]<span class="comment">#</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># head install.log install.log.syslog -q -n 2 #没有输出文件的名字</span></span><br><span class="line">Installing libgcc-4.4.7-11.el6.x86_64</span><br><span class="line">warning: libgcc-4.4.7-11.el6.x86_64: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY</span><br><span class="line"><86>Dec 28 06:01:22 groupadd[1541]: group added to /etc/group: name=dbus, GID=81</span><br><span class="line"><86>Dec 28 06:01:22 groupadd[1541]: group added to /etc/gshadow: name=dbus</span><br></pre></td></tr></table></figure><h3 id="tail命令"><a href="#tail命令" class="headerlink" title="tail命令"></a>tail命令</h3><p>在标准输出上显示每个FILE的最后10行。如果多于一个FILE,会一个接一个地显示,并在每个文件显示的首部给出文件名。如果没有FILE,或者FILE是-,那么就从标准输入上读取</p><p><code>-c, --bytes=[-]K</code> 显示最后的SIZE字节。<code>b</code>表示512, <code>kB</code>表示1000, <code>K</code>表示1024, <code>MB</code>表示1000<em>1000, <code>M</code>表示1024</em>1024, <code>GB</code>表示1000<em>1000</em>1000, <code>G</code>表示1024<em>1024</em>1024</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># tail --bytes=1k install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># tail -c 1k install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># tail -c 1m install.log</span></span><br></pre></td></tr></table></figure><p><code>-n, --lines=[-]K</code> 显示最后的NUMBER行,而非默认的最后10行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># tail -n 2 install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># tail --lines 2 install.log</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># tail --lines=2 install.log</span></span><br></pre></td></tr></table></figure><p><code>-f, --follow[={name|descriptor}]</code> 当文件增长时,输出后续添加的数据;<code>-f, --follow</code>以及<code>--follow=descriptor</code>都是相同的意思。常用于查看日志文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># tail -f install.log</span></span><br></pre></td></tr></table></figure><p><code>--retry</code> 即使<code>tail</code>开始时就不能访问或者在<code>tail</code>运行后不能访问,也仍然不停地尝试打开文件。<code>--</code>只与<code>-f</code>合用时有用</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># tail -f --retry kawaii.log</span></span><br><span class="line">tail: warning: --retry only effective <span class="keyword">for</span> the initial open</span><br><span class="line">tail: cannot open ‘logs/kawaii.log’ <span class="keyword">for</span> reading: No such file or directory</span><br><span class="line">tail: ‘logs/kawaii.log’ has appeared; following end of new file</span><br><span class="line">2016-03-02 20:45:58,525 [pool-2-thread-1] INFO bala</span><br></pre></td></tr></table></figure><p><code>-q, --quiet, --silent</code> 当输出多个文件的时候才会显示出差异,不输出文件名的首部</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># tail install.log install.log.syslog -n 2</span></span><br><span class="line">==> install.log <== <span class="comment">#输出了文件的名字</span></span><br><span class="line">Installing compat-libstdc++-296-2.96-144.el6.i686</span><br><span class="line">*** FINISHED INSTALLING PACKAGES ***</span><br><span class="line">==> install.log.syslog <== <span class="comment">#输出了文件的名字</span></span><br><span class="line"><86>Dec 28 06:10:27 groupadd[4346]: group added to /etc/gshadow: name=slocate</span><br><span class="line"><86>Dec 28 06:10:27 groupadd[4346]: new group: name=slocate, GID=21</span><br><span class="line">[root@linux1 ~]<span class="comment">#</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># tail install.log install.log.syslog -q -n 2 #没有输出文件的名字</span></span><br><span class="line">Installing compat-libstdc++-296-2.96-144.el6.i686</span><br><span class="line">*** FINISHED INSTALLING PACKAGES ***<86>Dec 28 06:10:27 groupadd[4346]: group added to /etc/gshadow: name=slocate</span><br><span class="line"><86>Dec 28 06:10:27 groupadd[4346]: new group: name=slocate, GID=21</span><br></pre></td></tr></table></figure><h3 id="cp命令"><a href="#cp命令" class="headerlink" title="cp命令"></a>cp命令</h3><p><code>cp</code>复制文件(或者目录等)。可以使用这个命令复制一个文件到一个指定的目的地,或者复制任意多个文件到一个目的目录目录</p><p>如果最后一个命令参数为一个已经存在的目录名,<code>cp</code>会将每一个源文件复制到那个目录下(维持原文件名)。如果所给的参数只有两个文件名,它把前一个文件复制到后一个文件上。如果最后一个参数不是文件名、目录名和给出多于两个非选项参数,这是错误的语法</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Desktop]<span class="comment"># ll</span></span><br><span class="line">total 4</span><br><span class="line">-rw-r--r--. 1 root root 9 Mar 2 21:27 test.txt</span><br><span class="line">[root@linux1 Desktop]<span class="comment"># cp test.txt test2.txt</span></span><br><span class="line">[root@linux1 Desktop]<span class="comment"># ll</span></span><br><span class="line">total 8</span><br><span class="line">-rw-r--r--. 1 root root 9 Mar 2 21:28 test2.txt</span><br><span class="line">-rw-r--r--. 1 root root 9 Mar 2 21:27 test.txt</span><br></pre></td></tr></table></figure><p><code>-p</code> 保留原文件的所有者、组、权限(包括<code>setuid</code>和<code>setgid</code>位),上次修改时间和上次访问时间。如果制作所有者或组信息的副本时出错,则<code>setuid</code>和<code>setgid</code>位被清空。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Desktop]<span class="comment"># cp test.txt test3.txt -p</span></span><br><span class="line">[root@linux1 Desktop]<span class="comment"># ll</span></span><br><span class="line">total 12</span><br><span class="line">-rw-r--r--. 1 root root 9 Mar 2 21:28 test2.txt</span><br><span class="line">-rw-r--r--. 1 root root 9 Mar 2 21:27 test3.txt</span><br><span class="line">-rw-r--r--. 1 root root 9 Mar 2 21:27 test.txt</span><br></pre></td></tr></table></figure><p><code>-i</code> 提示是否覆盖已经存在的目标文件。在<code>ReadHat linux</code>系统里,<code>cp</code>命令默认添加了<code>-i</code>选项</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Desktop]<span class="comment"># alias cp</span></span><br><span class="line"><span class="built_in">alias</span> cp=<span class="string">'cp -i'</span></span><br></pre></td></tr></table></figure><p><code>-R, -r</code> 递归复制目录</p><p><code>-v, --verbose</code> 在复制前印出文件名</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Desktop]<span class="comment"># cp test.txt test3.txt -v</span></span><br><span class="line">cp: overwrite `test3.txt<span class="string">'? y</span></span><br><span class="line"><span class="string">`test.txt'</span> -> `test3.txt<span class="string">'</span></span><br></pre></td></tr></table></figure><p><code>-n</code> 不覆盖已经存在的目标文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Desktop]<span class="comment"># cp test.txt test3.txt -v -n</span></span><br><span class="line">[root@linux1 Desktop]<span class="comment">#</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h3 id="开关机"><a href="#开关机" class="headerlink" title="开关机"></a>开关机</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">shutdown -d now <span class="comment">#立即关机</span></span><br><span class="line">reboot <span class="comment">#重启</span></span><br></pre></td></tr></table></figure>
<h3 id="开机模式切换"><a href="#开机模式切换" class="headerlink" title="开机模式切换"></a>开机模式切换</h3><p>设置开机之后,进入到何种模式(图像界面、单用户、多用户等)</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># vi /etc/inittab </span></span><br><span class="line"><span class="comment"># inittab is only used by upstart for the default runlevel.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># System initialization is started by /etc/init/rcS.conf</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Individual runlevels are started by /etc/init/rc.conf</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,</span></span><br><span class="line"><span class="comment"># with configuration in /etc/sysconfig/init.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># For information on how to write upstart event handlers, or how</span></span><br><span class="line"><span class="comment"># upstart works, see init(5), init(8), and initctl(8).</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Default runlevel. The runlevels used are:</span></span><br><span class="line"><span class="comment"># 0 - halt (Do NOT set initdefault to this)</span></span><br><span class="line"><span class="comment"># 1 - Single user mode 单用户命令行模式</span></span><br><span class="line"><span class="comment"># 2 - Multiuser, without NFS (The same as 3, if you do not have networking)</span></span><br><span class="line"><span class="comment"># 3 - Full multiuser mode 完整的多用户命令行模式</span></span><br><span class="line"><span class="comment"># 4 - unused</span></span><br><span class="line"><span class="comment"># 5 - X11 图形界面</span></span><br><span class="line"><span class="comment"># 6 - reboot (Do NOT set initdefault to this)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">id:3:initdefault:</span><br></pre></td></tr></table></figure>
<p>从命令行模式切换到图形界面,需要在能够直接连接主机的地方(比如:VMware)</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># startx</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># init 5 #可能不起作用</span></span><br></pre></td></tr></table></figure>
<p>在<code>VMware</code>虚拟主机模式下,从图形界面切换到命令行模式</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">windows系统快捷键:ctrl + alt + F1</span><br><span class="line"></span><br><span class="line">[root@linux1 ~]# init 3 #可能不起作用</span><br></pre></td></tr></table></figure>
</summary>
<category term="linux" scheme="https://blog.myoss.app/categories/linux/"/>
<category term="linux" scheme="https://blog.myoss.app/tags/linux/"/>
</entry>
<entry>
<title>linux 修改hostname</title>
<link href="https://blog.myoss.app/2016/linux-%E4%BF%AE%E6%94%B9hostname/"/>
<id>https://blog.myoss.app/2016/linux-修改hostname/</id>
<published>2016-02-28T08:24:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h3 id="立即生效,非永久保存"><a href="#立即生效,非永久保存" class="headerlink" title="立即生效,非永久保存"></a>立即生效,非永久保存</h3><p>此种方式修改,会立即生效,但是在重启系统之后会被还原</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># hostname linux2.jerry.com</span></span><br><span class="line">[root@linux1 ~]<span class="comment"># hostname</span></span><br><span class="line">linux2.jerry.com</span><br></pre></td></tr></table></figure><h3 id="重启后生效,永久保存"><a href="#重启后生效,永久保存" class="headerlink" title="重启后生效,永久保存"></a>重启后生效,永久保存</h3><p>此种方式修改,不会立即生效,但在重启之后会生效</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># cat /etc/sysconfig/network</span></span><br><span class="line">NETWORKING=yes</span><br><span class="line">HOSTNAME=linux2.jerry.com</span><br><span class="line">NTPSERVERARGS=iburst</span><br></pre></td></tr></table></figure><h3 id="以上两种方式结合,即能做到立即生效并永久保存"><a href="#以上两种方式结合,即能做到立即生效并永久保存" class="headerlink" title="以上两种方式结合,即能做到立即生效并永久保存"></a>以上两种方式结合,即能做到立即生效并永久保存</h3><h3 id="剖析hostname的设置"><a href="#剖析hostname的设置" class="headerlink" title="剖析hostname的设置"></a>剖析hostname的设置</h3><p><code>hostname</code>是Linux系统下的一个内核参数,它保存在<code>/proc/sys/kernel/hostname</code>下,但是它的值是Linux启动时从<code>rc.sysinit</code>读取的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># vi /etc/rc.d/rc.sysinit </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># /etc/rc.d/rc.sysinit - run once at boot time</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Taken in part from Miquel van Smoorenburg's bcheckrc.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"></span><br><span class="line">HOSTNAME=$(/bin/hostname)</span><br><span class="line"></span><br><span class="line"><span class="built_in">set</span> -m</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ -f /etc/sysconfig/network ]; <span class="keyword">then</span></span><br><span class="line"> . /etc/sysconfig/network</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">if</span> [ -z <span class="string">"<span class="variable">$HOSTNAME</span>"</span> -o <span class="string">"<span class="variable">$HOSTNAME</span>"</span> = <span class="string">"(none)"</span> ]; <span class="keyword">then</span></span><br><span class="line"> HOSTNAME=localhost</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>结论:<code>/etc/sysconfig/network</code>确实是<code>hostname</code>的配置文件,<code>hostname</code>的值跟该配置文件中的<code>HOSTNAME</code>有一定的关联关系,但是没有必然关系,<code>hostname</code>的值来自内核参数<code>/proc/sys/kernel/hostname</code>,如果我通过命令<code>sysctl kernel.hostname=Test</code>修改了内核参数,那么<code>hostname</code>就变为了<code>Test</code>了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># cat /proc/sys/kernel/hostname</span></span><br><span class="line">linux2.jerry.com</span><br><span class="line">[root@linux1 ~]<span class="comment"># sysctl kernel.hostname=Test #修改内核参数</span></span><br><span class="line">kernel.hostname = Test</span><br><span class="line">[root@linux1 ~]<span class="comment"># hostname #hostname已经被修改了</span></span><br><span class="line">Test</span><br><span class="line">[root@linux1 ~]<span class="comment"># cat /proc/sys/kernel/hostname #内核参数也变化了</span></span><br><span class="line">Test</span><br><span class="line">[root@linux1 ~]<span class="comment"># cat /etc/sysconfig/network #hostname的配置文件没有变化</span></span><br><span class="line">NETWORKING=yes</span><br><span class="line">HOSTNAME=linux2.jerry.com</span><br><span class="line">NTPSERVERARGS=iburst</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h3 id="立即生效,非永久保存"><a href="#立即生效,非永久保存" class="headerlink" title="立即生效,非永久保存"></a>立即生效,非永久保存</h3><p>此种方式修改,会立即生效,但是在重启系统之后会被还原</p>
<figure
</summary>
<category term="linux" scheme="https://blog.myoss.app/categories/linux/"/>
<category term="linux" scheme="https://blog.myoss.app/tags/linux/"/>
</entry>
<entry>
<title>linux 网卡设置/虚拟机克隆后网卡启动失败</title>
<link href="https://blog.myoss.app/2016/linux-%E7%BD%91%E5%8D%A1%E8%AE%BE%E7%BD%AE-%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%85%8B%E9%9A%86%E5%90%8E%E7%BD%91%E5%8D%A1%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5/"/>
<id>https://blog.myoss.app/2016/linux-网卡设置-虚拟机克隆后网卡启动失败/</id>
<published>2016-02-28T07:20:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h3 id="静态IP设置"><a href="#静态IP设置" class="headerlink" title="静态IP设置"></a>静态IP设置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># cat /etc/sysconfig/network-scripts/ifcfg-eth0 </span></span><br><span class="line">DEVICE=eth0</span><br><span class="line">NAME=<span class="string">"System eth0"</span></span><br><span class="line">TYPE=Ethernet</span><br><span class="line">UUID=9dc04a99-b654-4673-9b19-5100a2b03c51</span><br><span class="line">NM_CONTROLLED=yes</span><br><span class="line">ONBOOT=yes <span class="comment">#开机自动启用此网卡设置</span></span><br><span class="line">BOOTPROTO=static <span class="comment">#启用静态IP地址</span></span><br><span class="line">IPADDR=192.168.245.201 <span class="comment">#设置IP地址</span></span><br><span class="line">GATEWAY=192.168.245.2 <span class="comment">#设置网关</span></span><br><span class="line">NETMASK=255.255.255.0 <span class="comment">#设置子网掩码</span></span><br><span class="line">DNS1=114.114.114.114 <span class="comment">#设置主DNS</span></span><br><span class="line">HWADDR=00:0C:29:D1:9C:4D <span class="comment">#网卡mac地址</span></span><br><span class="line">PREFIX=24</span><br><span class="line">DEFROUTE=yes</span><br><span class="line">IPV4_FAILURE_FATAL=yes</span><br><span class="line">IPV6INIT=no</span><br><span class="line">LAST_CONNECT=1451228780</span><br><span class="line"></span><br><span class="line">[root@linux1 ~]<span class="comment"># cat /etc/sysconfig/network-scripts/ifcfg-eth0</span></span><br><span class="line">DEVICE=eth0</span><br><span class="line">NAME=<span class="string">"System eth0"</span></span><br><span class="line">TYPE=Ethernet</span><br><span class="line">UUID=9dc04a99-b654-4673-9b19-5100a2b03c51</span><br><span class="line">NM_CONTROLLED=yes</span><br><span class="line">ONBOOT=yes</span><br><span class="line">BOOTPROTO=static</span><br><span class="line">IPADDR=192.168.245.201</span><br><span class="line">GATEWAY=192.168.245.2</span><br><span class="line">NETMASK=255.255.255.0</span><br><span class="line">DNS1=114.114.114.114</span><br><span class="line">HWADDR=00:0C:29:D1:9C:4D</span><br><span class="line">PREFIX=24</span><br><span class="line">DEFROUTE=yes</span><br><span class="line">IPV4_FAILURE_FATAL=yes</span><br><span class="line">IPV6INIT=no</span><br><span class="line">LAST_CONNECT=1451228780</span><br></pre></td></tr></table></figure><h3 id="虚拟机中克隆linux后网卡启动失败"><a href="#虚拟机中克隆linux后网卡启动失败" class="headerlink" title="虚拟机中克隆linux后网卡启动失败"></a>虚拟机中克隆linux后网卡启动失败</h3><p>克隆的linux主机在启动之后,mac地址发生了变化或者冲突了,重启网卡会出现以下错误</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 rules.d]<span class="comment"># service network restart</span></span><br><span class="line">Shutting down loopback interface: [ OK ]</span><br><span class="line">Bringing up loopback interface: [ OK ]</span><br><span class="line">Bringing up interface eth0: Error: No suitable device found: no device found <span class="keyword">for</span> connection <span class="string">'System eth0'</span>.</span><br><span class="line"> [FAILED]</span><br></pre></td></tr></table></figure><p>解决办法:我们需要修改mac地址<br>linux主机启动之后,会多出一个<code>DHCP</code>自动分配的网卡<code>eth1</code>(如果没有,通过图形界面配置一个自动获取IP的网卡),找到<code>HWaddr 00:0C:29:D1:9C:4D</code>这一串信息,我们要用到的是新的网卡mac地址:<code>00:0C:29:D1:9C:4D</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Desktop]<span class="comment"># startx #进入linux图形界面</span></span><br><span class="line">[root@linux1 Desktop]<span class="comment"># ifconfig #查看所有网卡信息</span></span><br><span class="line">eth1 Link encap:Ethernet HWaddr 00:0C:29:D1:9C:4D </span><br><span class="line"> inet6 addr: fe80::20c:29ff:fed1:9c4d/64 Scope:Link</span><br><span class="line"> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1</span><br><span class="line"> RX packets:1574 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line"> TX packets:153 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line"> collisions:0 txqueuelen:1000 </span><br><span class="line"> RX bytes:108954 (106.4 KiB) TX bytes:13586 (13.2 KiB)</span><br><span class="line"></span><br><span class="line">lo Link encap:Local Loopback </span><br><span class="line"> inet addr:127.0.0.1 Mask:255.0.0.0</span><br><span class="line"> inet6 addr: ::1/128 Scope:Host</span><br><span class="line"> UP LOOPBACK RUNNING MTU:65536 Metric:1</span><br><span class="line"> RX packets:62 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line"> TX packets:62 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line"> collisions:0 txqueuelen:0 </span><br><span class="line"> RX bytes:4212 (4.1 KiB) TX bytes:4212 (4.1 KiB)</span><br></pre></td></tr></table></figure><p>修改网卡<code>eth0</code>配置中的<code>HWADDR</code>值(网卡mac地址),使用上面的新mac地址:<code>00:0C:29:D1:9C:4D</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 Desktop]<span class="comment"># vi /etc/sysconfig/network-scripts/ifcfg-eth0</span></span><br><span class="line">[root@linux1 Desktop]<span class="comment"># cat /etc/sysconfig/network-scripts/ifcfg-eth0 </span></span><br><span class="line">DEVICE=eth0</span><br><span class="line">TYPE=Ethernet</span><br><span class="line">UUID=9dc04a99-b654-4673-9b19-5100a2b03c51</span><br><span class="line">ONBOOT=yes</span><br><span class="line">NM_CONTROLLED=yes</span><br><span class="line">BOOTPROTO=none</span><br><span class="line">IPADDR=192.168.245.201</span><br><span class="line">PREFIX=24</span><br><span class="line">GATEWAY=192.168.245.2</span><br><span class="line">DNS1=114.114.114.114</span><br><span class="line">DEFROUTE=yes</span><br><span class="line">IPV4_FAILURE_FATAL=yes</span><br><span class="line">IPV6INIT=no</span><br><span class="line">NAME=<span class="string">"System eth0"</span></span><br><span class="line">HWADDR=00:0C:29:D1:9C:4D</span><br><span class="line">LAST_CONNECT=1451228780</span><br></pre></td></tr></table></figure><p>修改<code>/etc/udev/rules.d/70-persistent-net.rules</code>配置中的mac地址,改成和上面的一致</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 rules.d]# vi /etc/udev/rules.d/70-persistent-net.rules</span><br><span class="line">[root@linux1 rules.d]# cat /etc/udev/rules.d/70-persistent-net.rules</span><br><span class="line"># This file was automatically generated by the /lib/udev/write_net_rules</span><br><span class="line"># program, run by the persistent-net-generator.rules rules file.</span><br><span class="line">#</span><br><span class="line"># You can modify it, as long as you keep each rule on a single</span><br><span class="line"># line, and change only the value of the NAME= key.</span><br><span class="line"></span><br><span class="line"># PCI device 0x8086:0x100f (e1000)</span><br><span class="line">SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0C:29:D1:9C:4D", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"</span><br></pre></td></tr></table></figure><p><img src="/2016/linux-网卡设置-虚拟机克隆后网卡启动失败/set_mac_address.png"></p><p>删除掉网卡<code>eth1</code>(如果不需要的话),重启网卡就能生效了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 rules.d]<span class="comment"># ifup eth0</span></span><br><span class="line">Active connection state: activated</span><br><span class="line">Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/3</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h3 id="静态IP设置"><a href="#静态IP设置" class="headerlink" title="静态IP设置"></a>静态IP设置</h3><figure class="highlight bash"><table><tr><td class="gutt
</summary>
<category term="linux" scheme="https://blog.myoss.app/categories/linux/"/>
<category term="网络设置" scheme="https://blog.myoss.app/categories/linux/%E7%BD%91%E7%BB%9C%E8%AE%BE%E7%BD%AE/"/>
<category term="linux" scheme="https://blog.myoss.app/tags/linux/"/>
</entry>
<entry>
<title>linux mount/umount 挂载/卸载ISO镜像</title>
<link href="https://blog.myoss.app/2016/linux-mount-umount-%E6%8C%82%E8%BD%BD-%E5%8D%B8%E8%BD%BDISO%E9%95%9C%E5%83%8F/"/>
<id>https://blog.myoss.app/2016/linux-mount-umount-挂载-卸载ISO镜像/</id>
<published>2016-02-28T05:47:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h3 id="虚拟机加载ISO镜像"><a href="#虚拟机加载ISO镜像" class="headerlink" title="虚拟机加载ISO镜像"></a>虚拟机加载ISO镜像</h3><p>在<code>VMWare</code>中的<code>Linux</code>虚拟机设置ISO镜像文件的路径,先完成<code>设置</code>,接着<code>连接</code></p><p><img src="/2016/linux-mount-umount-挂载-卸载ISO镜像/vmware_set_iso.png"></p><h3 id="mount挂载"><a href="#mount挂载" class="headerlink" title="mount挂载"></a>mount挂载</h3><p>先在<code>/media</code>目录下创建<code>cdrom</code>文件夹,用于统一的挂载ISO镜像文件,这样便于日常操作</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 /]<span class="comment"># cd /media</span></span><br><span class="line">[root@linux1 media]<span class="comment"># mkdir cdrom</span></span><br></pre></td></tr></table></figure><p><code>linux</code>光驱加载的文件路径默认是在<code>/dev/cdrom</code>目录下,但不能操作也不能像文件夹那样直接操作,所以用<code>mount</code>命令挂载到物理路径</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 cdrom]<span class="comment"># mount /dev/cdrom /media/cdrom/</span></span><br><span class="line">mount: block device /dev/sr0 is write-protected, mounting <span class="built_in">read</span>-only</span><br><span class="line">[root@linux1 media]<span class="comment"># ll cdrom/ #接下来就可以像普通文件夹一样操作ISO镜像中的文件夹了,但这只是只读的喔</span></span><br><span class="line">l^H^H^H^H^H^H^H^H^H^Htotal 863</span><br><span class="line">dr-xr-xr-x. 3 root root 2048 Sep 26 2014 EFI</span><br><span class="line">-r--r--r--. 1 root root 8724 Nov 7 2012 EULA</span><br></pre></td></tr></table></figure><h3 id="配置简单的本地YUM源"><a href="#配置简单的本地YUM源" class="headerlink" title="配置简单的本地YUM源"></a>配置简单的本地YUM源</h3><p><code>baseurl</code>:文件的路径;<code>enabled</code>:启用当前yum源;<code>gpgcheck</code>:gpg检查不启用</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 ~]<span class="comment"># cd /etc/yum.repos.d/</span></span><br><span class="line">[root@linux1 yum.repos.d]<span class="comment"># cat rhel6-iso.repo </span></span><br><span class="line">[rhel-source]</span><br><span class="line">name=Red Hat Enterprise Linux 6 ISO</span><br><span class="line">baseurl=file:///media/cdrom</span><br><span class="line">enabled=1</span><br><span class="line">gpgcheck=0</span><br></pre></td></tr></table></figure><p>测试本地<code>YUM源</code>是否配置好了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 yum.repos.d]<span class="comment"># yum clean all #清空缓存</span></span><br><span class="line">Loaded plugins: product-id, refresh-packagekit, security, subscription-manager</span><br><span class="line">This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.</span><br><span class="line">Cleaning repos: rhel-source</span><br><span class="line">Cleaning up Everything</span><br><span class="line">[root@linux1 yum.repos.d]<span class="comment"># yum list vsftp* #查找软件</span></span><br><span class="line">Loaded plugins: product-id, refresh-packagekit, security, subscription-manager</span><br><span class="line">This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.</span><br><span class="line">rhel-source | 4.1 kB 00:00 ... </span><br><span class="line">rhel-source/primary_db | 3.1 MB 00:00 ... </span><br><span class="line">Available Packages</span><br><span class="line">vsftpd.x86_64 2.2.2-12.el6_5.1 rhel-source</span><br><span class="line">[root@linux1 yum.repos.d]<span class="comment"># yum install vsftpd.x86_64 #安装软件</span></span><br><span class="line">Loaded plugins: product-id, refresh-packagekit, security, subscription-manager</span><br><span class="line">This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.</span><br><span class="line">Setting up Install Process</span><br><span class="line">Resolving Dependencies</span><br><span class="line">--> Running transaction check</span><br><span class="line">---> Package vsftpd.x86_64 0:2.2.2-12.el6_5.1 will be installed</span><br><span class="line">--> Finished Dependency Resolution</span><br><span class="line"></span><br><span class="line">Dependencies Resolved</span><br><span class="line"></span><br><span class="line">=======================================================================================================================================================================</span><br><span class="line"> Package Arch Version Repository Size</span><br><span class="line">=======================================================================================================================================================================</span><br><span class="line">Installing:</span><br><span class="line"> vsftpd x86_64 2.2.2-12.el6_5.1 rhel-source 151 k</span><br><span class="line"></span><br><span class="line">Transaction Summary</span><br><span class="line">=======================================================================================================================================================================</span><br><span class="line">Install 1 Package(s)</span><br><span class="line"></span><br><span class="line">Total download size: 151 k</span><br><span class="line">Installed size: 331 k</span><br><span class="line">Is this ok [y/N]: n <span class="comment">#输入“n”取消安装</span></span><br><span class="line">Exiting on user Command</span><br><span class="line">[root@linux1 yum.repos.d]<span class="comment">#</span></span><br></pre></td></tr></table></figure><h3 id="卸载ISO镜像【重要】"><a href="#卸载ISO镜像【重要】" class="headerlink" title="卸载ISO镜像【重要】"></a>卸载ISO镜像【重要】</h3><p>使用完了,记得一定要卸载掉喔~~~</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 media]<span class="comment"># umount /media/cdrom</span></span><br><span class="line">[root@linux1 media]<span class="comment"># ll cdrom/</span></span><br><span class="line">total 0</span><br></pre></td></tr></table></figure><p>如果要退出光驱,可以使用以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@linux1 media]<span class="comment"># eject /dev/cdrom</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h3 id="虚拟机加载ISO镜像"><a href="#虚拟机加载ISO镜像" class="headerlink" title="虚拟机加载ISO镜像"></a>虚拟机加载ISO镜像</h3><p>在<code>VMWare</code>中的<code>Linux</cod
</summary>
<category term="linux" scheme="https://blog.myoss.app/categories/linux/"/>
<category term="mount" scheme="https://blog.myoss.app/categories/linux/mount/"/>
<category term="yum" scheme="https://blog.myoss.app/categories/linux/mount/yum/"/>
<category term="linux" scheme="https://blog.myoss.app/tags/linux/"/>
</entry>
<entry>
<title>MyBatis Plugin 学习使用</title>
<link href="https://blog.myoss.app/2016/MyBatis-Plugin-%E5%AD%A6%E4%B9%A0%E4%BD%BF%E7%94%A8/"/>
<id>https://blog.myoss.app/2016/MyBatis-Plugin-学习使用/</id>
<published>2016-02-19T03:15:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h2 id="关于本教程"><a href="#关于本教程" class="headerlink" title="关于本教程"></a>关于本教程</h2><p>以下教程仅供学习使用,针对于<code>IntelliJ Idea 15</code>(目前已经支持<code>IntelliJ Idea 2016</code>)中的<code>Mybatis Plugin</code>插件(<a href="https://plugins.jetbrains.com/plugin/7293?pr=idea" target="_blank" rel="noopener">https://plugins.jetbrains.com/plugin/7293?pr=idea</a>),后续作者会抽业余时间更新</p><h2 id="如果你觉得本项目能帮助到你,那就Fork一下吧"><a href="#如果你觉得本项目能帮助到你,那就Fork一下吧" class="headerlink" title="如果你觉得本项目能帮助到你,那就Fork一下吧"></a>如果你觉得本项目能帮助到你,那就<code>Fork</code>一下吧</h2><p>项目地址:<a href="https://github.com/myoss/profile" target="_blank" rel="noopener">https://github.com/myoss/profile</a></p><p><img src="/2016/MyBatis-Plugin-学习使用/fork_profile.png"></p><h2 id="下载插件"><a href="#下载插件" class="headerlink" title="下载插件"></a>下载插件</h2><p>前提你已经在<code>IntelliJ Idea</code>中安装好了<code>Mybatis Plugin</code>,并且重启过了<code>IntelliJ Idea</code>。</p><p>下载<code>profile</code>项目(项目地址:<a href="https://github.com/myoss/profile" target="_blank" rel="noopener">https://github.com/myoss/profile</a>)之后,找到目录:<code>profile\idea\plugin\MybatisPlugin</code>,并选择<code>IntelliJ Idea</code>中安装<code>Mybatis Plugin</code>的版本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> git@github.com:myoss/profile.git</span><br></pre></td></tr></table></figure><h2 id="windows系统"><a href="#windows系统" class="headerlink" title="windows系统"></a>windows系统</h2><h3 id="查找Idea插件配置目录"><a href="#查找Idea插件配置目录" class="headerlink" title="查找Idea插件配置目录"></a>查找Idea插件配置目录</h3><p><code>IntelliJ Idea</code>安装<code>Mybatis Plugin</code>之后,默认保存的位置如下,前提你没有更改过<code>IntelliJ Idea</code>配置目录</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\你的账户目录\.IntelliJIdea15\config\plugins\mybatis_plus\lib</span><br></pre></td></tr></table></figure><h3 id="替换class文件"><a href="#替换class文件" class="headerlink" title="替换class文件"></a>替换class文件</h3><p>用<code>WinRAR</code>打开<code>mybatis_plus.jar</code>,将目录<code>profile\idea\plugin\MybatisPlugin\对应的版本号\</code>下的<code>com</code>文件夹拖进<code>WinRAR</code>,根据提示覆盖即可</p><p><img src="/2016/MyBatis-Plugin-学习使用/replace_class.png"></p><h3 id="重启IntelliJ-Idea"><a href="#重启IntelliJ-Idea" class="headerlink" title="重启IntelliJ Idea"></a>重启IntelliJ Idea</h3><p>就这样完成了,教程完毕</p><h2 id="mac-os系统"><a href="#mac-os系统" class="headerlink" title="mac os系统"></a>mac os系统</h2><p>由于<code>mac os</code>中<code>IntelliJ Idea</code>的配置文件目录不一致,所以配置起来有些不一样。linux系统中应该类似,我没有验证,如果有兄弟验证过还请告诉我,感谢</p><h3 id="查找Idea插件配置目录-1"><a href="#查找Idea插件配置目录-1" class="headerlink" title="查找Idea插件配置目录"></a>查找Idea插件配置目录</h3><p>使用<code>find</code>命令在你的用户目录下查找<code>mybatis_plus.jar</code>这个文件(前提你没有更改过<code>IntelliJ Idea</code>的配置目录,如果更改了从根目录下查找吧,花费的时间可能会多点)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ find ~ -name <span class="string">"mybatis_plus.jar"</span></span><br><span class="line">/Users/jerry-osx-m/Library/Application Support/IntelliJIdea15/mybatis_plus/lib/mybatis_plus.jar</span><br><span class="line"></span><br><span class="line">$ find ~ -name <span class="string">"mybatis_plus.jar"</span></span><br><span class="line">/Users/Jerry/Library/Application Support/IntelliJIdea2016.1/mybatis_plus/lib/mybatis_plus.jar</span><br></pre></td></tr></table></figure><h3 id="替换class文件-1"><a href="#替换class文件-1" class="headerlink" title="替换class文件"></a>替换class文件</h3><p>方法1,在windows系统中将<code>mybatis_plus.jar</code>包替换好,然后替换掉<code>mac</code>的<code>mybatis_plus.jar</code>即可。</p><p>方法2,在<code>mac 终端</code>中,使用以下命令进行替换</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">$ pwd</span><br><span class="line">/Users/jerry/Library/Application Support/IntelliJIdea2016.3/mybatis_plus/lib</span><br><span class="line">$ ls</span><br><span class="line">mybatis-generator-core-1.3.2.jar mybatis_plus.jar ref.idea.common-1.0.jar</span><br><span class="line"></span><br><span class="line"># 将要使用版本的 com 文件复制到当前目录中</span><br><span class="line">$ cp -R ~/workspaces/github/profile/idea/plugin/MybatisPlugin/v2.7~v2.87/ .</span><br><span class="line">$ ls</span><br><span class="line">com mybatis_plus.jar</span><br><span class="line">mybatis-generator-core-1.3.2.jar ref.idea.common-1.0.jar</span><br><span class="line"></span><br><span class="line"># 使用 jar 命令进行替换,注意 com 文件夹一定要当前目录下面</span><br><span class="line">$ jar uvf mybatis_plus.jar com</span><br><span class="line">正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/dom/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/dom/model/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/ref/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/ref/license/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/ref/license/ActivationDriver$1.class(输入 = 1926) (输出 = 797)(压缩了 58%)</span><br><span class="line">正在添加: com/seventh7/mybatis/ref/license/ActivationDriver.class(输入 = 1398) (输出 = 656)(压缩了 53%)</span><br><span class="line">正在添加: com/seventh7/mybatis/ref/RefProject$1.class(输入 = 2224) (输出 = 1092)(压缩了 50%)</span><br><span class="line">正在添加: com/seventh7/mybatis/ref/RefProject.class(输入 = 1982) (输出 = 919)(压缩了 53%)</span><br><span class="line">正在添加: com/seventh7/mybatis/service/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/service/JavaService$1.class(输入 = 1408) (输出 = 613)(压缩了 56%)</span><br><span class="line">正在添加: com/seventh7/mybatis/service/JavaService$2.class(输入 = 1312) (输出 = 575)(压缩了 56%)</span><br><span class="line">正在添加: com/seventh7/mybatis/service/JavaService.class(输入 = 10921) (输出 = 4166)(压缩了 61%)</span><br><span class="line">正在添加: com/seventh7/mybatis/util/(输入 = 0) (输出 = 0)(存储了 0%)</span><br><span class="line">正在添加: com/seventh7/mybatis/util/JavaUtils$SystemData.class(输入 = 3412) (输出 = 1602)(压缩了 53%)</span><br><span class="line">正在添加: com/seventh7/mybatis/util/JavaUtils.class(输入 = 13339) (输出 = 4773)(压缩了 64%)</span><br><span class="line">正在添加: com/seventh7/mybatis/dom/model/Completion.class(输入 = 1663) (输出 = 923)(压缩了 44%)</span><br></pre></td></tr></table></figure><p>方法3,参考网友在<code>mac</code>中使用<code>类似 WinRar 软件</code>进行替换:<a href="https://beamaster.github.io/2017/01/03/IDEA-for-Mybatis-%E7%A0%B4%E8%A7%A3%E4%B9%8B%E9%81%93/" target="_blank" rel="noopener">点击我跳转</a></p><h3 id="重启IntelliJ-Idea-1"><a href="#重启IntelliJ-Idea-1" class="headerlink" title="重启IntelliJ Idea"></a>重启IntelliJ Idea</h3><p>就这样完成了,教程完毕</p>]]></content>
<summary type="html">
<h2 id="关于本教程"><a href="#关于本教程" class="headerlink" title="关于本教程"></a>关于本教程</h2><p>以下教程仅供学习使用,针对于<code>IntelliJ Idea 15</code>(目前已经支持<code>In
</summary>
<category term="IntelliJ Idea" scheme="https://blog.myoss.app/categories/IntelliJ-Idea/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>常用的 JavaScript 库 CDN 加速服务</title>
<link href="https://blog.myoss.app/2016/%E5%B8%B8%E7%94%A8%E7%9A%84-JavaScript-%E5%BA%93-CDN-%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1/"/>
<id>https://blog.myoss.app/2016/常用的-JavaScript-库-CDN-加速服务/</id>
<published>2016-01-28T13:24:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h2 id="CDN公共库"><a href="#CDN公共库" class="headerlink" title="CDN公共库"></a>CDN公共库</h2><p><strong>CDN公共库</strong>是指将常用的源<code>JavaScrit</code>库存放在<code>CDN</code>节点,以方便广大开发者直接调用。与将<code>JavaScrit</code>库存放在服务器单机上相比,<strong>CDN公共库</strong>更加稳定、高速。一般的<strong>CDN公共库</strong>都会包含全球所有最流行的开源<code>JavaScript</code>库,你可以在自己的网页上直接通过<code>script</code>标记引用这些资源。这样做不仅可以为您节省流量,还能通过<strong>CDN加速</strong>,获得更快的访问速度。</p><p><img src="/2016/常用的-JavaScript-库-CDN-加速服务/libraries.jpg"></p><h2 id="国内的公共库"><a href="#国内的公共库" class="headerlink" title="国内的公共库"></a>国内的公共库</h2><ul><li>百度CDN公共库:<a href="http://developer.baidu.com/wiki/index.php?title=docs/cplat/libs" target="_blank" rel="noopener">http://developer.baidu.com/wiki/index.php?title=docs/cplat/libs</a></li><li>百度静态资源公共库:<a href="http://cdn.code.baidu.com/" target="_blank" rel="noopener">http://cdn.code.baidu.com/</a></li><li>新浪云计算CDN公共库:<a href="http://lib.sinaapp.com" target="_blank" rel="noopener">http://lib.sinaapp.com</a></li><li>BootCDN公共库:<a href="http://www.bootcdn.cn" target="_blank" rel="noopener">http://www.bootcdn.cn</a></li><li>360公共库:<a href="http://libs.useso.com" target="_blank" rel="noopener">http://libs.useso.com</a></li><li>七牛云存储 开放静态文件CDN:<a href="http://www.staticfile.org" target="_blank" rel="noopener">http://www.staticfile.org</a></li><li>又拍云JS库CDN服务:<a href="http://jscdn.upai.com" target="_blank" rel="noopener">http://jscdn.upai.com</a></li></ul><h2 id="国外的公共库"><a href="#国外的公共库" class="headerlink" title="国外的公共库"></a>国外的公共库</h2><ul><li>CDNJS:<a href="http://www.cdnjs.com" target="_blank" rel="noopener">http://www.cdnjs.com</a></li><li>Google Hosted Libraries:<a href="https://developers.google.com/speed/libraries/" target="_blank" rel="noopener">https://developers.google.com/speed/libraries/</a></li><li>Microsoft ASP.net CDN:<a href="http://www.asp.net/ajaxlibrary/cdn.ashx" target="_blank" rel="noopener">http://www.asp.net/ajaxlibrary/cdn.ashx</a></li><li>jsDelivr:<a href="http://www.jsdelivr.com/" target="_blank" rel="noopener">http://www.jsdelivr.com/</a></li></ul>]]></content>
<summary type="html">
<h2 id="CDN公共库"><a href="#CDN公共库" class="headerlink" title="CDN公共库"></a>CDN公共库</h2><p><strong>CDN公共库</strong>是指将常用的源<code>JavaScrit</code>库存
</summary>
<category term="CDN" scheme="https://blog.myoss.app/categories/CDN/"/>
<category term="JS公共库" scheme="https://blog.myoss.app/categories/CDN/JS%E5%85%AC%E5%85%B1%E5%BA%93/"/>
<category term="网站优化" scheme="https://blog.myoss.app/tags/%E7%BD%91%E7%AB%99%E4%BC%98%E5%8C%96/"/>
</entry>
<entry>
<title>IntelliJ Idea 常用插件</title>
<link href="https://blog.myoss.app/2016/IntelliJ-Idea-%E5%B8%B8%E7%94%A8%E6%8F%92%E4%BB%B6/"/>
<id>https://blog.myoss.app/2016/IntelliJ-Idea-常用插件/</id>
<published>2016-01-28T09:00:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h1 id="常用插件列表"><a href="#常用插件列表" class="headerlink" title="常用插件列表"></a>常用插件列表</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Eclipse Action</span><br><span class="line">Eclipse Code Formatter</span><br><span class="line">Save Actions</span><br><span class="line">String Manipulation</span><br><span class="line">FindBugs-IDEA</span><br><span class="line">Lombok Plugin</span><br><span class="line">MyBatis Plugin</span><br><span class="line">gfm</span><br><span class="line">CMD Support</span><br></pre></td></tr></table></figure><h1 id="Eclipse-Action"><a href="#Eclipse-Action" class="headerlink" title="Eclipse Action"></a>Eclipse Action</h1><h2 id="实现Eclipse中快速复制行或者区块代码"><a href="#实现Eclipse中快速复制行或者区块代码" class="headerlink" title="实现Eclipse中快速复制行或者区块代码"></a>实现Eclipse中快速复制行或者区块代码</h2><p>将<code>Duplicate Lines Ex</code>和<code>Copy Lines Ex</code>设置成你习惯的快捷键。<br>插件源码地址:<a href="https://github.com/dgt79/EclipseActions" target="_blank" rel="noopener">https://github.com/dgt79/EclipseActions</a></p><p><img src="/2016/IntelliJ-Idea-常用插件/eclipse_action.png"></p><h1 id="Eclipse-Code-Formatter"><a href="#Eclipse-Code-Formatter" class="headerlink" title="Eclipse Code Formatter"></a>Eclipse Code Formatter</h1><h2 id="实现Eclipse中代码格式化功能"><a href="#实现Eclipse中代码格式化功能" class="headerlink" title="实现Eclipse中代码格式化功能"></a>实现Eclipse中代码格式化功能</h2><p>如果你需要和使用<code>Eclipse</code>同事共同开发,为了防止代码在<code>merge</code>的时候出现冲突,你们肯定是要先定义好统一的格式化代码模板,这个<code>xml</code>从<code>Eclipse</code>中导出来,建议保存在<code>IntelliJ Idea</code>的配置目录下面,方便做配置同步<br>插件源码地址:<a href="https://github.com/krasa/EclipseCodeFormatter" target="_blank" rel="noopener">https://github.com/krasa/EclipseCodeFormatter</a></p><p><img src="/2016/IntelliJ-Idea-常用插件/eclipse_code_formatter.png"></p><h1 id="Save-Actions"><a href="#Save-Actions" class="headerlink" title="Save Actions"></a>Save Actions</h1><h2 id="保存修改的时候自动导入、格式化代码"><a href="#保存修改的时候自动导入、格式化代码" class="headerlink" title="保存修改的时候自动导入、格式化代码"></a>保存修改的时候自动导入、格式化代码</h2><p><code>IntelliJ Idea</code>的默认配置是自动保存修改的内容,也就是不用你每次修改完了之后使用<code>Ctrl + S</code>进行保存,此插件能够帮助你每次修改内容之后,都能自动格式化、重新排序<code>package</code>的顺序,这些繁琐容易忘记的事情都帮你自动完成了,何乐而不为了<br>插件源码地址:<a href="https://github.com/dubreuia/intellij-plugin-save-actions" target="_blank" rel="noopener">https://github.com/dubreuia/intellij-plugin-save-actions</a></p><p><img src="/2016/IntelliJ-Idea-常用插件/save_actions.png"></p><h1 id="String-Manipulation"><a href="#String-Manipulation" class="headerlink" title="String Manipulation"></a>String Manipulation</h1><h2 id="字符串快速格式转换"><a href="#字符串快速格式转换" class="headerlink" title="字符串快速格式转换"></a>字符串快速格式转换</h2><p>使用方法,<code>Alt + M</code>选中你要操作的字符,举例你要快速将变量名转换成常量名(通常都是字母大写,并且两个字母之间使用<code>_</code>隔开,比如:<code>DATE_TIME</code>)<br>插件源码地址:<a href="https://github.com/krasa/StringManipulation" target="_blank" rel="noopener">https://github.com/krasa/StringManipulation</a></p><p><img src="/2016/IntelliJ-Idea-常用插件/string_manipulation_1.png"></p><p>转换后的效果:</p><p><img src="/2016/IntelliJ-Idea-常用插件/string_manipulation_2.png"></p><h1 id="FindBugs-IDEA"><a href="#FindBugs-IDEA" class="headerlink" title="FindBugs-IDEA"></a>FindBugs-IDEA</h1><p><br>这个就不用说太多了,分析代码<code>bug</code>的<br>插件地址:<a href="http://andrepdo.github.io/findbugs-idea/" target="_blank" rel="noopener">http://andrepdo.github.io/findbugs-idea/</a></p><h1 id="Lombok-Plugin"><a href="#Lombok-Plugin" class="headerlink" title="Lombok Plugin"></a>Lombok Plugin</h1><p><br>支持<code>lombok 注解</code>,<code>IntelliJ Idea</code>默认是不支持了,会报语法错误,安装这个插件之后就可以了<br>插件源码地址:<a href="https://github.com/mplushnikov/lombok-intellij-plugin" target="_blank" rel="noopener">https://github.com/mplushnikov/lombok-intellij-plugin</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法</span><br><span class="line">@Setter:注解在属性上;为属性提供 setting 方法</span><br><span class="line">@Getter:注解在属性上;为属性提供 getting 方法</span><br><span class="line">@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象</span><br><span class="line">@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法</span><br><span class="line">@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法</span><br></pre></td></tr></table></figure><h1 id="MyBatis-Plugin"><a href="#MyBatis-Plugin" class="headerlink" title="MyBatis Plugin"></a>MyBatis Plugin</h1><p><br>支持<code>MyBatis</code>的一个不错插件,可惜现在要收费了,免注册使用方法:<a href="https://github.com/myoss/profile/tree/master/idea/plugin/MybatisPlugin" target="_blank" rel="noopener">https://github.com/myoss/profile/tree/master/idea/plugin/MybatisPlugin</a><br>插件地址:<a href="https://www.codesmagic.com/" target="_blank" rel="noopener">codesmagic</a></p><h1 id="gfm"><a href="#gfm" class="headerlink" title="gfm"></a>gfm</h1><p><br><code>GitHub</code>的<code>GitHub Flavored Markdown</code><br>插件源码地址:<a href="https://github.com/shyykoserhiy/gfm-plugin" target="_blank" rel="noopener">https://github.com/shyykoserhiy/gfm-plugin</a></p><h1 id="CMD-Support"><a href="#CMD-Support" class="headerlink" title="CMD Support"></a>CMD Support</h1><p><br>可以在<code>IntelliJ Idea</code>中执行<code>cmd</code>脚本<br>插件源码地址:<a href="https://github.com/t3hnar/CmdSupport" target="_blank" rel="noopener">https://github.com/t3hnar/CmdSupport</a></p>]]></content>
<summary type="html">
<h1 id="常用插件列表"><a href="#常用插件列表" class="headerlink" title="常用插件列表"></a>常用插件列表</h1><figure class="highlight plain"><table><tr><td class="gut
</summary>
<category term="IntelliJ Idea" scheme="https://blog.myoss.app/categories/IntelliJ-Idea/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>IntelliJ Idea 设置中的Copyright和scopes关联起来</title>
<link href="https://blog.myoss.app/2016/IntelliJ-Idea-%E8%AE%BE%E7%BD%AE%E4%B8%AD%E7%9A%84Copyright%E5%92%8Cscopes%E5%85%B3%E8%81%94%E8%B5%B7%E6%9D%A5/"/>
<id>https://blog.myoss.app/2016/IntelliJ-Idea-设置中的Copyright和scopes关联起来/</id>
<published>2016-01-28T06:50:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h1 id="Copyright和scopes关联起来的原因"><a href="#Copyright和scopes关联起来的原因" class="headerlink" title="Copyright和scopes关联起来的原因"></a>Copyright和scopes关联起来的原因</h1><p><br>每个公司或者现在的开源项目大都是有<code>Copyright</code>的,而我的配置都是同步到<code>GitHub</code>上的,所以不想写死了难切换,琢磨着是否可以动态的根据<code>package name</code>来关联不同的<code>Copyright</code>。以下设置是在<code>IntelliJ Idea 15</code>中完成的。</p><h1 id="新增加一个Copyright"><a href="#新增加一个Copyright" class="headerlink" title="新增加一个Copyright"></a>新增加一个Copyright</h1><h2 id="Settings中的菜单位置"><a href="#Settings中的菜单位置" class="headerlink" title="Settings中的菜单位置"></a>Settings中的菜单位置</h2><p><code>Ctrl + Alt + s</code> 打开<code>Settings</code>,找到<code>Editor</code> -> <code>Copyright</code> -> <code>Copyright Profiles</code></p><p><img src="/2016/IntelliJ-Idea-设置中的Copyright和scopes关联起来/new_copyright.png"></p><h1 id="新增加一个Scopes"><a href="#新增加一个Scopes" class="headerlink" title="新增加一个Scopes"></a>新增加一个Scopes</h1><h2 id="Settings中的菜单位置-1"><a href="#Settings中的菜单位置-1" class="headerlink" title="Settings中的菜单位置"></a>Settings中的菜单位置</h2><p><code>Ctrl + Alt + s</code> 打开<code>Settings</code>,找到<code>Appearance & Behavior</code> -> <code>Scopes</code>,切记一定要选择<code>Shared</code>类型,设置好之后,点击<code>Apply</code>然后退出<code>Settings</code>,记住一定要先保存,才去做下一步操作</p><p><img src="/2016/IntelliJ-Idea-设置中的Copyright和scopes关联起来/new_scope.png"></p><h1 id="关联Copyright和Scope"><a href="#关联Copyright和Scope" class="headerlink" title="关联Copyright和Scope"></a>关联Copyright和Scope</h1><h2 id="Settings中的菜单位置-2"><a href="#Settings中的菜单位置-2" class="headerlink" title="Settings中的菜单位置"></a>Settings中的菜单位置</h2><p><code>Ctrl + Alt + s</code> 打开<code>Settings</code>,找到<code>Editor</code> -> <code>Copyright</code>,在<code>Scope</code>的下拉菜单中选择第二步添加的<code>Scope</code>名字</p><p><img src="/2016/IntelliJ-Idea-设置中的Copyright和scopes关联起来/copyright_scope.png"></p>]]></content>
<summary type="html">
<h1 id="Copyright和scopes关联起来的原因"><a href="#Copyright和scopes关联起来的原因" class="headerlink" title="Copyright和scopes关联起来的原因"></a>Copyright和scopes关
</summary>
<category term="IntelliJ Idea" scheme="https://blog.myoss.app/categories/IntelliJ-Idea/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>IntelliJ Idea 配置同步</title>
<link href="https://blog.myoss.app/2016/IntelliJ-Idea-%E9%85%8D%E7%BD%AE%E5%90%8C%E6%AD%A5/"/>
<id>https://blog.myoss.app/2016/IntelliJ-Idea-配置同步/</id>
<published>2016-01-28T06:07:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h1 id="为什么要同步配置?"><a href="#为什么要同步配置?" class="headerlink" title="为什么要同步配置?"></a>为什么要同步配置?</h1><p><br>初期从<code>Eclipse</code>转到<code>IntelliJ Idea</code>上来,最大的一个问题就是很多地方都不习惯,最最最主要的就是不习惯快捷键,所以我上来就是折腾快捷键的配置,让快捷键尽量和<code>Eclipse</code>的靠拢,花了好些天时间配置好了并且习惯了。这磨合的期间又有了新的需求,工作时间是在公司的电脑,非工作时间在家里的电脑,怎么快速同步配置了?在用户目录下找到了<code>IntelliJ Idea</code>的配置目录,想到了用<code>GitHub</code>仓库来同步,于是就这么干了,虽然不能做到很好的隔离配置差异,但是效果还是不错的,尤其是在重装电脑或者换公司的时候,重新<code>git clone</code>下仓库就能恢复配置了</p><h1 id="windows系统同步配置方法"><a href="#windows系统同步配置方法" class="headerlink" title="windows系统同步配置方法"></a>windows系统同步配置方法</h1><h2 id="找到配置目录"><a href="#找到配置目录" class="headerlink" title="找到配置目录"></a>找到配置目录</h2><p>如果没有更改过<code>IntelliJ Idea</code>的配置目录,那么它保存在如下的目录</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\你的账户名\.IntelliJIdea15\config</span><br></pre></td></tr></table></figure><h2 id="初始化仓库"><a href="#初始化仓库" class="headerlink" title="初始化仓库"></a>初始化仓库</h2><p>将要忽略的文件,添加到<code>.gitignore</code>中(<a href="/2016/Git操作#u5FFD_u7565_u6587_u4EF6">.gitignore语法参考</a>),然后提交</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/.IntelliJIdea15/config</span><br><span class="line">git init</span><br><span class="line">touch .gitignore</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">"init"</span></span><br></pre></td></tr></table></figure><h2 id="同步到仓库"><a href="#同步到仓库" class="headerlink" title="同步到仓库"></a>同步到仓库</h2><p>第一次请先在<code>GitHub</code>中创建一个仓库,然后按照提示进行操作,之后就是<code>git push/pull</code>操作啦。<br>可以参考我的<code>IntelliJ Idea</code>的配置仓库,链接:<a href="https://github.com/myoss/IntelliJIdea-config" target="_blank" rel="noopener">https://github.com/myoss/IntelliJIdea-config</a></p><h1 id="Mac-Linux系统的配置"><a href="#Mac-Linux系统的配置" class="headerlink" title="Mac/Linux系统的配置"></a>Mac/Linux系统的配置</h1><p><br><code>IntelliJ Idea</code>的配置似乎不是在同一个目录下,没有深入研究</p>]]></content>
<summary type="html">
<h1 id="为什么要同步配置?"><a href="#为什么要同步配置?" class="headerlink" title="为什么要同步配置?"></a>为什么要同步配置?</h1><p><br>初期从<code>Eclipse</code>转到<code>Intelli
</summary>
<category term="IntelliJ Idea" scheme="https://blog.myoss.app/categories/IntelliJ-Idea/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>Git操作</title>
<link href="https://blog.myoss.app/2016/Git%E6%93%8D%E4%BD%9C/"/>
<id>https://blog.myoss.app/2016/Git操作/</id>
<published>2016-01-20T06:37:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<p>花了好几天的时间,才迁移完<a href="https://github.com/myoss/study/blob/master/git_notes.txt" target="_blank" rel="noopener">git学习笔记</a>,进行了重新整理,记录了常用操作。不知不觉<code>Git</code>已经用了2年的时间,虽然不久,但已经深深爱上了这个家伙~~~</p><a id="more"></a><h1 id="git-config"><a href="#git-config" class="headerlink" title="git config"></a>git config</h1><p><br>使用方法如下,如果没有指定位置参数省略的话,大部分命令默认为:<code>--local</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config [<--system> | <--global> | <--<span class="built_in">local</span>>] [option]</span><br></pre></td></tr></table></figure><h2 id="配置优先级"><a href="#配置优先级" class="headerlink" title="配置优先级"></a>配置优先级</h2><p>配置生效优先级:<code>1.</code> > <code>2.</code> > <code>3.</code>,即相同参数的配置优先级</p><ol><li><code>.git/config</code> 工作目录下的配置,使用:<code>git config --local</code></li><li><code>~/.gitconfig</code> 用户目录下的配置,使用:<code>git config --global</code></li><li><code>/etc/gitconfig</code> 对所有用户都适用的配置,使用:<code>git cofing --system</code></li></ol><h2 id="选项"><a href="#选项" class="headerlink" title="选项"></a>选项</h2><h3 id="查看生效的配置"><a href="#查看生效的配置" class="headerlink" title="查看生效的配置"></a>查看生效的配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">git config -l <span class="comment">#查看所有配置</span></span><br><span class="line">git config --list <span class="comment">#查看所有配置</span></span><br><span class="line">git config --system -l <span class="comment">#查看系统用户的所有配置</span></span><br><span class="line">git config --system --list <span class="comment">#查看系统用户的所有配置</span></span><br><span class="line">git config --global -l <span class="comment">#查看当前用户的所有配置</span></span><br><span class="line">git config --global --list <span class="comment">#查看当前用户的所有配置</span></span><br><span class="line">git config --<span class="built_in">local</span> -l <span class="comment">#查看当前工作目录下的所有配置</span></span><br><span class="line">git config --<span class="built_in">local</span> --list <span class="comment">#查看当前工作目录下的所有配置</span></span><br></pre></td></tr></table></figure><h3 id="查看某个参数的配置"><a href="#查看某个参数的配置" class="headerlink" title="查看某个参数的配置"></a>查看某个参数的配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git config user.name <span class="comment">#查看当前工作目录下的“用户名称”的配置</span></span><br><span class="line">git config --<span class="built_in">local</span> user.name <span class="comment">#查看当前工作目录下的“用户名称”的配置,可以省略:--local</span></span><br><span class="line">git config --global user.name <span class="comment">#查看当前用户的“用户名称”的配置</span></span><br></pre></td></tr></table></figure><h3 id="设置用户名称和用户Email地址"><a href="#设置用户名称和用户Email地址" class="headerlink" title="设置用户名称和用户Email地址"></a>设置用户名称和用户Email地址</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name <span class="string">"John Doe"</span></span><br><span class="line">git config --global user.email johndoe@example.com</span><br><span class="line">git config --<span class="built_in">local</span> user.name <span class="string">"John Doe"</span></span><br><span class="line">git config --<span class="built_in">local</span> user.email johndoe@example.com</span><br></pre></td></tr></table></figure><h3 id="换行符:CRLF-LF"><a href="#换行符:CRLF-LF" class="headerlink" title="换行符:CRLF/LF"></a>换行符:CRLF/LF</h3><p>在Windows系统上,把它设置成<code>true</code>,这样当签出代码时,<code>LF</code>会被转换成<code>CRLF</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.autocrlf <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>Linux或Mac系统上,因此你不想Git在签出文件时进行自动的转换;当一个以<code>CRLF</code>为行结束符的文件不小心被引入时你肯定想进行修正,设置成<code>input</code>来告诉Git在提交时把<code>CRLF</code>转换成<code>LF</code>,签出时不转换</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.autocrlf input</span><br></pre></td></tr></table></figure><p>如果仅运行在Windows上的项目,可以设置<code>false</code>取消此功能,把回车符记录在库中</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.autocrlf <span class="literal">false</span></span><br></pre></td></tr></table></figure><h3 id="换行符:SafeCRLF"><a href="#换行符:SafeCRLF" class="headerlink" title="换行符:SafeCRLF"></a>换行符:SafeCRLF</h3><p>拒绝提交包含混合换行符的文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.safecrlf <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>允许提交包含混合换行符的文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.safecrlf <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>提交包含混合换行符的文件时给出警告</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.safecrlf warn</span><br></pre></td></tr></table></figure><h3 id="core-quotepath"><a href="#core-quotepath" class="headerlink" title="core.quotepath"></a>core.quotepath</h3><p>在使用git的时候,经常会碰到有一些中文文件名或者路径被转义成\xx\xx\xx之类的,此时可以通过git的配置来改变默认转义</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.quotepath <span class="literal">false</span></span><br></pre></td></tr></table></figure><h3 id="core-pager"><a href="#core-pager" class="headerlink" title="core.pager"></a>core.pager</h3><p>core.pager指定 Git 运行诸如log、diff等所使用的分页器,你能设置成用more或者任何你喜欢的分页器(默认用的是less), 当然你也可以什么都不用,设置空字符串:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.pager <span class="string">''</span></span><br></pre></td></tr></table></figure><h3 id="其它配置"><a href="#其它配置" class="headerlink" title="其它配置"></a>其它配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.editor vim <span class="comment">#设置文本编辑器</span></span><br><span class="line">git config --global color.ui <span class="literal">true</span></span><br><span class="line">git config --global alias.st status <span class="comment">#设置别名</span></span><br><span class="line">git config receive.denyNonFastForwards <span class="literal">true</span> <span class="comment">#禁止非快进试推送</span></span><br><span class="line">git config --global merge.tool kdiff3</span><br><span class="line">git config --global diff.word.textconv strings <span class="comment">#在比较前把Word文件转换成文本文件</span></span><br></pre></td></tr></table></figure><hr><h1 id="工作区"><a href="#工作区" class="headerlink" title="工作区"></a>工作区</h1><hr><h1 id="暂存区"><a href="#暂存区" class="headerlink" title="暂存区"></a>暂存区</h1><p><br>暂存区,又称为<code>--stage</code>或<code>--index</code>,是一个介于工作区和版本库的中间状态,当执行提交时,实际上是将暂存区的内容提交到版本库中。</p><hr><h1 id="版本库"><a href="#版本库" class="headerlink" title="版本库"></a>版本库</h1><h2 id="工作区-暂存区-版本库,三者的关系图"><a href="#工作区-暂存区-版本库,三者的关系图" class="headerlink" title="工作区/暂存区/版本库,三者的关系图"></a>工作区/暂存区/版本库,三者的关系图</h2><p><img src="/images/git-trees.png" alt=""><br><img src="/images/git-stage.png" alt=""></p><hr><h1 id="HEAD"><a href="#HEAD" class="headerlink" title="HEAD"></a>HEAD</h1><p><br><code>HEAD</code>是当前分支引用的指针,它总是指向该分支上的最后一次提交。这表示 <code>HEAD</code>将是下一次提交的父节点。通常,理解<code>HEAD</code>的最简方式,就是将它看做 你的上一次提交 的快照。<br>符号<code>^</code>可以用于指代父提交</p><blockquote><p><code>HEAD^</code>代表版本库中的上一次提交,即最近一次提交的父提交<br><code>HEAD^^</code>则代表<code>HEAD^</code>的父提交<br>对于一个提交有多个父提交,可以在符号<code>^</code>后面用数字表示是第几个父提交</p></blockquote><h2 id="查看快照"><a href="#查看快照" class="headerlink" title="查看快照"></a>查看快照</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">$ git cat-file -p HEAD</span><br><span class="line">tree 684768932f4b16ef45aa5e87793a76470fb8becb</span><br><span class="line">parent ae1ffd161d1ffb564ba2a0e87dae45ec63ea5eea</span><br><span class="line">author Jerry.Chen <balabala@gmail.com> 1453474460 +0800</span><br><span class="line">committer Jerry.Chen <balabala@gmail.com> 1453474460 +0800</span><br><span class="line"></span><br><span class="line">commit with -a</span><br><span class="line"></span><br><span class="line">``</span><br><span class="line"></span><br><span class="line"><span class="comment">## 查看引用日志,是`HEAD`头指针的变迁记录,而非`master`分支</span></span><br><span class="line"></span><br><span class="line">```bash</span><br><span class="line">$ git reflog</span><br><span class="line">ae1ffd1 HEAD@{0}: checkout: moving from b2 to master</span><br><span class="line">48c54d7 HEAD@{1}: checkout: moving from master to b2</span><br><span class="line">ae1ffd1 HEAD@{2}: checkout: moving from master to master</span><br></pre></td></tr></table></figure><h2 id="查看引用日志的输出"><a href="#查看引用日志的输出" class="headerlink" title="查看引用日志的输出"></a>查看引用日志的输出</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ git show HEAD@{0}</span><br><span class="line">commit ae1ffd161d1ffb564ba2a0e87dae45ec63ea5eea</span><br><span class="line">Merge: 3bce065 17ce0b6</span><br><span class="line">Author: Jerry <jerry@china.com></span><br><span class="line">Date: Sun Apr 20 16:05:08 2014 +0800</span><br><span class="line"></span><br><span class="line"> merge ...</span><br><span class="line"></span><br><span class="line">diff --cc hello.md</span><br><span class="line">index 1e644f0,11f9129..70b7830</span><br><span class="line">--- a/hello.md</span><br><span class="line">+++ b/hello.md</span><br><span class="line">@@@ -6,7 -6,7 +6,8 @@@</span><br><span class="line"> 5 modify</span><br><span class="line"> 6 modify by jerry</span><br><span class="line"> 6 modify</span><br><span class="line"> +7 modify by jerry</span><br><span class="line">+ 7 modify</span><br><span class="line"> branch b1 1 modify branch b1 3 modify</span><br><span class="line"> branch b1 2 modify branch b1 4 modify</span><br><span class="line"> branch b2 1 modify</span><br></pre></td></tr></table></figure><hr><h1 id="SSH-Key"><a href="#SSH-Key" class="headerlink" title="SSH Key"></a>SSH Key</h1><h2 id="查看已经保存的SSH密钥"><a href="#查看已经保存的SSH密钥" class="headerlink" title="查看已经保存的SSH密钥"></a>查看已经保存的SSH密钥</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -lart ~/.ssh</span><br></pre></td></tr></table></figure><h2 id="生成SSH密钥"><a href="#生成SSH密钥" class="headerlink" title="生成SSH密钥"></a>生成SSH密钥</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C <span class="string">"your_email@example.com"</span></span><br></pre></td></tr></table></figure><p>查看公钥(<code>*.pub</code>)文件的内容,如果没有修改密钥的位置和保存的路径,直接复制<code>cat</code>出来的内容,粘帖到你需要用到的地方</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat ~/.ssh/id_rsa.pub</span><br></pre></td></tr></table></figure><hr><h1 id="git-clone"><a href="#git-clone" class="headerlink" title="git clone"></a>git clone</h1><p><br>克隆操作,使用方法如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> [<options>] [--] <repository> [<directory>]</span><br></pre></td></tr></table></figure></p><h2 id="包含工作区的版本库"><a href="#包含工作区的版本库" class="headerlink" title="包含工作区的版本库"></a>包含工作区的版本库</h2><p>在本地创建一个<repository>的克隆工作区,所有的文件都会检出,如果设置了<code>[<directory>]</code>,则会将此名称做为克隆的文件夹名称</repository></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> <repository> [<directory>]</span><br></pre></td></tr></table></figure><h2 id="裸版本库,不包含工作区"><a href="#裸版本库,不包含工作区" class="headerlink" title="裸版本库,不包含工作区"></a>裸版本库,不包含工作区</h2><p>不包含工作区,直接就是版本库的内容,这样的版本库称为裸版本库。一般约定俗成裸版本库的目录名以<code>.git</code>为后缀,所以下面实例中将克隆出来的裸版本库目录名写作<code><directory.git></code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --bare <repository> <directory.git></span><br><span class="line">git <span class="built_in">clone</span> --mirror <repository> <directory.git></span><br></pre></td></tr></table></figure><p><code>git clone --mirror</code> 克隆出来的裸版本对上游版本进行了注册,这样可以在裸版本库中使用<code>git fetch</code>命令和上游版本库进行持续同步</p><h2 id="支持的多种协议"><a href="#支持的多种协议" class="headerlink" title="支持的多种协议"></a>支持的多种协议</h2><p>常用的一些协议,不是全部</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> file:///opt/git/project.git</span><br><span class="line">git <span class="built_in">clone</span> /opt/git/project.git</span><br><span class="line">git <span class="built_in">clone</span> ssh://user@server:project.git</span><br><span class="line">git <span class="built_in">clone</span> http[s]://example.com/gitproject.git</span><br><span class="line">git <span class="built_in">clone</span> git://example.com/path/to/repo.git/</span><br><span class="line">git <span class="built_in">clone</span> git@github.com:User/progit.git</span><br></pre></td></tr></table></figure><hr><h1 id="git-remote"><a href="#git-remote" class="headerlink" title="git remote"></a>git remote</h1><h2 id="查看当前工作目录的远程仓库信息"><a href="#查看当前工作目录的远程仓库信息" class="headerlink" title="查看当前工作目录的远程仓库信息"></a>查看当前工作目录的远程仓库信息</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git remote -v</span><br><span class="line">git remote show <span class="comment">#查看当前工作目录所有的远程仓库的简写名称</span></span><br><span class="line">git remote show [name]</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">$ git remote -v</span><br><span class="line">origin git@github.com:myoss/progit.git (fetch)</span><br><span class="line">origin git@github.com:myoss/progit.git (push)</span><br><span class="line"></span><br><span class="line">$ git remote show</span><br><span class="line">origin</span><br><span class="line"></span><br><span class="line">$ git remote show origin</span><br><span class="line">* remote origin</span><br><span class="line"> Fetch URL: git@github.com:myoss/progit.git</span><br><span class="line"> Push URL: git@github.com:myoss/progit.git</span><br><span class="line"> HEAD branch: master</span><br><span class="line"> Remote branches:</span><br><span class="line"> b1 tracked</span><br><span class="line"> master tracked</span><br><span class="line"> Local branches configured <span class="keyword">for</span> <span class="string">'git pull'</span>:</span><br><span class="line"> b1 merges with remote b1</span><br><span class="line"> master merges with remote master</span><br><span class="line"> Local refs configured <span class="keyword">for</span> <span class="string">'git push'</span>:</span><br><span class="line"> b1 pushes to b1 (up to date)</span><br><span class="line"> master pushes to master (up to date)</span><br></pre></td></tr></table></figure><h2 id="添加远程仓库"><a href="#添加远程仓库" class="headerlink" title="添加远程仓库"></a>添加远程仓库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote add [name] [url]</span><br></pre></td></tr></table></figure><h2 id="修改远程仓库的url地址"><a href="#修改远程仓库的url地址" class="headerlink" title="修改远程仓库的url地址"></a>修改远程仓库的url地址</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote <span class="built_in">set</span>-url <name> <new_url></span><br></pre></td></tr></table></figure><h2 id="修改某个远程仓库的简写名称"><a href="#修改某个远程仓库的简写名称" class="headerlink" title="修改某个远程仓库的简写名称"></a>修改某个远程仓库的简写名称</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote rename <old_name> <new_name></span><br></pre></td></tr></table></figure><h2 id="移除某个远程仓库的配置信息,不会删除任何文件"><a href="#移除某个远程仓库的配置信息,不会删除任何文件" class="headerlink" title="移除某个远程仓库的配置信息,不会删除任何文件"></a>移除某个远程仓库的配置信息,不会删除任何文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote rm | remove <name></span><br></pre></td></tr></table></figure><hr><h1 id="git-fetch"><a href="#git-fetch" class="headerlink" title="git fetch"></a>git fetch</h1><h2 id="拉取远程仓库的更新数据"><a href="#拉取远程仓库的更新数据" class="headerlink" title="拉取远程仓库的更新数据"></a>拉取远程仓库的更新数据</h2><p>只是将远端的数据拉到本地仓库,不会自动合并到当前工作分支。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git fetch <repository-name> <branch-name> <span class="comment">#repository-name:远程仓库的简写名称</span></span><br><span class="line">git fetch origin master</span><br></pre></td></tr></table></figure><h2 id="拉取所有远程仓库"><a href="#拉取所有远程仓库" class="headerlink" title="拉取所有远程仓库"></a>拉取所有远程仓库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch --all</span><br></pre></td></tr></table></figure><hr><h1 id="git-pull"><a href="#git-pull" class="headerlink" title="git pull"></a>git pull</h1><h2 id="获取远程仓库的更新数据,再自动合并到本地仓库中的当前分支"><a href="#获取远程仓库的更新数据,再自动合并到本地仓库中的当前分支" class="headerlink" title="获取远程仓库的更新数据,再自动合并到本地仓库中的当前分支"></a>获取远程仓库的更新数据,再自动合并到本地仓库中的当前分支</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git pull <repository-name> <repository-branch-name></span><br><span class="line">git pull origin master</span><br></pre></td></tr></table></figure><p>相当于做了以下2步操作,如果有冲突,将会合并失败</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin master</span><br><span class="line">git merge origin/master</span><br></pre></td></tr></table></figure><h2 id="获取远程仓库的更新数据,再自动合并到本地仓库中的其它分支"><a href="#获取远程仓库的更新数据,再自动合并到本地仓库中的其它分支" class="headerlink" title="获取远程仓库的更新数据,再自动合并到本地仓库中的其它分支"></a>获取远程仓库的更新数据,再自动合并到本地仓库中的其它分支</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git pull <repository-name> <repository-branch-name>:<<span class="built_in">local</span>-branch-name></span><br><span class="line">git pull origin master:dev <span class="comment">#将远程仓库的master分支的更新,合并到本地的dev分支</span></span><br></pre></td></tr></table></figure><h2 id="获取远程仓库上所有的tag"><a href="#获取远程仓库上所有的tag" class="headerlink" title="获取远程仓库上所有的tag"></a>获取远程仓库上所有的tag</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git pull <repository-name> --tags</span><br><span class="line">git pull origin --tags</span><br></pre></td></tr></table></figure><hr><h1 id="git-push"><a href="#git-push" class="headerlink" title="git push"></a>git push</h1><h2 id="将本地分支的更新,推送到远程仓库"><a href="#将本地分支的更新,推送到远程仓库" class="headerlink" title="将本地分支的更新,推送到远程仓库"></a>将本地分支的更新,推送到远程仓库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> <<span class="built_in">local</span>-branch-name>:[repository-branch-name]</span><br><span class="line">git push origin <span class="built_in">local</span>-dev:remote-dev <span class="comment">#将本地的local-dev分支,推送到远程的remote-dev分支</span></span><br></pre></td></tr></table></figure><p>通常的操作,省略掉远程分支名<code>[repository-branch-name]</code>,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> <<span class="built_in">local</span>-branch-name></span><br><span class="line">git push origin master <span class="comment">#将本地的master分支推送到远程仓库的master分支</span></span><br><span class="line">git push origin b1 <span class="comment">#如果远程仓库不存在b1分支,则会创建b1分支</span></span><br></pre></td></tr></table></figure><h2 id="删除远程仓库的分支"><a href="#删除远程仓库的分支" class="headerlink" title="删除远程仓库的分支"></a>删除远程仓库的分支</h2><p>第一种方式,如果省略<code>[local-branch-name]</code>,推送一个空的本地分支到远程分支,即删除掉[远程分支],[本地分支]不会删除</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> :<repository-branch-name></span><br></pre></td></tr></table></figure><p>示例:删除远程仓库的<code>b3</code>分支</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin :b3</span><br><span class="line">To git@github.com:myoss/progit.git</span><br><span class="line"> - [deleted] b3</span><br></pre></td></tr></table></figure><p>第二种方式,使用<code>--delete</code>选项</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> <repository-branch-name> --delete</span><br></pre></td></tr></table></figure><p>示例:删除远程仓库的<code>b2</code>分支</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin b2 --delete</span><br><span class="line">To git@github.com:myoss/progit.git</span><br><span class="line"> - [deleted] b2</span><br></pre></td></tr></table></figure><h2 id="强制更新,覆盖的方式推送"><a href="#强制更新,覆盖的方式推送" class="headerlink" title="强制更新,覆盖的方式推送"></a>强制更新,覆盖的方式推送</h2><p><b>注意:<font color="red">此操作非常危险,因为能够将历史记录抹除掉,比如远程分支有3个提交:1,2,3,而本地分支有2个提交:4,5,并且和远程分支的提交不一样,如果强制推送了之后,远程分支上原来的3个提交就会丢失掉,变成和本地分支一样。总而言之,请三思而后行!!!</font></b></p><p>强制更新,会在远程仓库产生一个“非块进式”的合并(non-fast-forward merge)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> <<span class="built_in">local</span>-branch-name> -f | --force</span><br></pre></td></tr></table></figure><p>操作注意:</p><ol><li>在github中,通常会关闭对<code>master</code>分支的强制更新,关闭保护的步骤:在项目的<code>Settings</code>下的<code>Branches</code>中,找到<code>Protected branches</code>,将其关闭掉即可。</li><li>在gitlab中,通常会关闭对<code>master</code>分支的强制更新,关闭保护的步骤:在项目的<code>Settings</code>下,找到<code>Protected branches</code>,将其关闭掉即可。</li></ol><h2 id="推送标签"><a href="#推送标签" class="headerlink" title="推送标签"></a>推送标签</h2><p>默认情况下,<code>git push</code>并不会把标签推送到远程仓库,只有通过显式命令才能推送标签到远程仓库</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> <<span class="built_in">local</span>-tag-name></span><br></pre></td></tr></table></figure><h2 id="推送所有的标签"><a href="#推送所有的标签" class="headerlink" title="推送所有的标签"></a>推送所有的标签</h2><p>将本地所有的标签,推送到远程仓库(远程仓库没有的标签),注意是否有权限</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> --tags</span><br></pre></td></tr></table></figure><h2 id="推送本地所有的分支,不包含标签"><a href="#推送本地所有的分支,不包含标签" class="headerlink" title="推送本地所有的分支,不包含标签"></a>推送本地所有的分支,不包含标签</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push <repository-name> --all</span><br></pre></td></tr></table></figure><hr><h1 id="git-init"><a href="#git-init" class="headerlink" title="git init"></a>git init</h1><h2 id="初始化本地仓库"><a href="#初始化本地仓库" class="headerlink" title="初始化本地仓库"></a>初始化本地仓库</h2><p>先在本地创建一个空目录,然后在创建的目录里使用<code>git init</code>初始化仓库</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ mkdir my-work</span><br><span class="line">$ <span class="built_in">cd</span> my-work</span><br><span class="line">$ git init</span><br></pre></td></tr></table></figure><p>一步操作,仓库空目录,并初始化仓库</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git init my-work</span><br></pre></td></tr></table></figure><hr><h1 id="git-add"><a href="#git-add" class="headerlink" title="git add"></a>git add</h1><h2 id="添加未跟踪的文件"><a href="#添加未跟踪的文件" class="headerlink" title="添加未跟踪的文件"></a>添加未跟踪的文件</h2><p>使用<code>git add <文件名1>[,<文件名2>,<文件名3>]</code>添加未跟踪的文件,这不会提交到本地仓库中。如需要提交,使用<code>git commit -m "提交的注释"</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line">$ git status -s test.txt <span class="comment">#查看精简状态,显示有一个未跟踪的文件</span></span><br><span class="line">?? test.txt</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,现在有一个未跟踪的test.txt文件</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br><span class="line"></span><br><span class="line">nothing added to commit but untracked files present (use <span class="string">"git add"</span> to track)</span><br><span class="line"></span><br><span class="line">$ git add test.txt <span class="comment">#添加未跟踪的test.txt文件</span></span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#再次查看状态,test.txt文件已经放到暂存区了</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> new file: test.txt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ git status -s <span class="comment">#查看精简状态,显示有一个添加的文件</span></span><br><span class="line">A test.txt</span><br><span class="line"></span><br><span class="line">$ git commit -m<span class="string">"添加文件:test.txt"</span> <span class="comment">#提交到本地git仓库中</span></span><br><span class="line">[master d14545d] 添加文件:test.txt</span><br><span class="line"> 1 file changed, 1 insertion(+)</span><br><span class="line"> create mode 100644 test.txt</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#再次查看状态,刚才添加的文件已经提交,并且领先远程仓库一个提交</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is ahead of <span class="string">'origin/master'</span> by 1 commit.</span><br><span class="line"> (use <span class="string">"git push"</span> to publish your <span class="built_in">local</span> commits)</span><br><span class="line">nothing to commit, working directory clean</span><br><span class="line"></span><br><span class="line">$ git status -s <span class="comment">#查看精简状态,无内容</span></span><br></pre></td></tr></table></figure><h2 id="添加已经追踪的文件"><a href="#添加已经追踪的文件" class="headerlink" title="添加已经追踪的文件"></a>添加已经追踪的文件</h2><p>同样的使用<code>git add <文件名1>[,<文件名2>,<文件名3>]</code>添加已跟踪的文件,这不会提交到本地仓库中。如需要提交,使用<code>git commit -m "提交的注释"</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">$ git status <span class="comment">#查看状态,有一个文件的内容修改了</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is ahead of <span class="string">'origin/master'</span> by 1 commit.</span><br><span class="line"> (use <span class="string">"git push"</span> to publish your <span class="built_in">local</span> commits)</span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: test.txt</span><br><span class="line"></span><br><span class="line">no changes added to commit (use <span class="string">"git add"</span> and/or <span class="string">"git commit -a"</span>)</span><br><span class="line"></span><br><span class="line">$ git status -s <span class="comment">#查看精简状态,显示有一个修改的文件,`M`字符的位置在第二列,颜色为红色</span></span><br><span class="line"> M test.txt</span><br><span class="line"></span><br><span class="line">$ git add test.txt <span class="comment">#将test.txt文件修改的内容放到暂存区</span></span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#再次查看状态,test.txt文件修改的内容已经放到暂存区了</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is ahead of <span class="string">'origin/master'</span> by 1 commit.</span><br><span class="line"> (use <span class="string">"git push"</span> to publish your <span class="built_in">local</span> commits)</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: test.txt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ git status -s <span class="comment">#查看精简状态,显示有一个修改的文件,`M`字符的位置在第一列,颜色为绿色</span></span><br><span class="line">M test.txt</span><br><span class="line"></span><br><span class="line">$ git commit -m<span class="string">"new update for test.txt"</span> <span class="comment">#提交到本地git仓库中</span></span><br><span class="line">[master 3a0f2d3] new update <span class="keyword">for</span> test.txt</span><br><span class="line"> 1 file changed, 1 insertion(+)</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#再次查看状态,刚才添加的文件已经提交,并且领先远程仓库两个提交</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is ahead of <span class="string">'origin/master'</span> by 2 commits.</span><br><span class="line"> (use <span class="string">"git push"</span> to publish your <span class="built_in">local</span> commits)</span><br><span class="line">nothing to commit, working directory clean</span><br><span class="line"></span><br><span class="line">$ git status -s <span class="comment">#查看精简状态,无内容</span></span><br></pre></td></tr></table></figure><h2 id="巧用git-add,快速回退测试代码"><a href="#巧用git-add,快速回退测试代码" class="headerlink" title="巧用git add,快速回退测试代码"></a>巧用<code>git add</code>,快速回退测试代码</h2><p>假设已经开发好了某个功能,这时候用<code>git add</code>添加,但不做<code>git commit</code></p><blockquote><p>场景一:这时候我再去添加些测试代码测试,比如<code>System.out.println</code>这种代码,测试下来发现我刚才<code>git add</code>的代码都是OK的,这时候我用<code>git checkout</code>就能快速安全的删掉刚才添加的测试代码。<br>场景二:我发现刚才<code>git add</code>的代码不够完美,修改完成之后,再次用<code>git add</code>添加,就会合并到上一次<code>git add</code>的代码中了,然后做为一次<code>git commit</code>。</p></blockquote><hr><h1 id="git-status"><a href="#git-status" class="headerlink" title="git status"></a>git status</h1><h2 id="查看当前分支的文件变化状态"><a href="#查看当前分支的文件变化状态" class="headerlink" title="查看当前分支的文件变化状态"></a>查看当前分支的文件变化状态</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure><h2 id="查看精简状态"><a href="#查看精简状态" class="headerlink" title="查看精简状态"></a>查看精简状态</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status -s</span><br></pre></td></tr></table></figure><p><code>M</code>字符的位置在第二列,颜色为红色,表示工作区当前的文件与暂存区的文件相比有改动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git status -s</span><br><span class="line"> M test.txt</span><br></pre></td></tr></table></figure><p><code>M</code>字符的位置在第一列,颜色为绿色,表示版本库中的文件与暂存区中的文件相比有改动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git status -s</span><br><span class="line">M test.txt</span><br></pre></td></tr></table></figure><p>同时显示所在的分支</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git status -sb</span><br><span class="line"><span class="comment">## master...origin/master [ahead 2]</span></span><br></pre></td></tr></table></figure><hr><h1 id="git-cherry"><a href="#git-cherry" class="headerlink" title="git cherry"></a>git cherry</h1><h2 id="查看本地分支领先远程仓库的提交"><a href="#查看本地分支领先远程仓库的提交" class="headerlink" title="查看本地分支领先远程仓库的提交"></a>查看本地分支领先远程仓库的提交</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git cherry</span><br><span class="line">+ d14545d3754498d664caea7672761305b59dd162</span><br><span class="line">+ 3a0f2d351733ed9d234e6f0498bc533c11048686</span><br></pre></td></tr></table></figure><hr><h1 id="git-diff"><a href="#git-diff" class="headerlink" title="git diff"></a>git diff</h1><h2 id="比较工作区和暂存区"><a href="#比较工作区和暂存区" class="headerlink" title="比较工作区和暂存区"></a>比较工作区和暂存区</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff</span><br></pre></td></tr></table></figure><h2 id="逐词比较,而非默认的逐行比较"><a href="#逐词比较,而非默认的逐行比较" class="headerlink" title="逐词比较,而非默认的逐行比较"></a>逐词比较,而非默认的逐行比较</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff --word-diff</span><br></pre></td></tr></table></figure><h2 id="比较暂存区和HEAD(本地git仓库)"><a href="#比较暂存区和HEAD(本地git仓库)" class="headerlink" title="比较暂存区和HEAD(本地git仓库)"></a>比较暂存区和<code>HEAD</code>(本地git仓库)</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git diff --cached</span><br><span class="line">git diff --staged</span><br></pre></td></tr></table></figure><h2 id="比较工作区和HEAD(本地git仓库)"><a href="#比较工作区和HEAD(本地git仓库)" class="headerlink" title="比较工作区和HEAD(本地git仓库)"></a>比较工作区和<code>HEAD</code>(本地git仓库)</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff HEAD</span><br></pre></td></tr></table></figure><h2 id="比较两个提交"><a href="#比较两个提交" class="headerlink" title="比较两个提交"></a>比较两个提交</h2><p>用<code>SHA-1</code>值(前7位即可)比较两次提交之间的差异。注意顺序不一样,查看到的结果也会不一样。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff <<span class="variable">$id1</span>> <<span class="variable">$id2</span>></span><br></pre></td></tr></table></figure><h2 id="比较两个分支"><a href="#比较两个分支" class="headerlink" title="比较两个分支"></a>比较两个分支</h2><p>只比较已经提交的内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff <branch1> <branch2></span><br></pre></td></tr></table></figure><h2 id="比较两个远程分支"><a href="#比较两个远程分支" class="headerlink" title="比较两个远程分支"></a>比较两个远程分支</h2><p>注意:可能需要先执行<code>git fetch</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff pro/master pro/b1</span><br></pre></td></tr></table></figure><h2 id="当前分支比较另外一个分支"><a href="#当前分支比较另外一个分支" class="headerlink" title="当前分支比较另外一个分支"></a>当前分支比较另外一个分支</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff <branch2> [current-branch]</span><br></pre></td></tr></table></figure><h2 id="比较之后,显示简要的增改行数统计"><a href="#比较之后,显示简要的增改行数统计" class="headerlink" title="比较之后,显示简要的增改行数统计"></a>比较之后,显示简要的增改行数统计</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git diff --<span class="built_in">stat</span></span><br><span class="line"> test.txt | 3 ++-</span><br><span class="line"> 1 file changed, 2 insertions(+), 1 deletion(-)</span><br></pre></td></tr></table></figure><h2 id="比较二进制文件差异"><a href="#比较二进制文件差异" class="headerlink" title="比较二进制文件差异"></a>比较二进制文件差异</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff --binary</span><br></pre></td></tr></table></figure><hr><h1 id="git-stash"><a href="#git-stash" class="headerlink" title="git stash"></a>git stash</h1><h2 id="储藏当前工作区和暂存区修改的内容"><a href="#储藏当前工作区和暂存区修改的内容" class="headerlink" title="储藏当前工作区和暂存区修改的内容"></a>储藏当前工作区和暂存区修改的内容</h2><p>使用场景,当需要紧急处理一个bug时,工作区内容又没有完成,不适合提交,将未完成的修改保存到一个栈上,而你可以在任何时候重新应用这些改动。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash</span><br></pre></td></tr></table></figure><p>示例:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git stash</span><br><span class="line">Saved working directory and index state WIP on master: ae1ffd1 merge ...</span><br><span class="line">HEAD is now at ae1ffd1 merge ...</span><br></pre></td></tr></table></figure><h2 id="储藏的完整命令"><a href="#储藏的完整命令" class="headerlink" title="储藏的完整命令"></a>储藏的完整命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [<message>]</span><br></pre></td></tr></table></figure><p>如果需要在保存储藏的时候指定说明</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash save <message></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git stash save <span class="string">"9 modify"</span></span><br><span class="line">Saved working directory and index state On master: 9 modify</span><br><span class="line">HEAD is now at ae1ffd1 merge ...</span><br></pre></td></tr></table></figure><p>使用参数<code>--patch</code>会显示工作区和<code>HEAD</code>的差异,通过对比差异文件的编辑决定在进度中最终要保存的工作的内容,通过编辑差异文件可以在进度中排除无关内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash --patch</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">$ git stash --patch</span><br><span class="line">diff --git a/hello.md b/hello.md</span><br><span class="line">index 70b7830..d866fb0 100644</span><br><span class="line">--- a/hello.md</span><br><span class="line">+++ b/hello.md</span><br><span class="line">@@ -10,4 +10,7 @@</span><br><span class="line"> 7 modify</span><br><span class="line"> branch b1 1 modify branch b1 3 modify</span><br><span class="line"> branch b1 2 modify branch b1 4 modify</span><br><span class="line">+10 modify 1</span><br><span class="line">+10 modify 2</span><br><span class="line">+10 modify 3</span><br><span class="line"> branch b2 1 modify</span><br><span class="line">Stash this hunk [y,n,q,a,d,/,e,?]? ?</span><br><span class="line">y - stash this hunk</span><br><span class="line">n - <span class="keyword">do</span> not stash this hunk</span><br><span class="line">q - quit; <span class="keyword">do</span> not stash this hunk or any of the remaining ones</span><br><span class="line">a - stash this hunk and all later hunks <span class="keyword">in</span> the file</span><br><span class="line">d - <span class="keyword">do</span> not stash this hunk or any of the later hunks <span class="keyword">in</span> the file</span><br><span class="line">g - select a hunk to go to</span><br><span class="line">/ - search <span class="keyword">for</span> a hunk matching the given regex</span><br><span class="line">j - leave this hunk undecided, see next undecided hunk</span><br><span class="line">J - leave this hunk undecided, see next hunk</span><br><span class="line">k - leave this hunk undecided, see previous undecided hunk</span><br><span class="line">K - leave this hunk undecided, see previous hunk</span><br><span class="line">s - split the current hunk into smaller hunks</span><br><span class="line">e - manually edit the current hunk</span><br><span class="line">? - <span class="built_in">print</span> <span class="built_in">help</span></span><br><span class="line">@@ -10,4 +10,7 @@</span><br><span class="line"> 7 modify</span><br><span class="line"> branch b1 1 modify branch b1 3 modify</span><br><span class="line"> branch b1 2 modify branch b1 4 modify</span><br><span class="line">+10 modify 1</span><br><span class="line">+10 modify 2</span><br><span class="line">+10 modify 3</span><br><span class="line"> branch b2 1 modify</span><br><span class="line">Stash this hunk [y,n,q,a,d,/,e,?]?</span><br></pre></td></tr></table></figure><p>使用<code>-k</code>或<code>--keep-index</code>参数,在保存进度后不将<code>暂存区</code>重置(默认会将<code>暂存区</code>和<code>工作区</code>强制重置,即命令:<code>--no-keep-index</code>的效果)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git bash -k | --keep-index</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">$ git status <span class="comment">#当前暂存区有一个修改的文件</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ git stash -k <span class="comment">#储藏</span></span><br><span class="line">Saved working directory and index state WIP on master: ae1ffd1 merge ...</span><br><span class="line">HEAD is now at ae1ffd1 merge ...</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#储藏之后,暂存区修改的文件没有被清空</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br></pre></td></tr></table></figure><p>使用<code>-u|--include-untracked</code>,同时储藏未跟踪文件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash save -u|--include-untracked</span><br></pre></td></tr></table></figure><p>使用<code>-a|--all</code>来储藏所有的改动,包括未跟踪文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash save -a|--all</span><br></pre></td></tr></table></figure><h2 id="查看已经保存的储藏列表"><a href="#查看已经保存的储藏列表" class="headerlink" title="查看已经保存的储藏列表"></a>查看已经保存的储藏列表</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git stash list</span><br><span class="line">stash@{0}: On master: 9 modify</span><br><span class="line">stash@{1}: WIP on master: ae1ffd1 merge ...</span><br></pre></td></tr></table></figure><h2 id="删除储藏"><a href="#删除储藏" class="headerlink" title="删除储藏"></a>删除储藏</h2><p>如果没有指定是第几个储藏时,默认会删除最近的一次储藏</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash drop [-q|--quiet] [<stash@{n}>]</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git stash drop stash@{0}</span><br><span class="line">Dropped stash@{0} (2fa94640f400006a6ba812b3c02e8b0e91472958)</span><br></pre></td></tr></table></figure><h2 id="删除所有的储藏"><a href="#删除所有的储藏" class="headerlink" title="删除所有的储藏"></a>删除所有的储藏</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash clear</span><br></pre></td></tr></table></figure><h2 id="查看-某次-储藏修改的内容"><a href="#查看-某次-储藏修改的内容" class="headerlink" title="查看[某次]储藏修改的内容"></a>查看[某次]储藏修改的内容</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash show [<stash@{n}>]</span><br></pre></td></tr></table></figure><p>示例:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ git stash show <span class="comment">#查看最后一次的储藏</span></span><br><span class="line"> hello.md | 2 ++</span><br><span class="line"> 1 file changed, 2 insertions(+)</span><br><span class="line"></span><br><span class="line">$ git stash show stash@{1} <span class="comment">#查看某次的储藏</span></span><br><span class="line"> hello.md | 1 +</span><br><span class="line"> 1 file changed, 1 insertion(+)</span><br></pre></td></tr></table></figure><h2 id="恢复保存的工作进度"><a href="#恢复保存的工作进度" class="headerlink" title="恢复保存的工作进度"></a>恢复保存的工作进度</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash <pop | apply> [--index] [-q|--quiet] [<stash@{n}>]</span><br></pre></td></tr></table></figure><p>如果不使用任何参数,恢复最近一次保存的工作进度</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git stash pop <span class="comment">#会从储藏列表中删除刚刚恢复的暂存</span></span><br><span class="line">git stash apply <span class="comment">#不会从储藏列表中删除刚刚恢复的暂存</span></span><br></pre></td></tr></table></figure><p>如果使用<code><stash@{n}></code>参数,则从该<code><stash@{n}></code>中恢复保存的内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git stash pop <stash@{n}> <span class="comment">#会从储藏列表中删除该`<stash@{n}>`</span></span><br><span class="line">git stash apply <stash@{n}> <span class="comment">#不会从储藏列表中删除该`<stash@{n}>`</span></span><br></pre></td></tr></table></figure><p><code>--index</code>除了恢复工作区的文件外,还会恢复暂存区的内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git stash pop --index</span><br><span class="line">git stash apply --index</span><br></pre></td></tr></table></figure><h2 id="使用储藏的内容创建新的分支"><a href="#使用储藏的内容创建新的分支" class="headerlink" title="使用储藏的内容创建新的分支"></a>使用储藏的内容创建新的分支</h2><p><code><branch-name></code>不能是已经存在的分支,并切换到创建的新分支,删除掉该储藏</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash branch <branch-name> [<stash@{n}>]</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">$ git stash branch b2</span><br><span class="line">Switched to a new branch <span class="string">'b2'</span></span><br><span class="line"><stdin>:9: trailing whitespace.</span><br><span class="line">10 modify 2</span><br><span class="line">warning: 1 line adds whitespace errors.</span><br><span class="line">On branch b2</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Dropped refs/stash@{0} (3eaa4512757a598193acb1f9f0a7f91dc6c165b1)</span><br></pre></td></tr></table></figure><h2 id="查看储藏列表的SHA-1值"><a href="#查看储藏列表的SHA-1值" class="headerlink" title="查看储藏列表的SHA-1值"></a>查看储藏列表的<code>SHA-1</code>值</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git reflog show refs/stash</span><br><span class="line">5afe096 refs/stash@{0}: On master: 9 modify</span><br><span class="line">a5c6080 refs/stash@{1}: WIP on master: ae1ffd1 merge ...</span><br></pre></td></tr></table></figure><hr><h1 id="git-commit"><a href="#git-commit" class="headerlink" title="git commit"></a>git commit</h1><h2 id="仓库中的文件可能存在于这三种状态"><a href="#仓库中的文件可能存在于这三种状态" class="headerlink" title="仓库中的文件可能存在于这三种状态"></a>仓库中的文件可能存在于这三种状态</h2><ol><li><code>Untracked files</code> → 文件未被跟踪</li><li><code>Changes to be committed</code> → 文件已暂存,这是下次提交的内容</li><li><code>Changes not staged for commit</code> → 文件被修改,但并没有添加到暂存区。如果<code>commit</code>时没有带<code>-a</code>选项,此状态下的文件不会被提交。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">$ git status</span><br><span class="line">On branch b2</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br></pre></td></tr></table></figure><h2 id="提交暂存区的内容"><a href="#提交暂存区的内容" class="headerlink" title="提交暂存区的内容"></a>提交暂存区的内容</h2><p>提交状态为<code>Changes to be committed</code>的内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit [-m <message>]</span><br></pre></td></tr></table></figure><h2 id="提交暂存区和工作区的内容"><a href="#提交暂存区和工作区的内容" class="headerlink" title="提交暂存区和工作区的内容"></a>提交暂存区和工作区的内容</h2><p>提交状态为<code>Changes to be committed</code>和<code>Changes not staged for commit</code>的内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -a [-m <message>]</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">$ git status</span><br><span class="line">On branch b2</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br><span class="line"></span><br><span class="line">$ git commit -a -m<span class="string">"commit with -a"</span></span><br><span class="line">[b2 48c54d7] commit with -a</span><br><span class="line"> 1 file changed, 3 insertions(+)</span><br><span class="line"></span><br><span class="line">$ git status</span><br><span class="line">On branch b2</span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br></pre></td></tr></table></figure><h2 id="修改或者撤销最后一次提交"><a href="#修改或者撤销最后一次提交" class="headerlink" title="修改或者撤销最后一次提交"></a>修改或者撤销最后一次提交</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git commit --amend <span class="comment">#进入交互终端模式</span></span><br><span class="line">git commit --amend -m <message> <span class="comment">#修改最后一次提交的注释</span></span><br></pre></td></tr></table></figure><p>修改最后一次提交,退出编辑器之后会直接<code>commit</code>。如果要取消,则在编辑器里清空掉提交信息再退出即可。使用场景如:修改提交信息、补正刚才修改的内容(需要先<code>git add</code>)、少添加文件了(需要先<code>git add</code>),谨慎操作!!</p><hr><h1 id="git-checkout"><a href="#git-checkout" class="headerlink" title="git checkout"></a>git checkout</h1><h2 id="汇总显示(工作区和暂存区)与HEAD的差异"><a href="#汇总显示(工作区和暂存区)与HEAD的差异" class="headerlink" title="汇总显示(工作区和暂存区)与HEAD的差异"></a>汇总显示(工作区和暂存区)与<code>HEAD</code>的差异</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git checkout [HEAD]</span><br><span class="line">git checkout HEAD</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">$ git status</span><br><span class="line">On branch b2</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: README.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ git checkout <span class="comment">#不会统计未追踪的文件</span></span><br><span class="line">M README.md</span><br><span class="line">M hello.md</span><br><span class="line"></span><br><span class="line">$ git checkout HEAD</span><br><span class="line">M README.md</span><br><span class="line">M hello.md</span><br></pre></td></tr></table></figure><h2 id="撤销工作区的修改"><a href="#撤销工作区的修改" class="headerlink" title="撤销工作区的修改"></a>撤销工作区的修改</h2><p>用暂存区中的内容覆盖工作区的内容,如果使用<code>.</code>,而没有指定具体的<code>file</code>,会替换工作区所有有改动的文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout [--] <. | file></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">$ git status</span><br><span class="line">On branch b2</span><br><span class="line">Changes to be committed: <span class="comment">#暂存区的修改</span></span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit: <span class="comment">#工作区的修改</span></span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ git checkout hello.md <span class="comment">#使用暂存区的内容覆盖工作区的内容</span></span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#工作区没有修改的内容</span></span><br><span class="line">On branch b2</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br></pre></td></tr></table></figure><h2 id="用HEAD中的内容替换暂存区和工作区的修改"><a href="#用HEAD中的内容替换暂存区和工作区的修改" class="headerlink" title="用HEAD中的内容替换暂存区和工作区的修改"></a>用<code>HEAD</code>中的内容替换暂存区和工作区的修改</h2><p>取出最近的一次提交的内容,替换暂存区和工作区的修改,如果使用<code>.</code>,而没有指定具体的<code>file</code>,会替换暂存区和工作区中所有有改动的文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git checkout [--] <. | file></span><br><span class="line">git checkout <file></span><br><span class="line">git checkout .</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">$ git status <span class="comment">#暂存区和工作区都有修改</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ git checkout HEAD hello.md <span class="comment">#撤销暂存区和工作区的修改</span></span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#hello.md在暂存区和工作区没有修改</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br></pre></td></tr></table></figure><h2 id="使用其它分支的内容替换当前分支上暂存区和工作区的内容"><a href="#使用其它分支的内容替换当前分支上暂存区和工作区的内容" class="headerlink" title="使用其它分支的内容替换当前分支上暂存区和工作区的内容"></a>使用其它分支的内容替换当前分支上暂存区和工作区的内容</h2><p><code>HEAD</code>的指向不会变化</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout <branch-name> [--] <file></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line">Administrator@Jerry-WIN8-TP MINGW64 /d/workspaces/<span class="built_in">test</span>/progit (master)</span><br><span class="line">$ git status <span class="comment">#当前分支是:master,hello.md在暂存区和工作区都有修改</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Administrator@Jerry-WIN8-TP MINGW64 /d/workspaces/<span class="built_in">test</span>/progit (master)</span><br><span class="line">$ git diff b2 <span class="comment">#master分支和b2分支比较hello.md的内容</span></span><br><span class="line">diff --git a/hello.md b/hello.md</span><br><span class="line">index d866fb0..44d3964 100644</span><br><span class="line">--- a/hello.md</span><br><span class="line">+++ b/hello.md</span><br><span class="line">@@ -8,9 +8,8 @@</span><br><span class="line"> 6 modify</span><br><span class="line"> 7 modify by jerry</span><br><span class="line"> 7 modify</span><br><span class="line">+8 modify^M <span class="comment">#master分支上的内容</span></span><br><span class="line"> branch b1 1 modify branch b1 3 modify</span><br><span class="line"> branch b1 2 modify branch b1 4 modify</span><br><span class="line">-10 modify 1 <span class="comment">#b2分支上的内容</span></span><br><span class="line">-10 modify 2</span><br><span class="line">-10 modify 3</span><br><span class="line">+master modify 11^M</span><br><span class="line"> branch b2 1 modify</span><br><span class="line"></span><br><span class="line">Administrator@Jerry-WIN8-TP MINGW64 /d/workspaces/<span class="built_in">test</span>/progit (master)</span><br><span class="line">$ git checkout b2 hello.md <span class="comment">#用b2分支上hello.md的内容替换暂存区和工作区的内容</span></span><br><span class="line"></span><br><span class="line">Administrator@Jerry-WIN8-TP MINGW64 /d/workspaces/<span class="built_in">test</span>/progit (master)</span><br><span class="line">$ git diff b2 <span class="comment">#master分支和b2分支没有差异</span></span><br><span class="line"></span><br><span class="line">Administrator@Jerry-WIN8-TP MINGW64 /d/workspaces/<span class="built_in">test</span>/progit (master)</span><br><span class="line">$ git status <span class="comment">#暂存区还是有hello.md这个文件</span></span><br><span class="line">On branch master</span><br><span class="line">Your branch is up-to-date with <span class="string">'origin/master'</span>.</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: hello.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.txt</span><br><span class="line"></span><br><span class="line">Administrator@Jerry-WIN8-TP MINGW64 /d/workspaces/<span class="built_in">test</span>/progit (master)</span><br><span class="line">$ cat hello.md <span class="comment">#查看master分支上hello.md文件内容,发现b2分支的内容替换过来了</span></span><br><span class="line">6 modify</span><br><span class="line">1 add</span><br><span class="line">2 modify</span><br><span class="line">3 modify</span><br><span class="line">4 mdofiy --> amend 3</span><br><span class="line">5 modify</span><br><span class="line">6 modify by jerry</span><br><span class="line">6 modify</span><br><span class="line">7 modify by jerry</span><br><span class="line">7 modify</span><br><span class="line">branch b1 1 modify branch b1 3 modify</span><br><span class="line">branch b1 2 modify branch b1 4 modify</span><br><span class="line">10 modify 1 <span class="comment">#这3行是b2分支上添加的内容,现在出现在master分支上了</span></span><br><span class="line">10 modify 2</span><br><span class="line">10 modify 3</span><br><span class="line">branch b2 1 modify</span><br></pre></td></tr></table></figure><hr><h1 id="git-reset"><a href="#git-reset" class="headerlink" title="git reset"></a>git reset</h1><h2 id="基本操作"><a href="#基本操作" class="headerlink" title="基本操作"></a>基本操作</h2><p>将当前的分支重设(reset)到指定的<code><commit></code>或者<code>HEAD</code>(如果不显示指定<code>commit</code>,默认是<code>HEAD</code>,即最新的一次提交),并且根据<code>选项</code>有可能更新<code>暂存区</code>和<code>工作区</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]</span><br></pre></td></tr></table></figure><p><code>--soft</code>:<code>暂存区</code>和<code>工作区</code>中的内容不作任何改变,仅仅把<code>HEAD</code>指向<code><commit></code>。这个模式的效果是,执行完毕后,自从<code><commit></code>以来的所有改变都会显示为<code>Changes to be committed</code>(<code>git status</code>) 。<b><font color="red">不会丢失任何改动</font></b></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git reset --soft <commit></span><br><span class="line"></span><br><span class="line">git reset --soft HEAD^ <span class="comment">#HEAD^代表版本库中的最近一次提交的父提交,即重置到倒数第二次提交</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line">$ git hist <span class="comment">#现在有3个提交</span></span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ cat readme.md <span class="comment">#文件的内容如下</span></span><br><span class="line">v1</span><br><span class="line">v2</span><br><span class="line">v3</span><br><span class="line">v4</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#工作区有修改的内容,暂存区没有修改的内容</span></span><br><span class="line">On branch master</span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">$ git diff <span class="comment">#比较工作区和暂存区</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 4b1d4d4..ed7ce12 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,3 +1,4 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line">+v4 <span class="comment">#工作区修改的内容</span></span><br><span class="line"></span><br><span class="line">$ git reset --soft c7ded78 <span class="comment">#将分支重设到第二次提交</span></span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,暂存区显示有待提交的内容</span></span><br><span class="line">On branch master</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">$ git diff <span class="comment">#比较工作区和暂存区,工作区的内容还是之前的</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 4b1d4d4..ed7ce12 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,3 +1,4 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line">+v4</span><br><span class="line"></span><br><span class="line">$ git diff --cached HEAD <span class="comment">#比较暂存区和HEAD的差异</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 2139d8b..4b1d4d4 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,2 +1,3 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line">+v3 <span class="comment">#这一行就是第三次提交的内容</span></span><br><span class="line"></span><br><span class="line">$ git hist <span class="comment">#查看提交日志</span></span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ cat readme.md</span><br><span class="line">v1</span><br><span class="line">v2</span><br><span class="line">v3</span><br><span class="line">v4</span><br></pre></td></tr></table></figure><p><code>--hard</code>:重设<code>暂存区</code>和<code>工作区</code>,自从<code><commit></code>以来在<code>工作区</code>中的任何改变都被丢弃,并把<code>HEAD</code>指向<code><commit></code>。<b><font color="red">会丢失改动</font></b></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git reset --hard <commit></span><br><span class="line"></span><br><span class="line">git reset --hard HEAD^ <span class="comment">#HEAD^代表版本库中的最近一次提交的父提交,即丢弃掉最近的一次提交</span></span><br><span class="line"></span><br><span class="line">git reset --hard origin/master <span class="comment">#丢弃在本地的所有改动与提交,用远程仓库的提交覆盖</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line">$ git hist <span class="comment">#现在有3个提交</span></span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ cat readme.md <span class="comment">#文件的内容如下</span></span><br><span class="line">v1</span><br><span class="line">v2</span><br><span class="line">v3</span><br><span class="line">v4</span><br><span class="line">v5</span><br><span class="line"></span><br><span class="line">$ git diff <span class="comment">#比较工作区和暂存区</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index ed7ce12..4d73d61 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -2,3 +2,4 @@ v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line"> v4</span><br><span class="line">+v5 <span class="comment">#工作区修改的内容</span></span><br><span class="line"></span><br><span class="line">$ git diff --cached HEAD <span class="comment">#比较暂存区和HEAD的差异</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 4b1d4d4..ed7ce12 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,3 +1,4 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line">+v4 <span class="comment">#暂存区修改的内容</span></span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,工作区和暂存区显示有修改的内容</span></span><br><span class="line">On branch master</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">$ git reset --hard c7ded78 <span class="comment">#将分支重设到第二次提交</span></span><br><span class="line">HEAD is now at c7ded78 v2 commit</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,工作区和暂存区显示没有修改的内容</span></span><br><span class="line">On branch master</span><br><span class="line">nothing to commit, working directory clean</span><br><span class="line"></span><br><span class="line">$ git hist <span class="comment">#查看提交日志</span></span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ cat readme.md <span class="comment">#查看文件的内容,重设前的工作区和暂存区修改的内容已经丢失掉了</span></span><br><span class="line">v1</span><br><span class="line">v2</span><br></pre></td></tr></table></figure><p><code>--mixed</code>:仅重设<code>暂存区</code>,但是不重设<code>工作区</code>。这个模式是默认模式,即当不显示告知<code>git reset</code>模式时,会使用<code>--mixed</code>模式。这个模式的效果是,<code>工作区</code>中文件的修改都会被保留,不会丢弃,但是也不会被标记成<code>Changes to be committed</code>。<b><font color="red">不会丢失任何改动</font></b></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git reset <commit></span><br><span class="line">git reset --mixed <commit></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line">$ git hist <span class="comment">#现在有3个提交</span></span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ cat readme.md <span class="comment">#文件的内容如下</span></span><br><span class="line">v1</span><br><span class="line">v2</span><br><span class="line">v3</span><br><span class="line">v4</span><br><span class="line">v5</span><br><span class="line"></span><br><span class="line">$ git diff <span class="comment">#比较工作区和暂存区</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index ed7ce12..4d73d61 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -2,3 +2,4 @@ v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line"> v4</span><br><span class="line">+v5 <span class="comment">#工作区修改的内容</span></span><br><span class="line"></span><br><span class="line">$ git diff --cached HEAD <span class="comment">#比较暂存区和HEAD的差异</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 4b1d4d4..ed7ce12 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,3 +1,4 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line">+v4 <span class="comment">#暂存区修改的内容</span></span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,工作区和暂存区显示有修改的内容</span></span><br><span class="line">On branch master</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">$ git reset --mixed c7ded78 <span class="comment">#将分支重设到第二次提交</span></span><br><span class="line">Unstaged changes after reset:</span><br><span class="line">M readme.md</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,暂存区没有待提交的内容</span></span><br><span class="line">On branch master</span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">no changes added to commit (use <span class="string">"git add"</span> and/or <span class="string">"git commit -a"</span>)</span><br><span class="line"></span><br><span class="line">$ git diff <span class="comment">#比较工作区和暂存区</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 2139d8b..4d73d61 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,2 +1,5 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line">+v3 <span class="comment">#重设前HEAD的内容,出现在工作区了</span></span><br><span class="line">+v4 <span class="comment">#重设前暂存区的内容,出现在工作区了</span></span><br><span class="line">+v5 <span class="comment">#重设前工作区的内容</span></span><br><span class="line"></span><br><span class="line">$ git hist <span class="comment">#查看提交日志</span></span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ cat readme.md <span class="comment">#查看文件的内容,重设前的工作区和暂存区修改的内容没有丢失掉了</span></span><br><span class="line">v1</span><br><span class="line">v2</span><br><span class="line">v3</span><br><span class="line">v4</span><br><span class="line">v5</span><br></pre></td></tr></table></figure><h2 id="重置暂存区"><a href="#重置暂存区" class="headerlink" title="重置暂存区"></a>重置暂存区</h2><p>将暂存区添加的内容,回退到工作区,改动不会丢失。如果指定了文件<code><file></code>,则只处理此文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">git reset HEAD</span><br><span class="line">git reset --</span><br><span class="line">git reset</span><br><span class="line"></span><br><span class="line">git reset HEAD <file></span><br><span class="line">git reset -- <file></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line">$ git hist <span class="comment">#现在有3个提交</span></span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,暂存区显示有修改的内容</span></span><br><span class="line">On branch master</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"> new file: test.md</span><br><span class="line"></span><br><span class="line">$ git diff</span><br><span class="line"></span><br><span class="line">$ git diff --cached <span class="comment">#比较工作区和暂存区</span></span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 4b1d4d4..0d6160d 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,3 +1,4 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line">+v4</span><br><span class="line">diff --git a/test.md b/test.md</span><br><span class="line">new file mode 100644</span><br><span class="line">index 0000000..e69de29</span><br><span class="line"></span><br><span class="line">$ git reset HEAD <span class="comment">#重置暂存区</span></span><br><span class="line">Unstaged changes after reset:</span><br><span class="line">M readme.md</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,刚才在暂存区待提交的内容已经退回到工作区</span></span><br><span class="line">On branch master</span><br><span class="line">Changes not staged <span class="keyword">for</span> commit:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to update what will be committed)</span><br><span class="line"> (use <span class="string">"git checkout -- <file>..."</span> to discard changes <span class="keyword">in</span> working directory)</span><br><span class="line"></span><br><span class="line"> modified: readme.md</span><br><span class="line"></span><br><span class="line">Untracked files:</span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> test.md</span><br><span class="line"></span><br><span class="line">no changes added to commit (use <span class="string">"git add"</span> and/or <span class="string">"git commit -a"</span>)</span><br><span class="line"></span><br><span class="line">$ git diff</span><br><span class="line">diff --git a/readme.md b/readme.md</span><br><span class="line">index 4b1d4d4..0d6160d 100644</span><br><span class="line">--- a/readme.md</span><br><span class="line">+++ b/readme.md</span><br><span class="line">@@ -1,3 +1,4 @@</span><br><span class="line"> v1</span><br><span class="line"> v2</span><br><span class="line"> v3</span><br><span class="line">+v4</span><br></pre></td></tr></table></figure><h2 id="实战:两个提交压缩为一个"><a href="#实战:两个提交压缩为一个" class="headerlink" title="实战:两个提交压缩为一个"></a>实战:两个提交压缩为一个</h2><p>使用<code>--soft</code>参数调用重置命令,回到最近两次提交之前</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reset --soft HEAD^^</span><br></pre></td></tr></table></figure><p>查看版本状态和最新日志,如果需要修改就进行修改</p><p>执行提交操作,即完成最新两个提交压缩为一个</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m<span class="string">"Message"</span></span><br></pre></td></tr></table></figure><hr><h1 id="git-rebase"><a href="#git-rebase" class="headerlink" title="git rebase"></a>git rebase</h1><h2 id="交互式变基操作"><a href="#交互式变基操作" class="headerlink" title="交互式变基操作"></a>交互式变基操作</h2><p><code><since></code>和<code><till></code>代表历史提交的<code>SHA-1</code>值,变基的范围是从<code><since></code>(不包括<code><since></code>)的下一个提交到<code><till></code>,如果<code><till></code>没有给出,则变基的范围到当前<code>HEAD</code>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase -i <since> [<till>]</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">$ git hist <span class="comment">#现在有5个提交</span></span><br><span class="line">* 1c1e018 v5 commit</span><br><span class="line">* 45d9dfb v4 commit</span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ git rebase -i c7ded78 45d9dfb <span class="comment">#变基范围为第三个提交到第四个提交</span></span><br><span class="line"><span class="comment">#稍等一会儿,就会弹出交互式界面,如果范围比较长需要等待的时间会久一些,如下:</span></span><br><span class="line"></span><br><span class="line">pick adba38b v3 commit</span><br><span class="line">pick 45d9dfb v4 commit</span><br><span class="line"></span><br><span class="line"><span class="comment"># Rebase c7ded78..45d9dfb onto c7ded78 (2 command(s)) #能够操作的提交只有2个</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Commands:</span></span><br><span class="line"><span class="comment"># p, pick = use commit</span></span><br><span class="line"><span class="comment"># r, reword = use commit, but edit the commit message</span></span><br><span class="line"><span class="comment"># e, edit = use commit, but stop for amending</span></span><br><span class="line"><span class="comment"># s, squash = use commit, but meld into previous commit</span></span><br><span class="line"><span class="comment"># f, fixup = like "squash", but discard this commit's log message</span></span><br><span class="line"><span class="comment"># x, exec = run command (the rest of the line) using shell</span></span><br><span class="line"><span class="comment"># d, drop = remove commit</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># These lines can be re-ordered; they are executed from top to bottom.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># If you remove a line here THAT COMMIT WILL BE LOST.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># However, if you remove everything, the rebase will be aborted.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Note that empty commits are commented out</span></span><br></pre></td></tr></table></figure><ol><li>开头的几行由上到下依次对应历史的提交,如果删除掉这些提交保存退出交互式模式,则不执行变基动作</li><li><code>pick</code>,或简写<code>p</code>,默认的动作,即应用此提交</li><li><code>reword</code>,或简写<code>r</code>。在变基时会应用此提交,但是在提交的时候允许用户修改提交说明</li><li><code>edit</code>,或简写<code>e</code>。在变基时会应用此提交,但是在应用后你可以进行内容编辑,需要使用<code>git commit --amend</code>执行提交,以便对提交进行修补。当用户执行<code>git commit --amend</code>完成提交后,还需要执行<code>git rebase --continue</code>继续变基操作。用户在变基暂停状态下可以执行多次提交,从而实现把一个提交分解为多个提交</li><li><code>squash</code>,简写<code>s</code>。该提交会与前面的提交压缩为一个</li><li><code>fixup</code>,简写<code>f</code>。类似动作<code>squash</code>,但是提交的提交说明被丢弃</li><li>可以通过修改变基任务文件中各个提交的先后顺序,进而改变最终变基后提交的先后顺序</li><li>可以通过改变变基任务文件,删除包含相应提交的行,这样该提交就不会被应用,进而在变基后的提交中被删除</li></ol><p>在变基遇到冲突而暂停的情况下,先完成冲突解决(添加到暂存区,不提交),然后在恢复变基操作的时候使用该命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase --<span class="built_in">continue</span></span><br></pre></td></tr></table></figure><p>在变基遇到冲突而暂停的情况下,跳过当前提交的时候使用,谨慎用</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase –abort</span><br></pre></td></tr></table></figure><p>在变基遇到冲突而暂停的情况下,终止变基操作,回到之前的分支时候使用</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rebase –skip</span><br></pre></td></tr></table></figure><h2 id="将其它分支上的修改应用到当前分支"><a href="#将其它分支上的修改应用到当前分支" class="headerlink" title="将其它分支上的修改应用到当前分支"></a>将其它分支上的修改应用到当前分支</h2><p>将远程仓库的更新,合并到当前分支上产生一个新的提交,如果工作区或者暂存区有未提交的更改,变基动作不会执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin master</span><br><span class="line">git rebase origin/master</span><br></pre></td></tr></table></figure><hr><h1 id="git-branch"><a href="#git-branch" class="headerlink" title="git branch"></a>git branch</h1><h2 id="显示所有分支信息"><a href="#显示所有分支信息" class="headerlink" title="显示所有分支信息"></a>显示所有分支信息</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git branch</span><br><span class="line">git branch -v</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ git branch <span class="comment">#显示所有分支名称</span></span><br><span class="line"> b1</span><br><span class="line">* master</span><br><span class="line"></span><br><span class="line">$ git branch -v <span class="comment">#显示所有分支名称,同时显示最后的提交注释,*:代表当前分支</span></span><br><span class="line"> b1 45d9dfb v4 commit</span><br><span class="line">* master 1c1e018 v5 commit</span><br></pre></td></tr></table></figure><h2 id="创建新分支"><a href="#创建新分支" class="headerlink" title="创建新分支"></a>创建新分支</h2><p>创建新分支之后,不会自动切换到新分支上</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch <new-branch-name></span><br></pre></td></tr></table></figure><p>基于<code><commit></code>创建新分支,不会自动切换到新分支上</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch <new-branch-name> <commit></span><br></pre></td></tr></table></figure><p>使用<code>git checkout</code>创建新分支,并自动切换到这个分支上</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b <new-branch-name></span><br></pre></td></tr></table></figure><p>使用<code>git checkout</code>基于标签创建新分支,并自动切换到这个分支上</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b <new-branch-name> <tag-name></span><br></pre></td></tr></table></figure><p>使用<code>git checkout</code>基于标签创建新分支,没有指定<code><new-branch-name></code>,<code>HEAD</code>会进入到游离指针状态</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b <tag-name></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout v5</span><br><span class="line">Note: checking out <span class="string">'v5'</span>.</span><br><span class="line"></span><br><span class="line">You are <span class="keyword">in</span> <span class="string">'detached HEAD'</span> state. You can look around, make experimental</span><br><span class="line">changes and commit them, and you can discard any commits you make <span class="keyword">in</span> this</span><br><span class="line">state without impacting any branches by performing another checkout.</span><br><span class="line"></span><br><span class="line">If you want to create a new branch to retain commits you create, you may</span><br><span class="line"><span class="keyword">do</span> so (now or later) by using -b with the checkout <span class="built_in">command</span> again. Example:</span><br><span class="line"></span><br><span class="line"> git checkout -b <new-branch-name></span><br><span class="line"></span><br><span class="line">HEAD is now at 1c1e018... v5 commit</span><br></pre></td></tr></table></figure><p>退出游离指针状态</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git checkout <branch-name> <span class="comment">#切换到其它分支</span></span><br><span class="line">git checkout -b <new-branch-name> <span class="comment">#将游离指针状态,切换到创建的新分支上</span></span><br></pre></td></tr></table></figure><p>创建新分支来跟踪远程分支,并自动切换到这个分支上</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b <new-branch-name> <remote-name>/<remote-branch-name></span><br></pre></td></tr></table></figure><h2 id="重命名分支"><a href="#重命名分支" class="headerlink" title="重命名分支"></a>重命名分支</h2><p>如果<code><new-branch-name></code>已经存在,重命名动作停止</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -m <old-branch-name> <new-branch-name></span><br></pre></td></tr></table></figure><p>如果<code><new-branch-name></code>已经存在,重命名动作继续,请谨慎操作</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -M <old-branch-name> <new-branch-name></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">$ git branch -v</span><br><span class="line"> b1 1c1e018 v5 commit</span><br><span class="line"> b2 1c1e018 v5 commit</span><br><span class="line">* master 1c1e018 v5 commit</span><br><span class="line"></span><br><span class="line">$ git branch -m b2 b1</span><br><span class="line">fatal: A branch named <span class="string">'b1'</span> already exists.</span><br><span class="line"></span><br><span class="line">$ git branch -M b2 b1</span><br><span class="line"></span><br><span class="line">$ git branch -v</span><br><span class="line"> b1 1c1e018 v5 commit</span><br><span class="line">* master 1c1e018 v5 commit</span><br></pre></td></tr></table></figure><h2 id="删除分支"><a href="#删除分支" class="headerlink" title="删除分支"></a>删除分支</h2><p>如果分支上存在未被合并的提交,删除动作停止</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -d <branch-name></span><br></pre></td></tr></table></figure><p>如果分支上存在未被合并的提交,删除动作继续,请谨慎操作</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -D <branch-name></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">$ git branch -v</span><br><span class="line"> b1 2e6423e v6 commit on branch b1</span><br><span class="line">* master 1c1e018 v5 commit</span><br><span class="line"></span><br><span class="line">$ git branch -d b1 <span class="comment">#提示b1分支上存在没有被合并的提交</span></span><br><span class="line">error: The branch <span class="string">'b1'</span> is not fully merged.</span><br><span class="line">If you are sure you want to delete it, run <span class="string">'git branch -D b1'</span>.</span><br><span class="line"></span><br><span class="line">$ git branch -D b1</span><br><span class="line">Deleted branch b1 (was 2e6423e).</span><br><span class="line"></span><br><span class="line">$ git branch -v</span><br><span class="line">* master 1c1e018 v5 commit</span><br></pre></td></tr></table></figure><h2 id="查看已经合并到当前分支的分支"><a href="#查看已经合并到当前分支的分支" class="headerlink" title="查看已经合并到当前分支的分支"></a>查看已经合并到当前分支的分支</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch --merged</span><br></pre></td></tr></table></figure><h2 id="查看没有合并到当前分支的分支"><a href="#查看没有合并到当前分支的分支" class="headerlink" title="查看没有合并到当前分支的分支"></a>查看没有合并到当前分支的分支</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch --no-merged</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ git branch -v</span><br><span class="line"> b1 1c1e018 v5 commit</span><br><span class="line"> b2 82fa977 v6 commit</span><br><span class="line">* master 1c1e018 v5 commit</span><br><span class="line"></span><br><span class="line">$ git branch --merged</span><br><span class="line"> b1</span><br><span class="line">* master</span><br><span class="line"></span><br><span class="line">$ git branch --no-merged</span><br><span class="line"> b2</span><br></pre></td></tr></table></figure><hr><h1 id="git-merge"><a href="#git-merge" class="headerlink" title="git merge"></a>git merge</h1><p><br><b>有未提交修改情况下,不要执行merge!遵守这条警告,防患于未然</b></p><h2 id="基本操作-1"><a href="#基本操作-1" class="headerlink" title="基本操作"></a>基本操作</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge [<options>] [<commit>...]</span><br></pre></td></tr></table></figure><ol><li>默认合并成功后会自动提交,使用<code>--no-commit</code>选项,则合并后的内容会放入暂存区,需要手动提交</li><li><code><commit></code>可以是提交的<code>SHA-1</code>值、分支、标签等</li><li><code><commit></code>如果是多个提交,合并成功后,当前<code>HEAD</code>是第一个<code><commit></code>的父提交,第一个<code><commit></code>是第二个<code><commit></code>的父提交,依次类推</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">$ git hist b2 <span class="comment">#b2分支上有7个提交,领先master分支2个提交</span></span><br><span class="line">* ece4a12 v7 commit</span><br><span class="line">* 82fa977 v6 commit</span><br><span class="line">* 1c1e018 v5 commit</span><br><span class="line">* 45d9dfb v4 commit</span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ git hist master <span class="comment">#master分支上有5个提交</span></span><br><span class="line">* 1c1e018 v5 commit</span><br><span class="line">* 45d9dfb v4 commit</span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br><span class="line"></span><br><span class="line">$ git merge 82fa977 ece4a12 <span class="comment">#合并b2分支上的2个提交</span></span><br><span class="line">Updating 1c1e018..ece4a12</span><br><span class="line">Fast-forward</span><br><span class="line"> readme.md | 2 ++</span><br><span class="line"> 1 file changed, 2 insertions(+)</span><br><span class="line"></span><br><span class="line">$ git hist master</span><br><span class="line">* ece4a12 v7 commit</span><br><span class="line">* 82fa977 v6 commit</span><br><span class="line">* 1c1e018 v5 commit</span><br><span class="line">* 45d9dfb v4 commit</span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br></pre></td></tr></table></figure><h2 id="不要Fast-Foward合并,会生成merge提交信息"><a href="#不要Fast-Foward合并,会生成merge提交信息" class="headerlink" title="不要Fast-Foward合并,会生成merge提交信息"></a>不要<code>Fast-Foward</code>合并,会生成<code>merge</code>提交信息</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge [<commit>...] --no-ff</span><br></pre></td></tr></table></figure><p>不要<code>Fast-Foward</code>合并,手动生成<code>merge</code>提交信息</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge [<commit>...] --no-ff -m<span class="string">"<Message>"</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">$ git merge 82fa977 --no-ff</span><br><span class="line">Merge made by the <span class="string">'recursive'</span> strategy.</span><br><span class="line"> readme.md | 1 +</span><br><span class="line"> 1 file changed, 1 insertion(+)</span><br><span class="line"></span><br><span class="line">$ git hist</span><br><span class="line">* 2cc5c4c Merge commit <span class="string">'82fa977'</span></span><br><span class="line">|\</span><br><span class="line">| * 82fa977 v6 commit</span><br><span class="line">|/</span><br><span class="line">* 1c1e018 v5 commit</span><br><span class="line">* 45d9dfb v4 commit</span><br><span class="line">* adba38b v3 commit</span><br><span class="line">* c7ded78 v2 commit</span><br><span class="line">* 45496b8 v1 commit</span><br></pre></td></tr></table></figure><h2 id="将分支合并到当前分支"><a href="#将分支合并到当前分支" class="headerlink" title="将分支合并到当前分支"></a>将分支合并到当前分支</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge <branch></span><br></pre></td></tr></table></figure><h2 id="终止合并操作"><a href="#终止合并操作" class="headerlink" title="终止合并操作"></a>终止合并操作</h2><p>冲突时执行中止<code>merge</code>操作,<code>merge manual</code>中说,这条命令会尽力恢复到<code>Merge</code>之前的状态(可能失败!)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge --abort</span><br></pre></td></tr></table></figure><hr><h1 id="git-tag"><a href="#git-tag" class="headerlink" title="git tag"></a>git tag</h1><h2 id="创建轻量级标签"><a href="#创建轻量级标签" class="headerlink" title="创建轻量级标签"></a>创建轻量级标签</h2><p>轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag <new-tag-name></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git tag v1.0.0 <span class="comment">#创建一个标签</span></span><br></pre></td></tr></table></figure><h2 id="创建含附注标签"><a href="#创建含附注标签" class="headerlink" title="创建含附注标签"></a>创建含附注标签</h2><p>含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用<code>GNU Privacy Guard (GPG)</code>来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -a <new-tag-name> -m <span class="string">"<Message>"</span></span><br></pre></td></tr></table></figure><p>如果有自己的<code>GPG</code>私钥,还可以用<code>GPG</code>来签署标签,只需要把之前的<code>-a</code>改为<code>-s</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -s <new-tag-name> -m <span class="string">"<Message>"</span></span><br></pre></td></tr></table></figure><h2 id="GPG签署工作"><a href="#GPG签署工作" class="headerlink" title="GPG签署工作"></a><code>GPG</code>签署工作</h2><p>首先,在开始签名之前你需要先配置<code>GPG</code>并安装个人密钥。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ gpg --list-keys</span><br><span class="line">/Users/schacon/.gnupg/pubring.gpg</span><br><span class="line">---------------------------------</span><br><span class="line">pub 2048R/0A46826A 2014-06-04</span><br><span class="line">uid Scott Chacon (Git signing key) <schacon@gmail.com></span><br><span class="line">sub 2048R/874529A9 2014-06-04</span><br></pre></td></tr></table></figure><p>如果你还没有安装一个密钥,可以使用<code>gpg --gen-key</code>生成一个。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gpg --gen-key</span><br></pre></td></tr></table></figure><p>一旦你有一个可以签署的私钥,可以通过设置<code>Git</code>的<code>user.signingkey</code>选项来签署。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.signingkey 0A46826A</span><br></pre></td></tr></table></figure><p>如果已经设置好一个<code>GPG</code>私钥,可以使用它来签署新的标签。所有需要做的只是使用<code>-s</code>代替<code>-a</code>即可:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git tag -s v1.5 -m <span class="string">'my signed 1.5 tag'</span></span><br></pre></td></tr></table></figure><p>如果在那个标签上运行<code>git show</code>,会看到你的<code>GPG</code>签名附属在后面:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">$ git show v1.5</span><br><span class="line">tag v1.5</span><br><span class="line">Tagger: Ben Straub <ben@straub.cc></span><br><span class="line">Date: Sat May 3 20:29:41 2014 -0700</span><br><span class="line"></span><br><span class="line">my signed 1.5 tag</span><br><span class="line">-----BEGIN PGP SIGNATURE-----</span><br><span class="line">Version: GnuPG v1</span><br><span class="line"></span><br><span class="line">iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut</span><br><span class="line">LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b</span><br><span class="line">hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm</span><br><span class="line">ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp</span><br><span class="line">8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi</span><br><span class="line">RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=</span><br><span class="line">=EFTF</span><br><span class="line">-----END PGP SIGNATURE-----</span><br><span class="line"></span><br><span class="line">commit ca82a6dff817ec66f44342007202690a93763949</span><br><span class="line">Author: Scott Chacon <schacon@gee-mail.com></span><br><span class="line">Date: Mon Mar 17 21:52:11 2008 -0700</span><br><span class="line"></span><br><span class="line"> changed the version number</span><br></pre></td></tr></table></figure><p>要验证一个签署的标签,可以运行<code>git tag -v [tag-name]</code>。这个命令使用<code>GPG</code>来验证签名。为了验证能正常工作,签署者的公钥需要在你的钥匙链中。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">$ git tag -v v1.4.2.1</span><br><span class="line">object 883653babd8ee7ea23e6a5c392bb739348b1eb61</span><br><span class="line"><span class="built_in">type</span> commit</span><br><span class="line">tag v1.4.2.1</span><br><span class="line">tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700</span><br><span class="line"></span><br><span class="line">GIT 1.4.2.1</span><br><span class="line"></span><br><span class="line">Minor fixes since 1.4.2, including git-mv and git-http with alternates.</span><br><span class="line">gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A</span><br><span class="line">gpg: Good signature from <span class="string">"Junio C Hamano <junkio@cox.net>"</span></span><br><span class="line">gpg: aka <span class="string">"[jpeg image of size 1513]"</span></span><br><span class="line">Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A</span><br></pre></td></tr></table></figure><p>如果没有签署者的公钥,那么你将会得到类似下面的东西:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A</span><br><span class="line">gpg: Can<span class="string">'t check signature: public key not found</span></span><br><span class="line"><span class="string">error: could not verify the tag '</span>v1.4.2.1<span class="string">'</span></span><br></pre></td></tr></table></figure><p>在最新版本的<code>Git</code>中(<code>v1.7.9</code>及以上),也可以签署个人提交。 如果相对于标签而言你对直接签署到提交更感兴趣的话,所有要做的只是增加一个<code>-S</code>到<code>git commit</code>命令。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ git commit -a -S -m <span class="string">'signed commit'</span></span><br><span class="line"></span><br><span class="line">You need a passphrase to unlock the secret key <span class="keyword">for</span></span><br><span class="line">user: <span class="string">"Scott Chacon (Git signing key) <schacon@gmail.com>"</span></span><br><span class="line">2048-bit RSA key, ID 0A46826A, created 2014-06-04</span><br><span class="line"></span><br><span class="line">[master 5c3386c] signed commit</span><br><span class="line"> 4 files changed, 4 insertions(+), 24 deletions(-)</span><br><span class="line"> rewrite Rakefile (100%)</span><br><span class="line"> create mode 100644 lib/git.rb</span><br></pre></td></tr></table></figure><p><code>git log</code>也有一个<code>--show-signature</code>选项来查看及验证这些签名。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">log</span> --show-signature -1</span><br><span class="line">commit 5c3386cf54bba0a33a32da706aa52bc0155503c2</span><br><span class="line">gpg: Signature made Wed Jun 4 19:49:17 2014 PDT using RSA key ID 0A46826A</span><br><span class="line">gpg: Good signature from <span class="string">"Scott Chacon (Git signing key) <schacon@gmail.com>"</span></span><br><span class="line">Author: Scott Chacon <schacon@gmail.com></span><br><span class="line">Date: Wed Jun 4 19:49:17 2014 -0700</span><br><span class="line"></span><br><span class="line"> signed commit</span><br></pre></td></tr></table></figure><h2 id="查看所有的标签"><a href="#查看所有的标签" class="headerlink" title="查看所有的标签"></a>查看所有的标签</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git tag</span><br><span class="line">git tag -l</span><br><span class="line">git tag --list</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ git tag</span><br><span class="line">v1.0.0</span><br><span class="line">v2.0.0</span><br><span class="line"></span><br><span class="line">$ git tag -l</span><br><span class="line">v1.0.0</span><br><span class="line">v2.0.0</span><br><span class="line"></span><br><span class="line">$ git tag --list</span><br><span class="line">v1.0.0</span><br><span class="line">v2.0.0</span><br></pre></td></tr></table></figure><h2 id="标签匹配查询"><a href="#标签匹配查询" class="headerlink" title="标签匹配查询"></a>标签匹配查询</h2><p>使用<code>*</code>支持模糊匹配</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -l | --list <span class="string">"tag-name*"</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ git tag -l <span class="string">"*1*"</span></span><br><span class="line">v1.0.0</span><br></pre></td></tr></table></figure><h2 id="查看标签的信息"><a href="#查看标签的信息" class="headerlink" title="查看标签的信息"></a>查看标签的信息</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag show <tag-name></span><br></pre></td></tr></table></figure><h2 id="删除标签"><a href="#删除标签" class="headerlink" title="删除标签"></a>删除标签</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git tag -d <tag-name></span><br></pre></td></tr></table></figure><hr><h1 id="文件内容追溯"><a href="#文件内容追溯" class="headerlink" title="文件内容追溯"></a>文件内容追溯</h1><h2 id="追溯整个文件的内容"><a href="#追溯整个文件的内容" class="headerlink" title="追溯整个文件的内容"></a>追溯整个文件的内容</h2><p>会逐行显示文件,在每一行的行首显示此行最早是在什么版本引入的,由谁引入的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git blame <file></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ git blame readme.md</span><br><span class="line">^45496b8 (Jerry.Chen 2016-01-23 18:46:54 +0800 1) v1</span><br><span class="line">c7ded782 (Jerry.Chen 2016-01-23 18:47:08 +0800 2) v2</span><br><span class="line">adba38bc (Jerry.Chen 2016-01-23 18:47:35 +0800 3) v3</span><br><span class="line">45d9dfb1 (Jerry.Chen 2016-01-23 21:52:08 +0800 4) v4</span><br><span class="line">1c1e0188 (Jerry.Chen 2016-01-23 22:13:49 +0800 5) v5</span><br><span class="line">82fa9774 (Jerry.Chen 2016-01-23 23:37:39 +0800 6) v6</span><br></pre></td></tr></table></figure><h2 id="追溯指定的行号"><a href="#追溯指定的行号" class="headerlink" title="追溯指定的行号"></a>追溯指定的行号</h2><p><code>n</code>:起始行号;<code>m</code>:结束行号,如果未指定,则使用文件的最后一行的行号</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git blame -L <n[,m]> <file></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$ git blame readme.md -L 3</span><br><span class="line">adba38bc (Jerry.Chen 2016-01-23 18:47:35 +0800 3) v3</span><br><span class="line">45d9dfb1 (Jerry.Chen 2016-01-23 21:52:08 +0800 4) v4</span><br><span class="line">1c1e0188 (Jerry.Chen 2016-01-23 22:13:49 +0800 5) v5</span><br><span class="line">82fa9774 (Jerry.Chen 2016-01-23 23:37:39 +0800 6) v6</span><br><span class="line"></span><br><span class="line">$ git blame readme.md -L 3,4</span><br><span class="line">adba38bc (Jerry.Chen 2016-01-23 18:47:35 +0800 3) v3</span><br><span class="line">45d9dfb1 (Jerry.Chen 2016-01-23 21:52:08 +0800 4) v4</span><br></pre></td></tr></table></figure><hr><h1 id="git-ls-files"><a href="#git-ls-files" class="headerlink" title="git ls-files"></a>git ls-files</h1><h2 id="显示暂存区和版本库中的文件"><a href="#显示暂存区和版本库中的文件" class="headerlink" title="显示暂存区和版本库中的文件"></a>显示暂存区和版本库中的文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git ls-files</span><br></pre></td></tr></table></figure><h2 id="查看历史版本的文件列表"><a href="#查看历史版本的文件列表" class="headerlink" title="查看历史版本的文件列表"></a>查看历史版本的文件列表</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git ls-files --with-tree=HEAD^</span><br></pre></td></tr></table></figure><hr><h1 id="git-rm"><a href="#git-rm" class="headerlink" title="git rm"></a>git rm</h1><h2 id="工作区删除文件"><a href="#工作区删除文件" class="headerlink" title="工作区删除文件"></a>工作区删除文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rm <file></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$ git rm readme.md</span><br><span class="line">rm <span class="string">'readme.md'</span></span><br><span class="line"></span><br><span class="line">$ git status</span><br><span class="line">On branch master</span><br><span class="line">Changes to be committed:</span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> deleted: readme.md</span><br></pre></td></tr></table></figure><h2 id="暂存区删除文件"><a href="#暂存区删除文件" class="headerlink" title="暂存区删除文件"></a>暂存区删除文件</h2><p>从暂存区删除文件,工作区不会删除。删除的文件在工作区存在,状态变为未追踪</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git rm --cached <file></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">$ git rm --cached readme.md</span><br><span class="line">rm <span class="string">'readme.md'</span></span><br><span class="line"></span><br><span class="line">$ git status</span><br><span class="line">On branch master</span><br><span class="line">Changes to be committed: <span class="comment">#暂存区有待提交的删除内容</span></span><br><span class="line"> (use <span class="string">"git reset HEAD <file>..."</span> to unstage)</span><br><span class="line"></span><br><span class="line"> deleted: readme.md</span><br><span class="line"></span><br><span class="line">Untracked files: <span class="comment">#删除的文件在工作区存在,状态变为未追踪</span></span><br><span class="line"> (use <span class="string">"git add <file>..."</span> to include <span class="keyword">in</span> what will be committed)</span><br><span class="line"></span><br><span class="line"> readme.md</span><br></pre></td></tr></table></figure><hr><h1 id="git-clean"><a href="#git-clean" class="headerlink" title="git clean"></a>git clean</h1><h2 id="显示将要被删除的目录和文件"><a href="#显示将要被删除的目录和文件" class="headerlink" title="显示将要被删除的目录和文件"></a>显示将要被删除的目录和文件</h2><p>针对那些未被跟踪的文件和目录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clean -nd</span><br></pre></td></tr></table></figure><h2 id="删除掉未被跟踪的文件和目录"><a href="#删除掉未被跟踪的文件和目录" class="headerlink" title="删除掉未被跟踪的文件和目录"></a>删除掉未被跟踪的文件和目录</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clean -fd</span><br></pre></td></tr></table></figure><hr><h1 id="git-mv"><a href="#git-mv" class="headerlink" title="git mv"></a>git mv</h1><h2 id="移动或者重命名文件"><a href="#移动或者重命名文件" class="headerlink" title="移动或者重命名文件"></a>移动或者重命名文件</h2><p>如果移动或者重命名文件操作成功会添加到暂存区</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git mv [<options>] <<span class="built_in">source</span>>... <destination></span><br></pre></td></tr></table></figure><p><code>-n | --dry-run</code>:演练移动或者重命名文件,看看操作是否会成功</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git mv -n | --dry-run <<span class="built_in">source</span>>... <destination></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ git mv readme.md t1.md -n <span class="comment">#演练将readme.md重命名为t1.md</span></span><br><span class="line">Checking rename of <span class="string">'readme.md'</span> to <span class="string">'t1.md'</span></span><br><span class="line">Renaming readme.md to t1.md</span><br><span class="line"></span><br><span class="line">$ git status <span class="comment">#查看状态,没有修改的内容</span></span><br><span class="line">On branch master</span><br><span class="line">nothing to commit, working directory clean</span><br></pre></td></tr></table></figure><p><code>-f | --force</code>:强制移动或者重命名文件,不管目标是否已经存在</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git mv -f | --force <<span class="built_in">source</span>>... <destination></span><br></pre></td></tr></table></figure><hr><h1 id="git-log"><a href="#git-log" class="headerlink" title="git log"></a>git log</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> 显示提交历史信息</span><br><span class="line">git <span class="built_in">log</span> <branch> 显示分支提交历史信息</span><br><span class="line">git <span class="built_in">log</span> -(n) 仅显示最近的n条提交</span><br><span class="line">git <span class="built_in">log</span> <file> 显示该文件提交信息 </span><br><span class="line">git <span class="built_in">log</span> -p 显示每次提交的内容差异 </span><br><span class="line">git <span class="built_in">log</span> -p -2 仅显示最近的两次更新 </span><br><span class="line">git <span class="built_in">log</span> --<span class="built_in">stat</span> 显示简要的增改行数统计</span><br><span class="line">git <span class="built_in">log</span> --date-order --date=iso --graph --full-history --all --pretty=format:<span class="string">'%x08%x09%C(red)%h %C(cyan)%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 %C(bold blue)%aN%C(reset)%C(bold yellow)%d %C(reset)%s'</span></span><br><span class="line"> -p 按补丁格式显示每个更新之间的差异。</span><br><span class="line"> --<span class="built_in">stat</span> 显示每次更新的文件修改统计信息。</span><br><span class="line"> --shortstat 只显示--<span class="built_in">stat</span> 中最后的行数修改添加移除统计。</span><br><span class="line"> --name-only 仅在提交信息后显示已修改的文件清单。</span><br><span class="line"> --name-status 显示新增、修改、删除的文件清单。</span><br><span class="line"> --abbrev-commit 仅显示SHA-1 的前几个字符,而非所有的40 个字符。</span><br><span class="line"> --relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。</span><br><span class="line"> --graph 显示ASCII 图形表示的分支合并历史。</span><br><span class="line"> --pretty 使用其他格式显示历史提交信息。可用的选项包括oneline,short,full,fuller 和format(后跟指</span><br><span class="line">定格式)。</span><br><span class="line"> format选项说明</span><br><span class="line"> %H 提交对象(commit)的完整哈希字串</span><br><span class="line"> %h 提交对象的简短哈希字串</span><br><span class="line"> %T 树对象(tree)的完整哈希字串</span><br><span class="line"> %t 树对象的简短哈希字串</span><br><span class="line"> %P 父对象(parent)的完整哈希字串</span><br><span class="line"> %p 父对象的简短哈希字串</span><br><span class="line"> %an 作者(author)的名字</span><br><span class="line"> %ae 作者的电子邮件地址</span><br><span class="line"> %ad 作者修订日期(可以用-date= 选项定制格式)</span><br><span class="line"> %ar 作者修订日期,按多久以前的方式显示</span><br><span class="line"> %cn 提交者(committer)的名字</span><br><span class="line"> %ce 提交者的电子邮件地址</span><br><span class="line"> %<span class="built_in">cd</span> 提交日期</span><br><span class="line"> %cr 提交日期,按多久以前的方式显示</span><br><span class="line"> %s 提交说明</span><br><span class="line">git <span class="built_in">log</span> --pretty=<span class="string">"%h:%s"</span> --author=gitster --since=<span class="string">"2008-10-01"</span> --before=<span class="string">"2008-11-01"</span> --no-merges</span><br><span class="line">--since, --after 仅显示指定时间之后的提交。</span><br><span class="line">--until, --before 仅显示指定时间之前的提交。</span><br><span class="line">--author 仅显示指定作者相关的提交。</span><br><span class="line">--committer 仅显示指定提交者相关的提交。</span><br><span class="line">git <span class="built_in">log</span> --oneline --decorate 显示tag信息</span><br></pre></td></tr></table></figure><hr><h1 id="忽略文件"><a href="#忽略文件" class="headerlink" title="忽略文件"></a>忽略文件</h1><h2 id="工作区创建文件-gitignore"><a href="#工作区创建文件-gitignore" class="headerlink" title="工作区创建文件.gitignore"></a>工作区创建文件.gitignore</h2><p>工作区创建文件<code>.gitignore</code>,然后在里面添加忽略规则。<code>.gitignore</code>这个文件本身会提交到版本库中去,用来保存的是公共的需要排除的文件。<code>.gitignore</code>的语法规范如下:</p><ol><li>以<code>#</code>开头的行是注释</li><li>以<code>/</code>做为行尾字符,则要忽略的是目录</li><li>以<code>!</code>做为行首字符,则是取反模式</li><li>空白行不做处理</li><li>支持正则表达模式匹配<br><code>*</code> 匹配零个或多个任意字符<br><code>[abc]</code> 匹配任何一个在方括号中的字符<br><code>?</code> 匹配任意一个字符<br><code>[0-9a-zA-Z]</code> 在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如<code>[0-9a-zA-Z]</code>表示匹配所有<code>0</code>到<code>9</code>的数字和所有字母)<br><code>\</code> 转义字符<br><code>[ ^abc]</code> 匹配不是<code>a</code>, <code>b</code>, <code>c</code>中任一字符即可<br><code>{ab,bb,cx}</code> 匹配<code>ab</code>, <code>bb</code>, <code>cx</code>中任一类型即可</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">$ touch .gitignore</span><br><span class="line"></span><br><span class="line">$ ls -a</span><br><span class="line">./ ../ .git/ .gitignore readme.md</span><br><span class="line"></span><br><span class="line">$ vi .gitignore</span><br><span class="line"></span><br><span class="line">.a <span class="comment"># 忽略所有 .a 结尾的文件</span></span><br><span class="line">!lib.a <span class="comment"># 但 lib.a 除外</span></span><br><span class="line">/TODO <span class="comment"># 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO</span></span><br><span class="line">build/ <span class="comment"># 忽略 build/ 目录下的所有文件</span></span><br><span class="line">doc/*.txt <span class="comment"># 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt</span></span><br></pre></td></tr></table></figure><p><b>注意:</b><code>.gitignore</code>只能忽略那些没有被版本库追踪的文件,如果文件已经提交到了版本管理中,则在<code>.gitignore</code>中对这些文件的忽略是无效的,可以使用以下方式进行临时忽略</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git update-index --assume-unchanged /path/to/file <span class="comment">#忽略跟踪</span></span><br><span class="line">git update-index --no-assume-unchanged /path/to/file <span class="comment">#恢复跟踪</span></span><br></pre></td></tr></table></figure><p>但此方式在<code>git rebase</code>操作之后,这些被忽略的文件内容如果被修改过了,会被强制恢复到<code>git rebase</code>这个时候的版本内容。如果要从根本上忽略这些文件,请使用<code>git rm</code>删除掉这些文件,然后提交到版本库中</p><h2 id="编辑-git-info-exclude"><a href="#编辑-git-info-exclude" class="headerlink" title="编辑.git/info/exclude"></a>编辑.git/info/exclude</h2><p>独享忽略列表,不需要提交到版本库中,不会影响其他人</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ vi .git/info/exclude</span><br></pre></td></tr></table></figure><h2 id="用户目录下的全局-gitignore"><a href="#用户目录下的全局-gitignore" class="headerlink" title="用户目录下的全局.gitignore"></a>用户目录下的全局.gitignore</h2><p>在用户目录下创建<code>~/.gitignore</code>文件,以同样的规则来添加哪些文件是不需要版本控制的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.excludesfile ~/.gitignore <span class="comment">#需要执行此命令,才能是全局配置生效</span></span><br></pre></td></tr></table></figure><hr><h1 id="git-grep"><a href="#git-grep" class="headerlink" title="git grep"></a>git grep</h1><h2 id="操作语法"><a href="#操作语法" class="headerlink" title="操作语法"></a>操作语法</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git grep <span class="string">"工作区文件内容搜索"</span></span><br></pre></td></tr></table></figure><hr><h1 id="windows平台下的msysGit中shell环境配置"><a href="#windows平台下的msysGit中shell环境配置" class="headerlink" title="windows平台下的msysGit中shell环境配置"></a>windows平台下的msysGit中shell环境配置</h1><p><br>编辑配置文件<code>/etc/inputrc</code>,修改或者添加以下配置,重启后就能在<code>shell</code>界面输入中文</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># disable/enable 8bit input</span></span><br><span class="line"><span class="built_in">set</span> meta-flag on</span><br><span class="line"><span class="built_in">set</span> input-meta on</span><br><span class="line"><span class="built_in">set</span> output-meta on</span><br><span class="line"><span class="built_in">set</span> convert-meta off</span><br></pre></td></tr></table></figure><p><code>ls</code>命令显示中文,将<code>alias</code>命令添加到配置文件<code>/etc/profile</code>中</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> ls=<span class="string">'ls --show-control-chars --color=auto'</span></span><br><span class="line"><span class="built_in">alias</span> gitk=<span class="string">'gitk --all'</span> <span class="comment">#设置别名</span></span><br></pre></td></tr></table></figure><p>解决<code>gitk</code>和<code>Git Gui</code>乱码,在<code>/etc/gitconfig</code>中添加或修改以下配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[gui]</span><br><span class="line"> encoding = utf-8</span><br></pre></td></tr></table></figure><p>在<code>/etc/git-completion.bash</code>末尾位置添加<code>cd /d</code>,可以让<code>msysGit</code>打开定位到<code>D</code>盘</p><hr><h1 id="windows平台下的msysGit工具"><a href="#windows平台下的msysGit工具" class="headerlink" title="windows平台下的msysGit工具"></a>windows平台下的msysGit工具</h1><h2 id="gitk"><a href="#gitk" class="headerlink" title="gitk"></a>gitk</h2><p>显示所有的分支</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gitk --all</span><br></pre></td></tr></table></figure><p>显示某天以来的所有提交</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gitk --since=<span class="string">"[YYYY-MM-dd]|[2 days ago][2 weeks ago]..."</span></span><br></pre></td></tr></table></figure><h2 id="gui"><a href="#gui" class="headerlink" title="gui"></a>gui</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git gui</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>花了好几天的时间,才迁移完<a href="https://github.com/myoss/study/blob/master/git_notes.txt" target="_blank" rel="noopener">git学习笔记</a>,进行了重新整理,记录了常用操作。不知不觉<code>Git</code>已经用了2年的时间,虽然不久,但已经深深爱上了这个家伙~~~</p>
</summary>
<category term="git" scheme="https://blog.myoss.app/categories/git/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>IntelliJ Idea 快捷键映射</title>
<link href="https://blog.myoss.app/2016/IntelliJ-Idea-%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%98%A0%E5%B0%84/"/>
<id>https://blog.myoss.app/2016/IntelliJ-Idea-快捷键映射/</id>
<published>2016-01-19T08:18:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<p>迁移<a href="https://github.com/myoss/study/blob/master/idea_keymaps.md" target="_blank" rel="noopener">IntelliJ Idea快捷键说明</a>,此快捷键映射是在<code>IntelliJ Idea</code>的<code>default</code>快捷键的基础上进行了大量修改,部分快捷键兼容了<code>Eclipse</code>,修改的后的快捷键参考此<a href="https://github.com/myoss/IntelliJIdea-config/blob/idea15/keymaps/DefaultCopy.xml" target="_blank" rel="noopener">文件</a></p><h2 id="快捷键列表说明"><a href="#快捷键列表说明" class="headerlink" title="快捷键列表说明"></a>快捷键列表说明</h2><ul><li>Editing</li><li>Search/Replace</li><li>Usage Search</li><li>Compile and Run</li><li>Debugging</li><li>Navigation</li><li>Refactoring</li><li>Live Templates</li><li>General</li><li>Reference</li></ul><a id="more"></a><h2 id="Editing"><a href="#Editing" class="headerlink" title="Editing"></a>Editing</h2><ul><li><code>Ctrl + Space</code> <strong>替换为:</strong><code>Ctrl + ;</code><ul><li>Basic code completion (the name of any class, method or variable)</li><li>自动补全代码,可用于类、方法、变量</li></ul></li><li><code>Ctrl + Shift + Space</code> <strong>替换为:</strong><code>Ctrl + Shift + ;</code><ul><li>Smart code completion (filters the list of methods and variables by expected type)</li><li>自动补全代码,或者列举出相应方法和变量集合</li></ul></li><li><code>Ctrl + Shift + Enter</code><ul><li>Complete statement</li><li>补全当前行,如:在行末尾加;完成代码;if/else代码中加上{}完成代码块</li></ul></li><li><code>Ctrl + P</code><ul><li>Parameter info (within method call arguments)</li><li>显示方法的参数</li></ul></li><li><code>Ctrl + Q</code> <strong>替换为:</strong><code>Alt + Q</code><ul><li>Quick documentation lookup</li><li>显示注释文档</li></ul></li><li><code>Shift + F1</code><ul><li>External Doc</li><li>在浏览器中打开光标所在的类或者方法文档</li></ul></li><li><code>Ctrl + mouse over code</code><ul><li>Brief Info</li><li>显示类、方法、变量概要信息</li></ul></li><li><code>Ctrl + F1</code><ul><li>Show descriptions of error or warning at caret</li><li>显示错误或者警告信息</li></ul></li><li><code>Alt + Insert</code><ul><li>Generate code… (Getters, Setters, Constructors, hashCode/equals, toString)</li><li>生成代码,如:getter/setter/构造方法/…</li></ul></li><li><code>Ctrl + O</code><ul><li>Override methods</li><li>弹出窗口选择要Override/Implement的方法</li></ul></li><li><code>Ctrl + I</code><ul><li>Implement methods</li><li>弹出窗口选择要Implement的方法</li></ul></li><li><code>Ctrl + Alt + T</code><ul><li>Surround with… (if..else, try..catch, for, synchronized, etc.)</li><li>选择代码块,添加到if/try/for/…代码块中去</li></ul></li><li><code>Ctrl + /</code><ul><li>Comment/uncomment with line comment</li><li>注释/取消注释代码行://…</li></ul></li><li><code>Ctrl + Shift + /</code><ul><li>Comment/uncomment with block comment</li><li>注释/取消注释代码块:/<em>…</em>/</li></ul></li><li><code>Ctrl + W</code><ul><li>Select successively increasing code blocks</li><li>选择连续增加的代码块(连续操作)</li></ul></li><li><code>Ctrl + Shift + W</code><ul><li>Decrease current selection to previous state</li><li>Ctrl + W的相反操作,减少选择的代码块(连续操作)</li></ul></li><li><code>Alt + Q</code> <strong>替换为:</strong><code>Ctrl + Alt + Q</code><ul><li>Context info</li><li>显示上下文信息,如方法/类声明,光标和声明处必须不在同一屏幕处,否则不会提示</li></ul></li><li><code>Alt + Enter</code><ul><li>Show intention actions and quick-fixes</li><li>显示意图采取行动和快速修复错误,可以自动导入包</li></ul></li><li><code>Ctrl + Alt + L</code><ul><li>Reformat code</li><li>格式化代码</li></ul></li><li><code>Ctrl + Alt + O</code><ul><li>Optimize imports</li><li>优化导入的类和包</li></ul></li><li><code>Ctrl + Alt + I</code><ul><li>Auto-indent line(s)</li><li>自动缩进行</li></ul></li><li><code>Tab / Shift + Tab</code><ul><li>Indent/unindent selected lines</li><li>缩进/取消缩进行</li></ul></li><li><code>Ctrl + X or Shift + Delete</code><ul><li>Cut current line or selected block to clipboard</li><li>删除当前行或者选择的代码块,并复制到剪切板</li></ul></li><li><code>Ctrl + C or Ctrl + Insert</code><ul><li>Copy current line or selected block to clipboard</li><li>复制当前行或者选择的代码块,并复制到剪切板</li></ul></li><li><code>Ctrl + V or Shift + Insert</code><ul><li>Paste from clipboard</li><li>从剪切板粘帖</li></ul></li><li><code>Ctrl + Shift + V</code><ul><li>Paste from recent buffers…</li><li>弹出窗口列举出最近使用的剪贴板内容,选择性插入</li></ul></li><li><code>Ctrl + D</code> <strong>替换为:</strong><code>Alt + D</code><ul><li>Duplicate current line or selected block</li><li>复制当前行到下一行(未选择行时);复制选择的代码块到选择的末尾位置</li></ul></li><li><code>Ctrl + Alt + Up/Down</code><ul><li>Copy/Duplicate lines Ex</li><li>复制当前行或者选择的行到上一行或者下一行(使用<code>Eclipse Actions</code>插件实现<code>Eclipse</code>同样的复制效果)</li></ul></li><li><code>Ctrl + Y</code> <strong>添加:</strong><code>Ctrl + D</code><ul><li>Delete line at caret</li><li>删除当前行或者选择的行</li></ul></li><li><code>Ctrl + Shift + J</code><ul><li>Smart line join</li><li>合并选择的行为一行</li></ul></li><li><code>Ctrl + Enter</code><ul><li>Smart line split</li><li>拆分行</li></ul></li><li><code>Shift + Enter</code><ul><li>Start new line</li><li>向下插入新行</li></ul></li><li><code>Ctrl + Shift + U</code><ul><li>Toggle case for word at caret or selected block</li><li>大小写转换</li></ul></li><li><code>Ctrl + Shift + ] / [</code><ul><li>Select till code block end/start</li><li>从光标处选择代码块到结束处/开始处</li></ul></li><li><code>Ctrl + Delete</code><ul><li>Delete to word end</li><li>从光标处删除到单词末尾</li></ul></li><li><code>Ctrl + Backspace</code><ul><li>Delete to word start</li><li>从光标处删除到单词的开始</li></ul></li><li><code>Ctrl + NumPad+/-</code><ul><li>Expand/collapse code block</li><li>展开/折叠代码块</li></ul></li><li><code>Ctrl + Shift + NumPad+</code><ul><li>Expand all</li><li>展开所有的代码</li></ul></li><li><code>Ctrl + Shift + NumPad-</code><ul><li>Collapse all</li><li>折叠所有的代码</li></ul></li><li><code>Ctrl + F4</code><ul><li>Close active editor tab</li><li>关闭活动的编辑器选项卡</li></ul></li></ul><h2 id="Search-Replace"><a href="#Search-Replace" class="headerlink" title="Search/Replace"></a>Search/Replace</h2><ul><li><code>Double Shift</code><ul><li>Search everywhere</li><li>查找源代码中的任何条目,类似于Ctrl + Shift + N</li></ul></li><li><code>Ctrl + F</code> <strong>只保留:</strong><code>Ctrl + F</code><ul><li>Find</li><li>查找文本,支持多行查找/只在代码中查找/只在注释中查找/正则表达式</li></ul></li><li><code>F3</code> <strong>只保留:</strong><code>Ctrl + L</code><ul><li>Find next</li><li>查找下一个,<code>Ctrl + F/R</code>之后使用</li></ul></li><li><code>Shift + F3</code> <strong>只保留:</strong><code>Ctrl + Shift + L</code><ul><li>Find previous</li><li>查找上一个,<code>Ctrl + F/R</code>之后使用</li></ul></li><li><code>Ctrl + R</code><ul><li>Replace</li><li>查找替换文本,支持多行查找/只在代码中查找/只在注释中查找/正则表达式</li></ul></li><li><code>Ctrl + Shift + F</code><ul><li>Find in path</li><li>在指定路径/整个项目中查找文本,支持文件过滤</li></ul></li><li><code>Ctrl + Shift + R</code><ul><li>Replace in path</li><li>在指定路径/整个项目中查找替换文本,支持文件过滤</li></ul></li><li><code>Ctrl + Shift + S</code><ul><li>Search structurally (Ultimate Edition only)</li><li>搜索结构,使用模板方式查找</li></ul></li><li><code>Ctrl + Shift + M</code><ul><li>Replace structurally (Ultimate Edition only)</li><li>搜索替换结构,使用模板方式查找替换</li></ul></li></ul><h2 id="Usage-Search"><a href="#Usage-Search" class="headerlink" title="Usage Search"></a>Usage Search</h2><ul><li><code>Alt + F7 / Ctrl + F7</code><ul><li>Find usages / Find usages in file</li><li>查找类/方法/变量使用情况。<code>Ctrl + F7</code>只找当前文件</li></ul></li><li><code>Ctrl + Shift + F7</code><ul><li>Highlight usages in file</li><li>查找类/方法/变量使用情况,只找当前文件。类似于<code>Ctrl + F</code>效果</li></ul></li><li><code>Ctrl + Alt + F7</code><ul><li>Show usages</li><li>弹出列表窗口,显示出指定的类/方法被使用情况</li></ul></li></ul><h2 id="Compile-and-Run"><a href="#Compile-and-Run" class="headerlink" title="Compile and Run"></a>Compile and Run</h2><ul><li><code>Ctrl + F9</code><ul><li>Make project (compile modifed and dependent)</li><li>编译项目</li></ul></li><li><code>Ctrl + Shift + F9</code><ul><li>Compile selected file, package or module</li><li>编译选中的文件/包/模块</li></ul></li><li><code>Alt + Shift + F10</code><ul><li>Select configuration and run</li><li>选择指定配置/文件运行</li></ul></li><li><code>Alt + Shift + F9</code><ul><li>Select configuration and debug</li><li>选择指定配置/文件调试</li></ul></li><li><code>Shift + F10</code> <strong>替换为:</strong><code>Shift + F9</code><ul><li>Run</li><li>运行</li></ul></li><li><code>Shift + F9</code> <strong>替换为:</strong><code>F9</code><ul><li>Debug</li><li>调试</li></ul></li><li><code>Ctrl + Shift + F10</code><ul><li>Run context configuration from editor</li><li>从编辑器中的上下文配置运行,如:jUnit的test方法,ant中…</li></ul></li></ul><h2 id="Debugging"><a href="#Debugging" class="headerlink" title="Debugging"></a>Debugging</h2><ul><li><code>F8</code> <strong>替换为:</strong><code>F6</code><ul><li>Step over</li><li>逐行执行</li></ul></li><li><code>F7</code> <strong>替换为:</strong><code>F5</code><ul><li>Step into</li><li>进入方法内部</li></ul></li><li><code>Alt + Shift + F7</code><ul><li>Force step into</li><li>强制进入方法内部</li></ul></li><li><code>Shift + F7</code><ul><li>Smart step into</li><li>智能进入方法内部</li></ul></li><li><code>Shift + F8</code> <strong>替换为:</strong><code>F7</code><ul><li>Step out</li><li>跳出方法</li></ul></li><li><code>Alt + F9</code><ul><li>Run to cursor</li><li>运行到光标处所在的行</li></ul></li><li><code>Alt + F8</code><ul><li>Evaluate expression</li><li>弹出窗口,输入验证表达式</li></ul></li><li><code>F9</code> <strong>替换为:</strong><code>F8</code><ul><li>Resume program</li><li>跳到下一个断点,或者恢复运行(最后一个断点情况下)</li></ul></li><li><code>Ctrl + F8</code><ul><li>Toggle breakpoint</li><li>当前行添加/删除断点</li></ul></li><li><code>Ctrl + Shift + F8</code><ul><li>View breakpoints</li><li>查看所有断点信息</li></ul></li><li><code>Ctrl + Alt + R</code><ul><li>Reload Changed Classes</li><li>重新加载更改过代码的class(用于调试时,更改代码后不重启环境生效,不一定会起作用,如:涉及静态的)</li></ul></li></ul><h2 id="Navigation"><a href="#Navigation" class="headerlink" title="Navigation"></a>Navigation</h2><ul><li><code>Ctrl + N</code><ul><li>Go to class</li><li>查找类</li></ul></li><li><code>Ctrl + Shift + N</code><ul><li>Go to file</li><li>查找文件</li></ul></li><li><code>Ctrl + Alt + Shift + N</code><ul><li>Go to symbol</li><li>查找方法</li></ul></li><li><code>Alt + Right/Left</code> <strong>替换为:</strong><code>Ctrl + Alt + Left/Right</code><ul><li>Go to next/previous editor tab</li><li>切换到右边/左边的编辑窗口</li></ul></li><li><code>F12</code><ul><li>Go back to previous tool window</li><li>切换到最近使用的工具栏窗口</li></ul></li><li><code>Esc</code><ul><li>Go to editor (from tool window)</li><li>在工具栏窗口切换到编辑窗口</li></ul></li><li><code>Shift + Esc</code><ul><li>Hide active or last active window</li><li>隐藏当前(或最后活动的)工具窗口,并切换到编辑窗口</li></ul></li><li><code>Ctrl + Shift + F4</code><ul><li>Close active run/messages/find/… tab</li><li>关闭活动选项卡</li></ul></li><li><code>Ctrl + G</code><ul><li>Go to line</li><li>定位到指定行号</li></ul></li><li><code>Ctrl + E</code><ul><li>Recent files popup</li><li>弹出窗口列举出最近访问的文件</li></ul></li><li><code>Ctrl + Alt + Left/Right</code> <strong>替换为:</strong><code>Alt + Right/Left</code><ul><li>Navigate back/forward</li><li>导航向前/后退</li></ul></li><li><code>Ctrl + Shift + Backspace</code> <strong>替换为:</strong><code>Ctrl + Q</code><ul><li>Navigate to last edit location</li><li>导航到最近编辑的位置(可以连续操作)</li></ul></li><li><code>Alt + F1</code><ul><li>Select current file or symbol in any view</li><li>定位文件/方法的位置在指定的视图下,如:项目结构/包目录/方法集合/磁盘位置等</li></ul></li><li><code>Ctrl + B or Ctrl + Click</code><ul><li>Go to declaration</li><li>跳转到类/方法/变量定义处</li></ul></li><li><code>Ctrl + Alt + B</code> <strong>添加:</strong><code>Ctrl + T</code><ul><li>Go to implementation(s)</li><li>跳转到实现</li></ul></li><li><code>Ctrl + Shift + I</code><ul><li>Open quick definition lookup</li><li>显示光标处类/方法/变量的定义信息</li></ul></li><li><code>Ctrl + Shift + B</code> <strong>增加:</strong><code>F3</code><ul><li>Go to type declaration</li><li>跳转到类型的定义处</li></ul></li><li><code>Ctrl + U</code><ul><li>Go to super-method/super-class</li><li>跳转到父方法/父类</li></ul></li><li><code>Alt + Up/Down</code><ul><li>Go to previous/next method</li><li>跳转上一个/下一个方法</li></ul></li><li><code>Ctrl + ] / [</code><ul><li>Move to code block end/start</li><li>移动到代码块结束处/开始处,并高亮{}</li></ul></li><li><code>Ctrl + F12</code><ul><li>File structure popup</li><li>显示当前文件的结构,可以进行方法快速过滤定位</li></ul></li><li><code>Ctrl + H</code><ul><li>Type hierarchy</li><li>显示类结构图(类的继承层次)</li></ul></li><li><code>Ctrl + Shift + H</code><ul><li>Method hierarchy</li><li>显示方法结构图(方法的继承层次)</li></ul></li><li><code>Ctrl + Alt + H</code><ul><li>Call hierarchy</li><li>显示方法被调用结构图</li></ul></li><li><code>F2 / Shift + F2</code><ul><li>Next/previous highlighted error</li><li>定位到上一个/下一个错误或警告,并高亮</li></ul></li><li><code>F4 / Ctrl + Enter</code><ul><li>Edit source / View source</li><li>在视图窗口中选择文件/方法等,快速跳转到编辑窗口中</li></ul></li><li><code>Alt + Home</code><ul><li>Show navigation bar</li><li>光标定位到导航拦</li></ul></li><li><code>F11</code><ul><li>Toggle bookmark</li><li>添加/删除标签(当前行)</li></ul></li><li><code>Ctrl + F11</code><ul><li>Toggle bookmark with mnemonic</li><li>以指定数字或者字母做为添加书签;删除书签</li></ul></li><li><code>Ctrl + #[0-9]</code><ul><li>Go to numbered bookmark</li><li>跳转到指定标记的书签,配合<code>Ctrl + F11</code>使用</li></ul></li><li><code>Shift + F11</code><ul><li>Show bookmarks</li><li>显示所有的标签</li></ul></li></ul><h2 id="Refactoring"><a href="#Refactoring" class="headerlink" title="Refactoring"></a>Refactoring</h2><ul><li><code>F5</code> <strong>替换为:</strong><code>Shift + F10</code><ul><li>Copy</li><li>复制当前类或者文件</li></ul></li><li><code>F6</code> <strong>替换为:</strong><code>F10</code><ul><li>Move</li><li>移动类/方法/文件</li></ul></li><li><code>Alt + Delete</code><ul><li>Safe Delete</li><li>安全方式删除</li></ul></li><li><code>Shift + F6</code> <strong>替换为:</strong><code>Ctrl + Shift + R</code><ul><li>Rename</li><li>重命名方法/类/文件</li></ul></li><li><code>Ctrl + F6</code> <code>快捷键已取消</code><ul><li>Change Signature</li><li>更改签名</li></ul></li><li><code>Ctrl + Alt + N</code><ul><li>Inline</li><li>将方法/类重构为内联方法/匿名类</li></ul></li><li><code>Ctrl + Alt + M</code><ul><li>Extract Method</li><li>提取选中的代码块生成一个新的方法</li></ul></li><li><code>Ctrl + Alt + V</code><ul><li>Extract Variable</li><li>提取选中的代码块生成一个新的变量</li></ul></li><li><code>Ctrl + Alt + F</code><ul><li>Extract Field</li><li>提取选中的代码块生成一个新的属性</li></ul></li><li><code>Ctrl + Alt + C</code><ul><li>Extract Constant</li><li>提取选中的代码块生成一个新的常量</li></ul></li><li><code>Ctrl + Alt + P</code><ul><li>Extract Parameter</li><li>提取选中的代码块生成一个新的参数</li></ul></li></ul><h2 id="Live-Templates"><a href="#Live-Templates" class="headerlink" title="Live Templates"></a>Live Templates</h2><ul><li><code>Ctrl + Alt + J</code><ul><li>Surround with Live Template</li><li>选择代码块,添加到模板代码块中去</li></ul></li><li><code>Ctrl + J</code><ul><li>Insert Live Template</li><li>插入模板代码<ul><li>iter Iteration according to Java SDK 1.5 style</li><li>inst Check object type with instanceof and downcast it</li><li>itco Iterate elements of java.util.Collection</li><li>itit Iterate elements of java.util.Iterator</li><li>itli Iterate elements of java.util.List</li><li>psf public static final</li><li>thr throw new</li></ul></li></ul></li></ul><h2 id="General"><a href="#General" class="headerlink" title="General"></a>General</h2><ul><li><code>Alt + #[0-9]</code><ul><li>Open corresponding tool window</li><li>打开相应的工具窗口</li></ul></li><li><code>Ctrl + S</code><ul><li>Save all</li><li>保存所有的文件</li></ul></li><li><code>Ctrl + Alt + Y</code><ul><li>Synchronize</li><li>同步文件到磁盘</li></ul></li><li><code>Ctrl + Shift + F12</code><ul><li>Toggle maximizing editor</li><li>切换最大化编辑器</li></ul></li><li><code>Alt + Shift + F</code><ul><li>Add to Favorites</li><li>添加到收藏夹</li></ul></li><li><code>Alt + Shift + I</code><ul><li>Inspect current file with current profile</li><li>检查当前文件与当前的配置文件</li></ul></li><li><code>Ctrl + BackQuote (`)</code><ul><li>Quick switch current scheme</li><li>快速切换配置信息,如:皮肤/快捷键/格式化代码风格等</li></ul></li><li><code>Ctrl + Alt + S</code><ul><li>Open Settings dialog</li><li>打开设置对话框</li></ul></li><li><code>Ctrl + Alt + Shift + S</code><ul><li>Open Project Structure dialog</li><li>打开项目结构设置对话框</li></ul></li><li><code>Ctrl + Shift + A</code><ul><li>Find Action</li><li>查找菜单功能/快捷键设置/配置等信息</li></ul></li><li><code>Ctrl + Tab</code><ul><li>Switch between tabs and tool window</li><li>标签和工具窗口之间切换,选择完成之前需要先按住<code>Ctrl</code>键不放,<code>Up/Down/[0-9]/[a-z]</code>选择相应的编号</li></ul></li></ul><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><blockquote><p>Win Keymap <a href="http://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard.pdf" target="_blank" rel="noopener">Win Keymap</a></p></blockquote><blockquote><p>Mac OS Keymap <a href="http://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard_Mac.pdf" target="_blank" rel="noopener">Mac OS Keymap</a></p></blockquote>]]></content>
<summary type="html">
<p>迁移<a href="https://github.com/myoss/study/blob/master/idea_keymaps.md" target="_blank" rel="noopener">IntelliJ Idea快捷键说明</a>,此快捷键映射是在<code>IntelliJ Idea</code>的<code>default</code>快捷键的基础上进行了大量修改,部分快捷键兼容了<code>Eclipse</code>,修改的后的快捷键参考此<a href="https://github.com/myoss/IntelliJIdea-config/blob/idea15/keymaps/DefaultCopy.xml" target="_blank" rel="noopener">文件</a></p>
<h2 id="快捷键列表说明"><a href="#快捷键列表说明" class="headerlink" title="快捷键列表说明"></a>快捷键列表说明</h2><ul>
<li>Editing</li>
<li>Search/Replace</li>
<li>Usage Search</li>
<li>Compile and Run</li>
<li>Debugging</li>
<li>Navigation</li>
<li>Refactoring</li>
<li>Live Templates</li>
<li>General</li>
<li>Reference</li>
</ul>
</summary>
<category term="IntelliJ Idea" scheme="https://blog.myoss.app/categories/IntelliJ-Idea/"/>
<category term="开发配置" scheme="https://blog.myoss.app/tags/%E5%BC%80%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>windows系统通过git提供的命令行查找文件内容</title>
<link href="https://blog.myoss.app/2016/Windows-File-Contentet-Search/"/>
<id>https://blog.myoss.app/2016/Windows-File-Contentet-Search/</id>
<published>2016-01-19T07:38:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<h2 id="如果还未安装,请先下载Git客户端,安装方法请百度"><a href="#如果还未安装,请先下载Git客户端,安装方法请百度" class="headerlink" title="如果还未安装,请先下载Git客户端,安装方法请百度"></a>如果还未安装,请先下载<code>Git</code>客户端,安装方法请百度</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://git-scm.com/download</span><br></pre></td></tr></table></figure><h2 id="在需要查找文件的目录,右键点击Git-Bash-Here"><a href="#在需要查找文件的目录,右键点击Git-Bash-Here" class="headerlink" title="在需要查找文件的目录,右键点击Git Bash Here"></a>在需要查找文件的目录,右键点击<code>Git Bash Here</code></h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ find . -name "*.*" | xargs grep " 40px;"</span><br><span class="line">grep: .: Is a directory</span><br><span class="line">./css/_common/components/pagination.styl: margin: 120px 0 40px;</span><br><span class="line">./css/_common/components/post/post-expand.styl: padding-top: 40px;</span><br></pre></td></tr></table></figure><h2 id="如果是git管理的文件"><a href="#如果是git管理的文件" class="headerlink" title="如果是git管理的文件"></a>如果是<code>git</code>管理的文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git grep <span class="string">"工作区文件内容搜索"</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="如果还未安装,请先下载Git客户端,安装方法请百度"><a href="#如果还未安装,请先下载Git客户端,安装方法请百度" class="headerlink" title="如果还未安装,请先下载Git客户端,安装方法请百度"></a>如果还未安装,请先下载
</summary>
<category term="windows" scheme="https://blog.myoss.app/categories/windows/"/>
<category term="文件内容查找" scheme="https://blog.myoss.app/tags/%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E6%9F%A5%E6%89%BE/"/>
</entry>
<entry>
<title>Hello World</title>
<link href="https://blog.myoss.app/2016/hello-world/"/>
<id>https://blog.myoss.app/2016/hello-world/</id>
<published>2016-01-18T12:17:00.000Z</published>
<updated>2018-07-28T01:47:58.000Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><a id="more"></a><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>
<summary type="html">
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p>
</summary>
</entry>
</feed>