-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgit
786 lines (735 loc) · 30.8 KB
/
git
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
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
--------------
git快捷入手(核心)
一、安装对应操作系统git
一、下载
官网下载
二、升级
$ git clone git://git.kernel.org/pub/scm/git/git.git
二、设置用户名和email
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
三、本地仓库与github仓库的关联
一、使电脑和github建立传输协议
一、https
https每次都要输入账户、密码,不方便。
二、ssh(对电脑)
本地电脑运行
$ ssh-keygen -t ed25519 -C "[email protected]"
C:\Users\Administrator\.ssh上会生成id_rsa私钥和id_rsa.pub公钥文件
把id_rsa.pub公钥复制入github-settings-ssh and gpg keys里
三、gpg(对人的)
四、建立本地git仓库
一、直接在本地先建git仓库
一、在github上创建一个不Initialize初始化的仓库
二、在本地创建项目文件夹
$ mkdir myProject
$ cd myProject
($ pwd用于显示当前目录,尽量防止出现中文)
三、git init初始化,编写.gitignore文件,win创建时.gitignore.,并创建README.md文件(README.md文件里必须要有内容)
四、添加提交文件到本地
$ git add .&& git commit -m'd'
五、设置和修改远端库
$ git remote add origin [email protected]:qianxiaoning/a.git
$ git remote set-url origin [email protected]:qianxiaoning/a.git
六、推master分支到远端
$ git push -u origin master
二、从github上拉取仓库
一、github上新建仓库并Initialize初始化
二、在github上该仓库新建.gitignore文件
三、在计算机对应目录
$ git clone [email protected]:name/myProject.git
------------------------
如果是gitlab
管理员:
一、在公司服务器内网建立一个gitlab账号,帮组员注册账号、密码、邮箱随便写
二、添加组员ssh公钥入公司gitlab账号,分配组员权限。
组员:
一、获得gitlab账号,密码。$ ssh-keygen -t rsa -C "qianxiaoning"获得id_rsa.pub添加入gitlab组织ssh keys中
二、配置git工具的用户名和邮箱等配置文件?
三、$ git clone [email protected]:qianxiaoning/qxnTest.git
------------------------
五、建立远端和本地的需要分支
一、$ git clone后即获得本地master分支
二、本地dev分支
一、远端没有dev分支时,在本地建dev,推到远端
$ git checkout master
建立切换到dev分支
$ git checkout -b dev
推dev分支到远端
$ git push -u origin dev
二、远端有dev分支时,从远端拉
(如是远端新增的分支则$ git fetch刷新一下,才能看到远端新增的分支)
从远端拉dev到本地
$ git checkout -b dev origin/dev
建立本地dev和远程dev的关联,方便以后pull
新语法:
git branch --track dev origin/dev
git branch --set-upstream-to=origin/dev dev
git branch -u origin/dev dev
三、至此远端和本地都有master和dev了
六、工作需求(重点)
一、维护原先功能
大纲:登dev,拉dev,改dev,推dev。测试完后,登master,拉master,于master合并dev,推master,打master标签推master标签
1、登dev
$ git checkout dev
2、拉dev
$ git pull
解决冲突(重点,需要界面操作):
一、git pull后手动合并
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======分隔
Creating a new branch is quick AND simple.
>>>>>>> feature1
二、git mergetool(推荐)
git支持的mergetool:opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge
araxis bc codecompare emerge vimdiff
如vimdiff教程:
一、将vimdiff用作默认合并工具:
git config --global merge.tool vimdiff
git config --global mergetool.prompt false
或
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
二、配置mergetool文件,不生成.orig冲突备份文件
git config --global mergetool.keepBackup false
三、运行
git pull 冲突后
git mergetool-回车
进入多窗口模式
上面三个分别是lo:local/ba:base/re:remote
下面是merge窗口
红框是冲突区,光标留在merge区红框,选择运行:diffget lo/ba/re
[c和]c是上下冲突区切换,千万不能多按,容易切到select模式
merge区合并完成,:wqa全部保存退出
git commit -m'd'提交就行,不用git add了
git push
三、git gui软件
常见的git gui软件:
GitHub for Desktop,Source Tree(还适用于mac),TortoiseGit,git gui,git,git Extensions,SmartGit,Tower,Fork,Gitkraken,P4Merge,
Git-cola,Giggle,Gitg,Qgit,GitForce,Egit,GitEye,
ide的自带工具(Xcode苹果的,Visual Studio,webstorm)
3、改dev
4、把改动提交到本地
$ git add .&& git commit -m 'init'
5、推dev
$ git pull/冲突合并/$ git push
6、测试完后登master
$ git checkout master
7、拉master
$ git pull
8、于master合并dev
$ git merge dev
9、冲突解决
10、推master
$ git push
11、打master标签推master标签
$ git tag v1.0
$ git push origin v1.0
二、制作新功能
大纲:在dev上新建newTip分支,改newTip,推newTip。测试完后,登master,拉master,于master合并newTip,推master,
打master标签推master标签,删除newTip分支
1、在dev上新建newTip分支
$ git checkout dev
$ git checkout -b newTip
2、改newTip
3、推newTip至本地
$ git add .&&git commit -m 'd'
4、推newTip(第一次推送远端加-u)
$ git push -u origin newTip
5、测试完后登master
$ git checkout master
6、拉master
$ git pull
7、于master合并newTip
$ git merge newTip
8、冲突解决
9、推master
$ git push
10、打master标签推master标签
$ git tag v1.0
$ git push origin v1.0
11、删除新功能分支
$ git branch -d newTip
七、工作结束
-------------------------------------------------------------
廖雪峰git操作总结
查看状态$ git status
查看未add的修改$ git diff
查看已add的修改$ git diff --staged
历史记录$ git log
版本回退
恢复
$ git reset --hard 3628164,$ git reset --hard [commit id]
$ git reflog查看命令历史获取commit-id,找到后按q推出,恢复到旧版本$ git reset --hard 3628164。如果返回不明确失败就去官网找到对应码全称
add前
git checkout -- readme.txt可以丢弃工作区的修改
add后,又改动
git checkout -- readme.txt可以回到刚add完的状态
$ git checkout -- readme.txt让这个文件回到最近一次git commit或git add时的状态,比如工作区删错了从版本库恢复
$ git reset HEAD readme.txt可以把add区的修改回退到工作区
commit后回退$ git reset --hard HEAD^上个版本HEAD^,上上个版本HEAD^^,往上100个版本HEAD~100
push后
个人分支用git reset --hard HEAD^
公共分支用$ git revert --hard HEAD^,都是版本回退,
reset是直接撤回原来状态,revert是复制原来状态一份到最新状态,保留原来记录。
删除文件
$ git rm test.txt
$ git commit -m "remove test.txt"
删除分支
$ git branch -d dev
强制删除分支
$ git branch -D dev
查看远程库
$ git remote
$ git remote -v
设置与修改远程库
$ git remote add origin [email protected]:michaelliao/learngit.git
$ git remote set-url origin [email protected]:qianxiaoning/test3.git
删除远程库
git remote rm origin
远程库为空时,第一次推送
$ git push -u origin master
以后
$ git push origin master
$ git push origin <name>
本地没有时,拉远程分支
$ git fetch
$ git checkout -b dev origin/dev
拉取
$ git pull
$ git pull origin <name>
pull之前建立本地分支和远程分支的关联
git branch --set-upstream-to=origin/dev dev
$ git branch --track dev origin/dev
创建并切换分支
创建$ git branch dev
创建并切换$ git checkout -b dev
查看当前本地分支$ git branch
查看当前本地和远端分支$ git branch -a
远端新增分支,需要本地$ git fetch刷新一下,才能看到远端新增分支
分支合并
$ git checkout master
$ git merge dev
合并冲突
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======分隔
Creating a new branch is quick AND simple.
>>>>>>> feature1
手动解决
git log --graph分支合并图
gui解决
fast forward快速合并
$ git merge --no-ff -m "merge with no-ff" dev手动合并
代码储藏
$ git stash
$ git stash list储藏列表
$ git stash pop恢复并删除备份
标签
打标签
$ git tag v1.0
$ git tag v0.9 6224937
$ git tag v0.9 <commit id>
查看所有标签
$ git tag
查看具体标签
$ git show v0.9
带有说明的标签-a标签名
$ git tag -a v0.1 -m "version 0.1 released" 3628164
删除标签
$ git tag -d v0.1
删除远程分支
$ git push origin :hotfix
删除远程标签
$ git push origin :refs/tags/v0.9
推送标签
$ git push origin v1.0
推送所有标签
$ git push origin --tags
自定义配置别名
st表示status
$ git config --global alias.st status
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
---------------------------------
git基本操作(手册)
使用 Git 来获取 Git 的升级
$ git clone git://git.kernel.org/pub/scm/git/git.git
设置你的用户名称与邮件地址
$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]
配置默认文本编辑器 如 Emacs
$ git config --global core.editor emacs
检查配置信息
$ git config --list 命令来列出所有 Git 当时能找到的配置
获取帮助 打开本地git帮助文档
如,要想获得 config 命令的手册
三种:
$ git help config
$ git config --help
$ man git-config(未成功)
取得 Git 项目仓库
一、第一种是在本地现有项目或目录下导入所有文件到 Git 并传入github远端仓库。
先在git上建立远程仓库,注意不选Initialize this repository选项
在本地计算机上运行$ ssh-keygen -t rsa -C "qianxiaoning"
在C:\Users\Administrator\.ssh上会生成id_rsa私钥和id_rsa.pub公钥文件
把id_rsa.pub公钥文件放入github-settings-ssh and gpg keys-添加新的标题和key就行了。另(ssh是对电脑的,gpg是对人的。)
在本地项目设置远端的仓库地址 $ git remote add origin [email protected]:qianxiaoning/test3.git
修改$ git remote set-url origin [email protected]:qianxiaoning/test3.git
推到远端$ git push -u origin master
二、第二种是从git服务器克隆一个现有的 Git 仓库到本地。
$ git clone https://github.com/libgit2/libgit2
自定义本地仓库的名字
$ git clone https://github.com/libgit2/libgit2 myName
推到远端$ git push
$ git init
跟踪文件
通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交
git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件
$ git add .//添加所有文件
$ git add *.c
$ git add LICENSE
添加备注
$ git commit -m 'initial project version'
$ git add添加内容到下一次提交中,新建的文件,或者修改的文件
$ git commit提交到本地暂存。
检查当前文件状态
$ git status
git status -s 命令或 git status --short 命令
$ git status -s
M README M 有两个可以出现的位置 出现在右边的 M 表示该文件被修改了但是还没放入暂存区
MM Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。
M lib/simplegit.rb 出现在靠左边的 M 表示该文件被修改了并放入了暂存区
A lib/git.rb 新添加到暂存区中的文件
?? LICENSE.txt 新添加的未跟踪文件
创建一个名为 .gitignore 的文件,列出要忽略的文件模式
$ cat .gitignore
*.[oa] 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的
*~ 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本
.gitignore用glob 模式
星号(*)匹配零个或多个任意字符;
[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
问号(?)只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
使用两个星号(*) 表示匹配任意中间目录,比如`a/**/z` 可以匹配 a/z, a/b/z 或 `a/b/c/z`等。
查看具体修改了什么地方
$ git diff
查看已暂存的将要添加到下次提交里的内容
git diff --staged
提交更新 至本地暂存
$ git commit
编辑完,按esc,英文:,wq保存并退出
git add类似添加按钮,git commit类似提交按钮
$ git commit -m 直接添加备注,不打开vim编辑器
$ git commit -m "Story 182: Fix benchmarks for speed"
跳过使用暂存区域
$ git commit -a
会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
移除文件
从 Git 中移除某个文件,从暂存区域移除
$ rm p 物理删除
$ git rm p移除
如果删除之前修改过并且已经放到暂存区域
必须$ git rm -f p 强制删除
从暂存区移除入放弃跟踪(物理保留)
$ git rm --cached p
移动文件(即重命名)
$ git mv a aa 相当于
$ mv README.md README 物理改名
$ git rm README.md 从暂存区删除
$ git add README 添加入暂存区
查看提交历史
$ git log
提交的内容差异 最近两次
$ git log -p -2
等等
撤消操作
重新提交
$ git commit --amend
忘记了暂存某些需要的修改
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
取消暂存的文件
$ git reset HEAD CONTRIBUTING.md
撤消对文件的修改
$ git checkout -- CONTRIBUTING.md
远程仓库
$ git remote //origin - 这是 Git 给你克隆的仓库服务器的默认名字
显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
$ git remote -v
添加远程仓库
git remote add <shortname> <url>
$ git remote add pb https://github.com/paulboone/ticgit
从远程仓库中抓取与拉取
$ git fetch [remote-name]
执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
推送到远程仓库
git push [remote-name] [branch-name]
$ git push origin master
查看远程仓库
git remote show [remote-name]
远程仓库的重命名
$ git remote rename pb paul
远程仓库的移除
$ git remote rm paul
打标签
列出标签
$ git tag
创建标签
附注标签
$ git tag -a v1.4
-m添加备注
$ git tag -a v1.4 -m 'my version 1.4'
git show 命令可以看到标签信息与对应的提交信息
$ git show v1.4
轻量标签
$ git tag v1.4-lw
$ git show v1.4-lw
共享标签 到远端
git push origin [tagname]
或$ git push origin --tags推所有标签
检出标签
git checkout -b [branchname] [tagname]
$ git checkout -b version2 v2.0.0
Git 别名
$ git config --global alias.ci commit
当要输入 git commit 时,只需要输入 git ci
想要执行外部命令,而不是一个 Git 子命令。 如果是那样的话,可以在命令前面加入 ! 符号。
$ git config --global alias.visual '!gitk'
分支创建
$ git branch dev
查看各个分支当前所指的对象
$ git log --oneline --decorate
分支切换
$ git checkout dev
分支的新建与合并
新建一个分支并同时切换到那个分支上
$ git checkout -b iss53
$ git branch iss53
$ git checkout iss53
切换到dev分支
$ git checkout dev
将hotfix分支合并回你的 dev 分支(不影响hotfix分支,只改变dev分支)
$ git merge hotfix
删除分支
$ git branch -d hotfix
强制删除分支
$ git branch -D hotfix
遇到冲突时的分支合并
$ git merge dev
Auto-merging b
CONFLICT (content): Merge conflict in b
Automatic merge failed; fix conflicts and then commit the result.
使用 git status 命令来查看冲突未合并(unmerged)状态的文件
Unmerged paths://未合并文件路径
(use "git add <file>..." to mark resolution)
both modified: b//相同的修改,位于b文件
//下面是b文件
bbb
<<<<<<< HEAD //head为当前分支
aa
ee
======= //冲突间隔
qq
ee
>>>>>>> dev //dev分支
手动编辑合并
使用图形化工具来解决冲突
$ git mergetool比如vimdiff
分支管理
得到当前所有分支的一个列表
$ git branch
查看每一个分支的最后一次提交
$ git branch -v
获得远程引用的完整列表
git ls-remote (remote)//origin
16ed15f3b69b30cb5eef76e8a212824ece8e41e1 HEAD
16ed15f3b69b30cb5eef76e8a212824ece8e41e1 refs/heads/master
获得远程分支的更多信息
git remote show (remote)
* remote origin
Fetch URL: [email protected]:qianxiaoning/testProject.git
Push URL: [email protected]:qianxiaoning/testProject.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
推送
git push (remote) (branch)
$ git push origin serverfix
如果你正在使用 HTTPS URL 来推送
不想在每一次推送时都输入用户名与密码,可以设置一个 “credential cache”。
最简单的方式就是将其保存在内存中几分钟,可以简单地运行 git config --global credential.helper cache 来设置它。
想要修改正在跟踪的上游分支
使用 -u 或 --set-upstream-to 选项运行 git branch 来显式地设置
$ git branch -u origin/serverfix
查看设置的所有跟踪分支
$ git branch -vv
拉取
git pull
删除远程分支
$ git push origin --delete serverfix
变基
rebase
将提交到某一分支上的所有修改都移至另一分支上
$ git rebase master
变基等
用变基解决变基
服务器上的 Git - 协议
等等
-------------------------------------------------------------
指令
创建文件
在'其它'文件夹下创建文件qqq
$ echo '其他'>qqq
$ ls 查看文件夹目录
$ touch README.md 添加一个文件
-------------------------------------------------------------
vim快捷键
撤销:esc状态下按u
保存并退出:esc,:wq
全部保存退出:esc:wqa
强制退出::q!
-------------------------------------------------------------
bash快捷键
ctrl+u删除光标左边
ctrl+k删除光标右边
ctrl+w删除一个单词
-------------------------------------------------------------
git的不同种类
指令版
cmd中不能运行git命令,除非安装配置时选择第二个
git cmd可以运行git命令
git bash在cmd中加入了几个实用的linux命令以及git自己的命令
gui界面版
git gui,git extensions,TortoiseGit,Sourcetree
git gui获取SSH pub KEY
git gui-help-show ssh key添加到github里的settings-ssh and gpg keys里
-------------------------------------------------------------
git概念原理
CVS、Subversion、Perforce、Bazaar 等等,将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异
git把数据看作是对小型文件系统的一组快照
git三种状态
工作区->工作区已修改(modified)->add到暂存区->commit本地已暂存(staged),push到远端 已提交(committed)
定制你的 Git 环境。 每台计算机上只需要配置一次
安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。
这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:
$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]
Freenode IRC 服务器( irc.freenode.net )的 #git 或 #github 频道
linux国外技术聊天室
git版本快速切换靠的是git快照机制
参考:如何理解git的快照? https://www.zhihu.com/question/27680108
http://hanfu.space/%E6%8A%80%E6%9C%AF/2015/08/26/git-tutorial/
pull引起冲突
当本地,远端,基础都不一样时$ git pull会冲突
$ git pull和$ git push简写都只会拉推对应远端分支,不会拉推所有
服务器没有a文件,本地有a,但是版本落后于远端,git pull不冲突直接删除本地a文件,需要的话用reset或者revert版本回退。
如果我们本地文件版本更新,这时git pull时就会提示冲突
-------------------------------------------------------------
github界面
github仓库里的new pull request按钮是,别人fork了你的仓库,对你提了一些修改,希望你能拉取合并的。
-------------------------------------------------------------
git拉取规则
针对项目一期,二期修改的
改一期,本地pc-qxn拉远端master,推远端pc-qxn,推远端master,登本地dev,拉取最新dev,选择pc-qxn节点右击选择“和分支合并”选择pc-qxn,合并本地pc-qxn,然后推送远端dev。
改二期,登本地dev,拉远端dev,推远端dev。
-------------------------------------------------------------
git多人协作
一、仓库合作
settings-collaborators-输入用户名添加-对方bellNotice-accept invitation
二、创建组织organization
创建好后把组织地址发给被邀请的人,如https://github.com/qxnTestOrganization,对方跳转url点击接收邀请。
三、发起pull request
-------------------------------------------------------------
github快捷键
shift+/打开快捷键面板
-------------------------------------------------------------
git报错
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory.
换行符不同
$ rm -rf .git // 删除.git
$ git config --global core.autocrlf false //禁用自动转换
$ git init
$ git add .
-------------------------------------------------------------
测试ssh是否添加成功
ssh -T [email protected]
返回Hi qianxiaoning!成功
-------------------------------------------------------------
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
在公司电脑全局设置email时,会把自己项目的email地址也改变,从而使github面板能提交但是不会显示贡献值
建议全局设置自己的email,在公司项目单独设置email
$ git config user.email "[email protected]"
自定义别名
$ git config --global alias.a add
$ git config --global alias.c commit
git a .&&c -m's'
git license 开源许可证
没有任何下游许可条件,您可以使用您想要的任何许可证。常见许可证包括MIT,Apache 2.0,ISC和BSD
强版copyleft(也提供公共相同的权限,但条件是下游使用相同的许可证),
那么您的项目将必须使用相同的许可证。常见的强大的Copyleft许可证包括GPLv2,GPLv3和AGPLv3
MIT是npm库最受欢迎的许可证
MIT 许可证 -- 只要用户在项目副本中包含了版权声明和许可声明,他们就可以拿你的代码做任何想做的事情,你也无需承担任何责任。
Apache 许可证 -- 类似 MIT 许可证,但它同时还包含了贡献者向用户提供专利授权相关的条款。
GPL 许可证 -- 这是一种copyleft许可证,要求修改项目代码的用户再次分发源码或二进制代码时,必须公布他的相关修改。
V3版本与V2类似,但其进一步约束了在某些限制软件更改的硬件上的使用范围。
从松到严,MIT --> Apache --> GPL,而且貌似有过统计,MIT协议用的最多。
各种不同许可证区别,详见img/github_licenses图
推分支到不同远端的不同分支上
推本地dev分支到remoteA远端上的master分支
先git remote add remoteA到remote
再git push remoteA dev:master
拉取
git pull remoteA dev:master
同名的话
git pull remoteA dev
git pull之前建立关联
git branch --set-upstream-to=origin/dev dev
如果在github上新建仓库先建了文件(如.gitignore)等
在本地推仓库时会报fatal: refusing to merge unrelated histories
因为两个仓库有不同的开始点
用--allow-unrelated-histories 告诉git自己确定远端就是我们设的origin
git pull --allow-unrelated-histories
ssh 安全外壳协议 公钥私钥 用的就是非对称加密算法
一台电脑对应一对公私钥,一台电脑只需生成一对公私钥完成本机和网络的ssh传输
生成ssh-key 参数
$ ssh-keygen -t rsa -C "qianxiaoning" -b 4096 -f /C/Users/lenovo/.ssh/id_rsa.company
-t 指定密钥类型,默认是 rsa
-C 设置注释文字,比如我的名字
-f 指定密钥文件存储路径
公私钥默认文件名id_rsa,如要改名生成时使用-f
指定ssh文件存储路径 -f
$ ssh-keygen -t rsa -C "qianxiaoning" -b 4096 -f /C/Users/lenovo/.ssh/id_rsa.company
直接输入id_rsa.company,则在当前路径生成rsa文件
ssh会默认在.ssh文件夹下读取文件名为id_rsa的文件为私钥文件
如果私钥未放在.ssh文件夹下,或者私钥文件不叫id_rsa,则无法读取到,需要在.ssh文件夹下配置config文件,根据git clone的服务器域名,匹配对应的私钥地址
一般一台电脑只需要一对公私钥,我的格式为
$ ssh-keygen -C "qianxiaoning"
注释为'qianxiaoning'生成公私钥
在平台上(如github,gitlab)传上我的公钥,取名xxxPc(意为代表某一台电脑)
-c注释统一为我的名字qianxiaoning即可,不然不同注释(比如不同邮箱)会使得生成的公私钥文件不同,使得ssh连接时校验失败,使得需要配置多个ssh-key使操作变的复杂。
如果特殊需要,需要多对公私钥的,需要配置.ssh的config文件
格式:
Host hostName(git服务器域名)
IdentityFile #私钥位置
User #用户名(注册平台时的个人或者公司的邮箱)
git clone时,标准格式
git clone git@hostName:xxx/a-demo.git
例子:
#个人github
Host github.com
IdentityFile ~/.ssh/id_rsa
User [email protected]
#个人gitlab
Host gitlab.com
IdentityFile ~/.ssh/id_rsa
User [email protected]
#公司gitlab
Host git.a-company.com
IdentityFile ~/.ssh/id_rsa.company
User [email protected]
#客户公司的gitlab
Host git.b-company.com
IdentityFile ~/.ssh/id_rsa.company
User [email protected]
ssh会去config文件里找到Host名为hostName对应的本地的私钥文件位置,与gitlab,github平台上的公钥进行加解密,校验是否合法,从而建立连接
如果平台上的公钥不存在,或者与电脑上的私钥不匹配,会显示:
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
这样的错误,表示公私钥匹配失败
经试验,一台电脑只需一对ssh公私钥,多平台通用
有的公司gitlab服务器配置有问题,会导致ssh无法拉取,比如dns,ip问题。我以前公司就只能用https拉取,ssh拉取失败。
git tag v1.0 打标签
tag标签是某一时间点上的版本,和分支无关,类似于"不可编辑的分支"
把本地代码push以后,1.在本地打tag 2.再把tag push,此tag会为此时间点上的版本
较具体的git分支管理(gitflow流程):
稳定分支:master
开发分支:develop
线上紧急bug,beta发:hotfix,生产环境发tagv1.1.1
日常开发,beta发:release,生产环境发tagv1.2
打tag:hotfix 或 release
1.线上紧急bug(之前测完的项目又发现小bug)
master => 新建hotfix,hotfix修改,修改完毕上测试,测完打tag小版本v1.1.1,把tag上传到远端。上传tagv1.1.1到测试再回测一遍,测完tagv1.1.1上生产,合并到master和develop,删除hotfix分支
2.日常开发(时间较长久)
develop => 新建feature1.2,开发完毕merge到develop,develop => 新建release,上测试环境,测试release,修改release,测完打tag大版本v1.2,把tag上传到远端。上传tagv1.2到测试再回测一遍,测完tagv1.2上生产,合并到develop和master,删除release和feature分支
merge合并后会把commit记录也带过去
如:在master分支,git merge dev,会把dev分支上的commit记录带到master上
--------------
eclipse的git操作
1.初始化:
仓库右键-team-share project-在工作空间新建文件夹
2.提交
仓库右键-team-commit...-双加号-写注释-commit按钮
3.push
仓库右键-team-push branch 'master'...-写入远端地址
在git staging-commit and push...按钮
4.查看历史
仓库右键-team-show in history
5.冲突
push后红色标志,reject-点开team synchronizing界面-pull-手动修改合并
6.pull
仓库右键-team-pull
7.创建分支
仓库右键-team-switch to-new branch
8.合并分支到主分支
切换到主分支
仓库右键-team-merge...-选择分支
9.克隆远程仓库
右上角open perspective-git-复制远程仓库路径-ctrl v-选择本地位置-切换java视图-import导入项目
--------------
idea的git操作
vcs-git-resolve conflicts
--------------
git切换远端仓库
当远端仓库需要删除时,如何将本地的.git同步到新建仓库
在项目中输入下面指令:
1.删原仓库之前
一次拉取所有远端分支到本地
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
2.删除原仓库,新建仓库
git remote set-url origin [email protected]:qxn/c.git//修改远端路径
git push -u origin --tags//推送所有tag
git push -u origin --all//推送所有分支
git push -u origin main && git push -u origin --tags && git push -u origin --all
--------------
gitlab版本回滚
git reset --hard 3628164
git push -f//线上也回滚(线上提交删除)
--------------
git提示
ERROR: You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type.
时,
执行ssh-keygen -t ecdsa -C "[email protected]"
cat /root/.ssh/id_ecdsa.pub
即可
--------------
git clone指定分支
git clone -b v2.8.1 https://git.xxx.git
--------------
版本回退到上一个版本
git reset --soft HEAD~1 本地修改不丢失
git reset --hard HEAD~1 本地修改丢失
--------------
拉取所有远端分支到本地
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done
| 表示通道,即前面命令的输出是后面命令的输入。
for xxx in xxxs; do xxx; done是shell的for循环语句。
倒引号``表示里面的是命令。
git branch -r 列出远程分支。
grep -v – ‘->’ ,grep查找命令,-v 参数表示not grep ,即查找输入中的不含’->’ 的行。
git branch -r | grep -v – ‘->’ ,合起来就是参看远程分支中除了含有’->’ 的分支。
$b 表示远程分支名,例如:origin/dev。
${b##origin/} 表示截取远程分支名中origin/后面的内容,例如:dev,以此当做本地分支。
git branch --track ${b##origin/} $b,类似于方法1的git branch dev origin/dev,–track参数是默认的,不加亦可。
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
--------------