forked from WIZARD-CXY/gsu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
git-simple-usage.txt
406 lines (296 loc) · 11.4 KB
/
git-simple-usage.txt
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
#+LATEX_HEADER: \usepackage{xeCJK}
#+LATEX_HEADER: \setCJKmainfont{文泉驿微米黑}
* 什么是 Git?
Git 是一个分布式版本控制系统。
* 为什么要开发 Git?
Git 被开发出来是为了管理 Linux 内核的源代码,它的首要作者是 Linus Torvalds,此人
也是 Linux Kernel 的创始人。
* 如何深入学习 Git?
看 man page,阅读 Git 用户手册。可能你想看看这几个页面:
#+BEGIN_SRC SHELL
$ man git-tutorial
$ man git-tutorial-2
#+END_SRC
[1] [[http://www.git-scm.com/book][Pro Git]]
[2] [[http://git.oschina.net/progit/][Pro Git中文版]]
[3] [[http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/zh_cn/][Git Magic中文版]]
[4] [[https://www.kernel.org/pub/software/scm/git/docs/user-manual.html][Git用户手册]]
* Git 的一些基本概念
#+BEGIN_SRC TEXT
o 仓库(Repository)
o 暂存区(Index)
o 工作目录(Working directory)
仓库:存放源码变更的地方,通常是在工程目录下的“.git”目录
暂存区:Git 用来暂时存放变更的地方
工作目录:通常是在工程的根目录下(顶层目录)
#+END_SRC
* Git 的工作流程
Git 中所说的工作目录,是指工程的根目录。Git 会将要提交的文件先放到暂存区,你也可
以通过命令告诉 git 你要直接放到仓库中;然后,Git 会将暂存区中的内容放到仓库中。
当然这个过程需要你告诉 git 如何去做。
* Git 的配置
Git 的配置信息主要放在 ~/.gitconfig 和 .git/config。
#+BEGIN_SRC SHELL
$ git config --global ui.color true
$ git config --global alias.ci commit
#+END_SRC
#+BEGIN_SRC TEXT
[user]
name = username
email = [email protected]
[color]
ui = true
[alias]
ci = commit
co = checkout
st = status
[core]
editor = emacs -nw -Q
#+END_SRC
* Git 的简单用法
使用版本控制系统来对源码进行管理,通常是想对源码进行追踪,恢复到上一个良好的状
态,比较当前版本和以往版本的不同……
以下的说明中,出现的前缀符“$ ”表示在命令行下进行操作。
使用 Git 进行版本控制,通常可能遇到的问题是:
** 新建仓库
#+BEGIN_SRC SHELL
$ git init
#+END_SRC
** 追踪源码文件
#+BEGIN_SRC SHELL
$ git add
#+END_SRC
一个有用的技巧是,每次编辑修改代码的时候,可能只想 Git 追踪它之前追踪的文件,也
就是之前提交过的文件。可能这样做:
#+BEGIN_SRC SHELL
$ git add -u
#+END_SRC
** 加入仓库中
#+BEGIN_SRC SHELL
$ git commit
#+END_SRC
这时会 Git 会调用文本编辑器,以供你输入一些说明信息。Git 默认调用的是 Vim 编辑
器,你也可以配置 Git 以改变默认调用的编辑器。通过对以下这个 Git 变量进行设置:
#+BEGIN_SRC SHELL
$ git config --global core.editor emacs
$ git config --global core.editor nano
#+END_SRC
** 回退源码版本
可能你现在这个版本中遇到了麻烦,你想回退到上一个版本中:
#+BEGIN_SRC SHELL
$ git reset --hard HEAD~1
#+END_SRC
这样,会回退到上一个版本,如果你想回退 n 个版本:
#+BEGIN_SRC SHELL
$ git reset --hard HEAD~n
#+END_SRC
不过,这是一个危险的命令,因为它会摧毁你当前所做的所有修改。关于 git-reset(1) 的
详细用法,请查看 git-reset.txt。
** 比较修改的差异
#+BEGIN_SRC SHELL
$ git diff
$ git diff HEAD
$ git diff --cached
#+END_SRC
上面提到了“仓库”,“暂存区”和“工作目录”的概念。那么,“git diff”是比较工作
目录和暂存区的差异;“git diff HEAD”是比较工作目录和仓库的差异;“git diff
--cached”是比较暂存区和仓库的差异。
可能这是一个令人混淆的命令,现在说说这几个命令的用途。
想象这样一个场景:你修改了代码,这些代码已经由 Git 进行了追踪。由于修改了多处,你
甚至不记得你具体修改了哪个文件,这时你可能想看看你刚才都在忙了一些什么东西。没问
题,你可以这样:
#+BEGIN_SRC SHELL
$ git diff
#+END_SRC
之后,你告诉 Git,将这些内容放到暂存区:
#+BEGIN_SRC SHELL
$ git add -u
#+END_SRC
你又回去继续编码,完成了一些功能。你想知道现在的修改和之前仓库里的版本有什么不同:
#+BEGIN_SRC SHELL
$ git diff HEAD
#+END_SRC
有可能,你想知道现在所做的修改和暂存区里的不同:
#+BEGIN_SRC SHELL
$ git diff --cached
#+END_SRC
** 提交说明的建议写法
以总结性的一行开头,这一行不得超过 25 个字;随后空一行,然后填写需要说明的信息。
例如:
#+BEGIN_SRC TEXT
增加消息接收函数
这里填写为什么增加这个函数,为什么这个修改是必要的。说明这个函数的细节。
#+END_SRC
** 查看提交日志
#+BEGIN_SRC SHELL
$ git log # 查看日志
$ git log -p # 查看日志时包含补丁
$ git log --oneline # 只查看一行
#+END_SRC
** Git 的必杀技,分支特性
通常在进行编码的时候,你可能会有一些新的想法。但是,你又不想弄乱现在的代码;在以
前,你可能会复制一份完整的代码在其他地方,然后再安心地工作。Git 这样的版本控制系
统给了一个不错的解决方法:
#+BEGIN_SRC SHELL
$ git branch crazy-idea (1)
$ git checkout crazy-idea (2)
(1) 创建一个新的分支
(2) 切换到这个分支继续工作,这个分支完全不会影响你以前的工作!
#+END_SRC
噢哦,你竟然完成了那个不可能实现的工作,测试通过后,那么赶快合并到主分支吧:
#+BEGIN_SRC SHELL
$ git checkout master
$ git merge crazy-idea
#+END_SRC
可能这里你会遇到麻烦,就是……就是……就是……你会遇到冲突……通常的解决方法是,
采用某一个分支的,或者重写。
之前的分支没用了,可能你想删掉:
#+BEGIN_SRC SHELL
$ git branch -d crazy-idea
#+END_SRC
* 如何利用 Git 与他人合作开发?
如果需要使用 Git 和他人合作开发,那么最好需要有一个存放代码的机器。合作者把代码
推送到存放代码的机器上,同时在这个机器上拉取更新后的代码。
假设现在我们有一台机器在内部网络中,它的地址是 192.168.1.234。在这台机器上,存放
Git 仓库的目录是 /var/cache/git。
假设现在我们有两个开发者,他们的名字分别叫做 apple 和 banana。apple 的代码仓库存
放在远程机器的 /var/cache/git/apple 目录下,banana 的代码仓库存放在
/var/cache/git/banana 目录下。
现在,假设他们的代码仓库的名字叫做 code.git。那么在远程机器上,apple 和 banana
的目录下都有一个这样的目录:
/var/cache/git/apple/code.git
/var/cache/git/banana/code.git
** 建立远程代码仓库
#+BEGIN_SRC SHELL
$ ssh [email protected]
$ cd /var/cache/git/apple
$ git init --bare code.git
$ exit
#+END_SRC
** 推送代码到远程仓库中
我们以 apple 为例,他需要追踪 banana 的仓库,同时更新他自己的代码仓库。banana 的
代码仓库的地址是 192.168.1.234:/var/cache/git/banana/code.git,因为这个地址很长,
每次都输入那么多的话,会很繁琐,因此我们可以给这个仓库取一个别名。
#+BEGIN_SRC SHELL
$ git remote add banana [email protected]:/var/cache/git/banana/code.git
$ git remote add origin [email protected]:/var/cache/git/apple/code.git
$ git push -u origin master
#+END_SRC
** 从远程仓库中拉取代码
#+BEGIN_SRC SHELL
$ git fetch banana
#+END_SRC
** 合并远程仓库的代码
#+BEGIN_SRC SHELL
$ git merge banana/master
#+END_SRC
* 模拟实际的工作过程
** 主要介绍如下的命令的使用:
#+BEGIN_SRC SHELL
o init
o status
o add
o diff
o commit
o log
o branch
o checkout
o grep
o tag
o remote
o fetch
o push
o merge
#+END_SRC
下面的操作假定是在自己的本机中进行操作。
#+BEGIN_SRC TEXT
使用 Git 常见的操作流程如下:
-<<--解决错误-
v ^
编写代码 ==> 加入暂存区 ==> 提交到仓库
^ v
`-----<<-------<<---/
#+END_SRC
** 常见操作
现在,从新建一个代码仓库开始。
#+BEGIN_SRC SHELL
user1> mkdir hello
user1> cd hello
user1> git init
user1> echo 'main(){printf("hello");}' > main.c
user1> git status # 在这里介绍 color.ui
user1> git add main.c
user1> git commit -m "init" # 在这里介绍 core.editor 的设置,同时介绍 --amend
#+END_SRC
#+BEGIN_SRC SHELL
# user1 在推送之后,继续工作,增加新的功能
user1> git branch feature-1 master
user1> # 编辑 main.c 文件
user1> git add -u
user1> git commit -m "2nd commit"
user1> # 继续编辑 main.c 文件,在这里暂存区是已修改的状态
#+END_SRC
从这里开始在远程建立一个裸仓库,同时将代码推送上去:
#+BEGIN_SRC SHELL
user1> ssh username@machine 'git init --bare ~/hello.git'
# 这里介绍 remote 子命令的用法:set-url rename remove
user1> git remote add origin user1@machine:/work/projects/hello.git
user1> git push -u origin master
#+END_SRC
现在另外一个人,把代码拉取下来,然后增加一个新的功能:
#+BEGIN_SRC SHELL
user2> git clone user2@machine:/work/projects/hello.git
user2> cd hello
user2> git branch new_branch master
user2> git checkout new_branch # 这里介绍配置简写
user2> # 编辑 main.c,加入新的功能
user2> git add -u # 在这里介绍 ./-p
user2> git commit
user2> git push origin new_branch
#+END_SRC
user1 拉取仓库的内容,在这里介绍 rebase log stash 操作:
#+BEGIN_SRC SHELL
user1> git fetch origin
user1> git branch -r # 查看远程分支
user1> git log --oneline --left-right feature-1...origin/new_branch
user1> git stash save "stage 1"
user1> git rebase origin/new_branch # 在这里介绍如何解决冲突
user1> git stash apply # 介绍 list 等操作
user1> # 继续编辑 main.c
user1> git add -u
user1> git commit -m "third commit"
user1> git push . HEAD:master
user1> git push origin master
user1> git checkout master
user1> git branch -d feature-1
#+END_SRC
#+BEGIN_SRC SHELL
user2> git fetch origin
user2> git checkout master
user2> git branch -d new_branch
user2> git push origin :new_branch # 介绍如何删除远程分支
user2> git tag v1.0 # 介绍如何打标签
#+END_SRC
#+BEGIN_SRC SHELL
user1> git checkout -b feature-2 master
user1> # 编辑 main.c
user1> git add -u
user1> # 继续编辑 main.c
user1> git diff # 在这里介绍 diff
user1> git grep main # 在这里介绍 grep
user1> git reset HEAD # 在这里介绍 reset
#+END_SRC
git log 的话使用一个现成的仓库介绍,比如 Git 本身的仓库。
* 为什么你有时写“Git”,而有时又写“git”?
在大写的时候,我通常是想说版本控制系统;而在小写时侯,我通常是指某个命令。
* 如何获得这份文档的最新版本?
这份文档是 gsu 这个仓库的一部分,托管在 Github 上面:
https://github.com/mofaph/gsu
这份文档是通过 Emacs 的 Org-mode 导出为 html 的。所以,如果你需要导出为 html 的
话,可以使用 Emacs 打开这个文档,输入以下的命令:
#+BEGIN_SRC ELISP
;; M-x 表示同时按下 Alt 和 x 键
M-x org-export-as-html
#+END_SRC
如果你没有 Emacs,那么只是看这份文档的纯文本也不会有什么问题。导出的文件只是读起
来更舒服一点。