-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgitnote.txt
More file actions
356 lines (188 loc) · 16.7 KB
/
gitnote.txt
File metadata and controls
356 lines (188 loc) · 16.7 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
感谢廖雪峰前辈:https://www.liaoxuefeng.com
工作区和暂存区:
.git是版本库,文件夹是工作区
.git中包含:
stage(或者叫index)的暂存区,
还有Git为我们自动创建的第一个分支master,
以及指向master的一个指针叫HEAD
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
(git commit只负责把暂存区的修改提交了)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
版本回退:
显示提交历史:
git log
HEAD表示当前版本
上一个版本是HEAD^
上上一个版本就是HEAD^^
往上100个版本就是HEAD~100
--pretty=oneline
回退到上一个版本:
git reset --hard HEAD^
回到未来的指定版本:
git reset --hard 1a8cd8d(这一窜是commit的版本号id,这里取前7位)
如果找不到未来的commit id时:
git reflog
可以查看每一次历史命令的记录
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
管理修改:
时刻掌握仓库当前的状态(比如,不小心改了某个文件):
git status
具体查看改了该文件的哪里:
git diff readme.txt (后面是文件地址)
查看工作区和版本库里面最新版本的区别:
git diff HEAD -- readme.txt
每次修改,如果不add到暂存区,那就不会加入到commit中。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
撤销修改
丢弃工作区的修改:
git checkout -- file
(git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。)
(命令git checkout -- readme.txt 意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。)
(git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。)
把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset HEAD file
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
删除文件
git rm file
(命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。)
========================================================================================================================================================================
github设置:
添加远程库:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。
如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
ssh-keygen -t rsa -C "[email protected]"
第2步: 设置ssh公钥:
将.pub文件的内容复制后,设置github ssh密钥进行粘贴就可以了
第3步:创建github项目,然后将本地项目跟github项目关联起来:
git remote add origin [email protected]:michaelliao/learngit.git
(添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。)
第4步:把本地库的所有内容推送到远程库上:
git push -u origin master
(把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。)
(由于远程库是空的,我们第一次推送master分支时,加上了-u参数,
Git不但会把本地的master分支内容推送的远程新的master分支,
还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。)
第5步:推送成功,可以在github上面看到上传的文件了
第6步:从现在起,只要本地作了提交,就可以通过命令:
git push origin master 把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SSH警告
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
(指纹信息地址:https://help.github.com/articles/what-are-github-s-ssh-key-fingerprints/)
设置缓存密码时间:(对有密码的私钥无效)
git config credential.helper "cache –timeout=3600" (单位是秒)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
从远程库克隆:
1 首先,登陆GitHub,创建一个新的仓库,名字叫gitskills:
2 勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。
3 git clone [email protected]:michaelliao/gitskills.git
(Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
分支管理:
创建与合并分支:(创建dev分支)
git checkout -b dev
(checkout加上-b参数表示创建并切换,相当于以下2条命令:)
git branch dev (创建分支)
git checkout dev (切换分支)
查看当前分支:
git branch
合并指定分支到当前分支:
git merge dev
删除分支:
git branch -d dev
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决冲突:
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。(手动更改文件)
用git log --graph命令可以看到分支合并图。
(Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
分支管理策略:
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
(合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并, 而fast forward合并就看不出来曾经做过合并。)
禁用Fast forward模式:
git merge --no-ff -m "merge with no-ff" dev
(因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。)
合并后,我们用git log看看分支历史:
git log --graph --pretty=oneline --abbrev-commit
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bug分支:
每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
删除分支:
git branch -d <name>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Feature分支:
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
多人协作:
查看远程库的信息:
git remote 或者 git remote -v
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
推送分支:
git push origin master
并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
抓取分支:
你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
推送失败冲突:
先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
小结:
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
提示:
使用 git branch --set-upstream dev origin/dev 会报错:
一是 --set-upstream 现在 git 已经不推荐,需使用 --set-upstream-to (时间:2016.9.22);
二是 git branch --set-upstream dev origin/dev 中,添加 dev 这个分支有问题没有讲解清楚,如果当前工作区已经在 dev 这个分区时,不需要添加,直接执行 git branch --set-upstream-to origin/dev 即可,如果当前工作区不在 dev 下,则添加;不过 Git 官方文档中有句话 在切换分区时,尽量保持分支是干净的,个人觉得不推荐抓取非当前工作区下的文件;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
标签管理:
创建标签:
命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."可以指定标签信息;
git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;
命令git tag可以查看所有标签。
git show <tagname> 查看标签信息
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
操作标签: (比如tagname: v0.1)
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------