简述开源协议
1. 什么是开源,闭源
通俗的理解
- 开源 是指不仅提供程序还提供程序的源代码
- 闭源 是只提供程序,不提供源代码
2. 什么是开源许可协议
开源并不意味着完全没有限制,为了限制使用者的使用范围和保护作者的权利,每个开源项目都应该遵守开源许可协议( Open Source License )。
常见的 6 种开源许可协议:
BSD(Berkeley Software Distribution)Apache Licence 2.0GPL(GNU General Public License) (⭐⭐⭐)
- 具有传染性的一种开源协议,不允许修改后和衍生的代码做为闭源的商业软件发布和销售
- 使用
GPL的最著名的软件项目是:LinuxLGPL(GNU Lesser General Public License)MIT(Massachusetts Institute of Technology, MIT) (⭐⭐⭐)
- 是目前限制最少的协议,唯一的条件:在修改后的代码或者发行包中,必须包含原作者的许可信息
- 使用 MIT 的软件项目有:
jquery、Node.js;- Mozilla公共许可证(英语:Mozilla Public License,简称MPL)是个自由、开源、详细的软件许可证,由Mozilla基金会开发并维护。该协议融合了BSD许可证和GNU通用公共许可协议的特性,追求平衡专有软件和开源软件开发者之间的顾虑。
开源是软件开发领域的大趋势,拥抱开源就像站在了巨人的肩膀上,不用自己重复造轮子,让开发越来越容易
3. 开源项目托管平台
专门用于免费存放开源项目源代码的网站,叫做开源项目托管平台。目前世界上比较出名的开源项目托管平台
主要有以下 3 个:
- `Github`(全球最牛的开源项目托管平台,没有之一)
- `Gitlab`(对代码私有性支持较好,因此企业用户较多)
- `Gitee` (又叫做码云,是国产的开源项目托管平台。访问速度快、纯中文界面、使用友好)
注意: 以上 3 个开源项目托管平台,只能托管以 Git 管理的项目源代码,因此,它们的名字都以 Git 开头
GitHub
1. 什么是 GitHub
Github 是全球最大的开源项目托管平台。因为只支持 Git 作为唯一的版本控制工具,故名 GitHub。
在
Github中,你可以:
① 关注自己喜欢的开源项目,为其点赞打call
② 为自己喜欢的开源项目做贡献(Pull Request)
③ 和开源项目的作者讨论 Bug 和提需求 (Issues)
④ 把喜欢的项目复制一份作为自己的项目进行修改(Fork)
⑤ 创建属于自己的开源项目
⑥ …
Github ≠ Git
2. 注册 GitHub 账号的流程
① 访问
Github的官网首页 github.com/
② 点击“Sign up”按钮跳转到注册页面
③ 填写可用的用户名、邮箱、密码
④ 选出对应的图片
⑤ 点击“Continue”按钮注册新用户
⑥ 登录到第三步填写的邮箱中,点击激活链接,完成注册
3. 新建空白远程仓库
成功后显示:
4.远程仓库的两种访问方式
Github上的远程仓库,有两种访问方式,分别是HTTPS和SSH。它们的区别是:
①HTTPS:零配置;但是每次访问仓库时,需要重复输入Github的账号和密码才能访问成功
②SSH:需要进行额外的配置;但是配置成功后,每次访问仓库时,不需重复输入Github的账号和密码
注意: 在实际开发中,推荐使用 SSH 的方式访问远程仓库。
5. 基于 HTTPS 将本地仓库上传到 Github
6. 基于 SSH key
- SSH key
SSH key的作用:实现本地仓库和Github之间免登录的加密数据传输。
SSH key的好处:免登录身份认证、数据加密传输。
SSH key由两部分组成,分别是:
①id_rsa(私钥文件,存放于客户端的电脑中即可)
②id_rsa.pub(公钥文件,需要配置到Github中)
7. 配置 SSH key
① 使用记事本打开
id_rsa.pub文件,复制里面的文本内容
② 在浏览器中登录Github,点击头像 ->Settings -> SSH and GPG Keys -> New SSH key
③ 将id_rsa.pub文件中的内容,粘贴到Key对应的文本框中
④ 在Title文本框中任意填写一个名称,来标识这个Key从何而来
♥♥♥ 如何使用Git同时绑定Github以及Gitee
单独绑定单独输入
ssh-keygen -t rsa -C "此处填你的github绑定邮箱" -f "id_rsa_github"
ssh-keygen -t rsa -C "此处填你的gitee绑定邮箱" -f "id_rsa_gitee"
你会发现.ssh文件夹下面多了id_rsa_gitee和id_rsa_gitee.pub以及id_rsa_github和id_rsa_github.pub,到这里说明gitee和github的公钥/私钥都完成了。
然后分别查看github以及gitee的公钥,即.pub文件夹里面的内容
cat id_rsa_github.pub
cat id_rsa_gitee.pub
将这里面显示出来的乱码段分别粘到gitee和github的公钥设置里
然后在命令行输入命令vi config
进去之后按ESC,然后输入:wq退出,懂Linux的应该知道这是代表保存并退出文件
之后你会发现.ssh文件夹下面多了一个名字叫config的文件,使用记事本打开,粘贴以下
# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gitee
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github
直接粘贴就行,然后保存退出。
这个config文件主要是防止Github和Gitee冲突,一定要配置,很重要!!!
然后分别测试能不能连接上Gitee和Github
ssh -T git@gitee.com
ssh -T git@github.com
下面看下一个步骤
8. 检测 Github 的 SSH key 是否配置成功
打开 Git Bash,输入如下的命令并回车执行:
ssh -T git@gitee.com
上述的命令执行成功后,可能会看到如下的提示消息,输入yes之后,如果能看到类似于下面的提示消息,证明 SSH key 已经配置成功了:
最后在项目控制台输入,下图命令,就可以push到GitHub了
9. 基于 SSH 将本地仓库上传到 Github
注意: git push origin master 也能进行提交,git push origin -u 的话可以提交代码,并且把origin 当作默认的主机,后续直接 git push 就可以提交到origin对应的主机
10. 将远程仓库克隆到本地
打开 Git Bash,输入如下的命令并回车执行:
git clone 远程仓库的地址
Git 分支
1.分支的概念
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
2. 分支在实际开发中的作用
3. master 主分支(main)
在初始化本地 Git 仓库的时候,Git 默认已经帮我们创建了一个名字叫做 master 的分支。通常我们把这个master 分支叫做主分支。
在实际工作中,master 主分支的作用是:用来保存和记录整个项目已完成的功能代码。
因此,不允许程序员直接在 master 分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃。
4. 功能分支
由于程序员不能直接在 master 分支上进行功能的开发,所以就有了功能分支的概念。
功能分支指的是专门用来开发新功能的分支,它是临时从 master 主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到 master 主分支上
5. 查看分支列表
使用如下的命令,可以查看当前 Git 仓库中所有的分支列表:
git branch
注意: 分支名字前面的 * 号表示当前所处的分支。
6. 创建新分支
使用如下的命令,可以基于当前分支,创建一个新的分支,此时,新分支中的代码和当前分支完全一样:
git branch 分支名称
7. 切换分支
使用如下的命令,可以切换到指定的分支上进行开发:
git checkout login
8. 分支的快速创建和切换
使用如下的命令,可以创建指定名称的新分支,并立即切换到新分支上:
# -b 表示创建一个新分支
# checkout 表示切换到刚才新建的分支上
git checkout -b 分支名称
注意:
"git checkout -b 分支名称" 是下面两条命令的简写形式:
①git branch分支名称
②git checkout分支名称
9. 合并分支
功能分支的代码开发测试完毕之后,可以使用如下的命令,将完成后的代码合并到 master 主分支上:
# 1. 切换到 master 分支
git checkout master
# 2. 在master 分支上运行 git merge 命令,将 login 分支的代码合班到 master 分支
git merge login
合并分支时的注意点:
假设要把 C 分支的代码合并到 A 分支,则必须先切换到 A 分支上,再运行 git merge 命令,来合并 C 分支!
10. 删除分支
当把功能分支的代码合并到 master 主分支上以后,就可以使用如下的命令,删除对应的功能分支:
git branch -d 分支名称
注意: 想要删除分支,必须要先切换到主分支
11. 遇到冲突时的分支合并
如果在两个不同的分支中,对同一个文件进行了不同的修改(commit) ,Git 就没法干净的合并它们。 此时,我们需要打开这些包含冲突的文件然后手动解决冲突。
# 假设:在把 reg 分支合并到 master 分支期间
git checkout master
git merge reg
# 打开包含冲突的文件,手动解决冲突之后,再执行如下命令
git add .
git commit -m "解决了分支合并冲突的问题"
12. 将本地分支推送到远程仓库
# -u 表示把本地分支和远程分支进行关联,只在第一次推送的时候需要带 -u 参数
git push -u 远程仓库的别名 本地分支名称:远程分支名称
# 实际案例
git push -u origin payment:pay
# 如果希望远程分支的名称和本地分支名称保持一致,可以对命令进行简化
git push -u origin payment
注意: 第一次推送分支需要带 -u 参数,此后可以直接使用 git push 推送代码到远程分支。
13. 查看远程仓库中所有的分支列表
通过如下的命令,可以查看远程仓库中,所有的分支列表的信息:
git remote show 远程仓库名称
14. 跟踪分支
跟踪分支指的是:从远程仓库中,把远程分支下载到本地仓库中。需要运行的命令如下:
# 示例
git checkout pay
# 从远程仓库中,把对应的远程分支下载到本地仓库,并把下载的本地分支进行重命名
git checkout -b 本地分支名称 远程仓库名称/远程分支名称
# 示例
git checkout -b payment origin/pay
15. 拉取远程分支的最新的代码
可以使用如下的命令,把远程分支最新的代码下载到本地对应的分支中:
# 从远程仓库,拉取当前分支最新的代码,保持当前分支的代码和远程分支代码一致
git pull
16. 删除远程分支
可以使用如下的命令,删除远程仓库中指定的分支:
# 删除远程仓库中,制定名称的远程分支
git push 远程仓库名称 --delete 远程分支名称
# 示例
git push origin --delete pay
多人协作
多人协作时,大家都会往 master 和 dev 各自的分支上推送各自的修改。
当你从远程库 clone 时,默认情况下,你只能看到本地的 master 分支。可以用git branch命令看看:
$ git branch
* master
现在,你要在 dev 分支上开发,就必须创建远程 origin 的 dev 分支到本地,于是用这个命令创建本地 dev 分支:
git checkout -b dev origin/dev
现在,他就可以在 dev 上继续修改,然后,时不时地把 dev 分支 push 到远程:
$ git add env.txt
$ git commit -m "add env"
[dev 7a5e5dd] add env
1 file changed, 1 insertion(+)
create mode 100644 env.txt
$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
f52c633..7a5e5dd dev -> dev
你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:
$ git push origin dev
To github.com:michaelliao/learngit.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git 已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
git pull也失败了,原因是没有指定本地 dev 分支与远程origin/dev分支的链接,根据提示,设置 dev 和origin/dev的链接:
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
再pull:
$ git pull
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt
Automatic merge failed; fix conflicts and then commit the result.
这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再 push:
$ git commit -m "fix env conflict"
[dev 57c53ab] fix env conflict
$ git push origin dev
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 621 bytes | 621.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
7a5e5dd..57c53ab dev -> dev