-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlearnningGit.txt
524 lines (334 loc) · 12.7 KB
/
learnningGit.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
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
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
git init
把当前目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
git add
把文件修改添加到暂存区
$ git add readme.txt
git rm
<filename>
删除文件
(本地文件会被删除)
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
git commit
把暂存区的所有内容提交到当前分支
-m "备注"
$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
git tag
查看所有标签
<标签名>
给最新提交的commit添加标签
-d <标签名>
删除标签
-a <标签名> -m "标签备注" <指定版本编码>
-s <标签名> -m "标签备注" <指定版本编码>
git show
<标签名>
查看对应标签的详细内容
git status
查看当前文件的修改状态
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
git diff
比较改动情况
(--标识前版本
++标识后版本)
查看工作区与暂存区的差别
HEAD -- <filename>
查看版本库里面最新版本和工作区的区别
$ git diff HEAD -- <filename>
--cached
查看暂存区与版本库的差别
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git log
显示从最近到最远的提交日志
从当前HEAD指针往下所有版本
--pretty=oneline
单行显示
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
--graph
可以看到分支合并图
--abbrev-commit
简化显示
不显示完整标识码
连用
git log --graph --pretty=oneline --abbrev-commit
git reflog
用来记录你的每一次更新:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
git reset
在版本之间进行回退与切换
把版本库的文件写回暂存区
--hard <版本号> //todo可能是直接更改本地文件
(HEAD^表示上一版本,HEAD^^表示上上一版本)
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
HEAD <filename>
把HEAD <filename>写回暂存区,撤销add,本地修改后的文本不改变
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git checkout
-- <filename>
把暂存区内容写回本地
本地文件改变
$ git checkout -- readme.txt
<分支名称>
切换到新分支
把HEAD指针指向分支的头部
-b <分支名称>
创建新分支,并且切换到新分支
$ git checkout -b dev
Switched to a new branch 'dev'
-b <分支名称> origin/<远程对应分支名称>
不改变本地内容,只确立对应关系
$ git checkout -b dev origin/dev
git branch
查看当前分支
$ git branch
* dev
master
(当前分支前面会标一个*号)
<分支名称>
创建新分支
$ git branch dev
-d <分支名称>
删除分支
$ git branch -d dev
-D <分支名称>
强行删除分支,即使未与主线合并
--set-upstream-to=origin/<远程分支名称> <分支名称>
设置对应远程仓库的分支
$ git branch --set-upstream-to=origin/master master
git push
把本地分支的最新修改推送至远程分支
需绑定
合并有冲突会提示
origin <远程分支名称>
把当前分支推送到指定远程分支
不需绑定
$ git push origin master
origin <标签名称>
推送标签
当标签对应的版本没有在远程,远程文件会发送过去
origin --tags
一次性推送全部尚未推送到远程的本地标签
origin :refs/tags/<标签名>
删除远程标签名
git pull
把远程内容拉回本地
origin <远程分支名称>
把指定远程分支最新文件拉到当前分支
不需绑定
$ git pull origin master
如有冲突,冲突内容会直接写入本地文件
像处理merge失败一样处理它
git clone
<地址>
远程克隆一个库
$ git clone git@github.com:michaelliao/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd gitskills
$ ls
README.md
git merge
<分支名称>
把指定分支与当前分支融合
备注会变成融合进来的分支的备注,并自动发布
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
失败后需要手动修改,然后再次commit,完成融合
--no-ff -m "备注" <分支名称>
【推荐】
使用普通融合,会保留分支信息
$ git merge --no-ff -m "merge with no-ff" dev
git stash
保存工作现场
可以进行其他工作
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
list
查看stash内容
pop
恢复现场并删除最上层stash内容
apply
恢复现场不删除最上层stash内容
apply 'stash@{ID}'
恢复指定stash
drop
删除最底层stash内容
drop 'stash@{ID}'
删除指定stash内容
git remote
查看远程仓库信息
$ git remote
origin
-v
显示更详细的信息
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^help^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help git init
创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd命令用于显示当前目录。在我的Mac上,这个仓库位于/Users/michael/learngit。
如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
第二步,通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
help git add
编写一个readme.txt文件,内容如下:
Git is a version control system.
Git is free software.
一定要放到learngit目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。
和把大象放到冰箱需要3步相比,把一个文件放到Git仓库只需要两步。
第一步,用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
help git commit
第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
help git status
修改readme.txt文件,改成如下内容:
Git is a distributed version control system.
Git is free software.
现在,运行git status命令看看结果:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
help git diff
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。
比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,
可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词。
help git log
显示从最近到最远的提交日志
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号),
和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
help git reflog
回到未来的时候可以看看版本号
用来记录你的每一次命令
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
help git reset
git reset --hard <16进制唯一版本标识代码>
代码不需要全写
HEAD为指向当前分支的指针,上移指针可以回到以前版本。
通过git reflog来跟踪所有更改。
help git checkout
(可以先git reset HEAD <filename>,从版本库中把文件写入暂存区,
再用git checkout -- <filename>来恢复误删文件
使用 -b 创建并切换到新分支
相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
help git branch
查看当前分支
当前分支前面会标一个*号
$ git branch
* dev
master
help git merge
合并的快进模式,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward
【推荐】使用--no-ff -m "备注" <分支名称>
这样在UI界面中,master线上就看不到dev线上的内容,这样更加整洁,
使用--graph也更为美观
help git stash
临时休息去吃个饭吧~
或者离开当前工作去其他时间线修复紧急bug
help git push
完工后push到github
早push早下班
push失败只能pull网络上的最新版来融合
help git pull
获取网络最新版的文件,
开工之前先pull一下吧~~~
help git tag
删除远程标签时,先本地删除
$ git tag -d v0.9
再远程删除
$ git push origin :refs/tags/v0.9