开源协议,GitHub和Git分支多人协作

420 阅读11分钟

简述开源协议

1. 什么是开源,闭源

通俗的理解

  • 开源 是指不仅提供程序还提供程序的源代码
  • 闭源 是只提供程序,不提供源代码 image.png



2. 什么是开源许可协议

开源并不意味着完全没有限制,为了限制使用者的使用范围保护作者的权利,每个开源项目都应该遵守开源许可协议( Open Source License )。

常见的 6 种开源许可协议:

  • BSD(Berkeley Software Distribution)
  • Apache Licence 2.0
  • GPL(GNU General Public License) (⭐⭐⭐)
    • 具有传染性的一种开源协议,不允许修改后和衍生的代码做为闭源的商业软件发布和销售
    • 使用 GPL 的最著名的软件项目是:Linux
  • LGPL(GNU Lesser General Public License)
  • MIT(Massachusetts Institute of Technology, MIT) (⭐⭐⭐)
    • 是目前限制最少的协议,唯一的条件:在修改后的代码或者发行包中,必须包含原作者的许可信息
    • 使用 MIT 的软件项目有:jqueryNode.js;
  • Mozilla公共许可证(英语:Mozilla Public License,简称MPL)是个自由、开源、详细的软件许可证,由Mozilla基金会开发并维护。该协议融合了BSD许可证和GNU通用公共许可协议的特性,追求平衡专有软件和开源软件开发者之间的顾虑。

image.png 开源是软件开发领域的大趋势,拥抱开源就像站在了巨人的肩膀上,不用自己重复造轮子,让开发越来越容易


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. 新建空白远程仓库

image.png 成功后显示:

image.png

4.远程仓库的两种访问方式

Github 上的远程仓库,有两种访问方式,分别是 HTTPSSSH。它们的区别是:
HTTPS零配置;但是每次访问仓库时,需要重复输入 Github 的账号和密码才能访问成功
SSH需要进行额外的配置;但是配置成功后,每次访问仓库时,不需重复输入 Github 的账号和密码

注意: 在实际开发中,推荐使用 SSH 的方式访问远程仓库。



5. 基于 HTTPS 将本地仓库上传到 Github

image.png



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的公钥/私钥都完成了。

image.png




然后分别查看github以及gitee的公钥,即.pub文件夹里面的内容

cat id_rsa_github.pub
cat id_rsa_gitee.pub

image.png 将这里面显示出来的乱码段分别粘到gitee和github的公钥设置里

image.png

然后在命令行输入命令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 已经配置成功了:

image.png 最后在项目控制台输入,下图命令,就可以push到GitHub了

image.png

9. 基于 SSH 将本地仓库上传到 Github

image.png

注意: git push origin master 也能进行提交,git push origin -u 的话可以提交代码,并且把origin 当作默认的主机,后续直接 git push 就可以提交到origin对应的主机

10. 将远程仓库克隆到本地

打开 Git Bash,输入如下的命令并回车执行:

git clone 远程仓库的地址

image.png

Git 分支

1.分支的概念

假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。



2. 分支在实际开发中的作用

image.png



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