课程地址:【【git&github】入门教程,必学!】 https://www.bilibili.com/video/BV1cE411G7yc/?share_source=copy_web&vd_source=b1cb921b73fe3808550eaf2224d1c155
目录
3 Github
3.1 注册
3.2 多人协作开发流程
3.2.1 远程仓库
3.2.2 本地仓库推送到远程仓库
3.2.3 远程仓库地址别名
3.2.4 远程仓库克隆到本地仓库
3.2.5 推送到远程仓库
3.2.6 将最新版本更新到本地仓库
3.3 冲突
3.3.1 冲突的发生
3.3.2 制造冲突
3.4 跨团队协作
3.4.1 跨团队协作场景
3.4.2 向其他仓库贡献代码
3.4.3 原仓库作者审核
3.4.4 总结
3.7 ssh免登陆
3.7.1 ssh产生原因
3.7.2 ssh的身份验证
3.7.3 ssh实现免登陆操作
1 生成密钥
2 配置网站公钥
3 操作仓库
4 总结
3.8 git忽略清单
3.9 为仓库添加详细的说明
3 Github
前面讲的都是使用git操作本地仓库,如果整个项目都是1个人开发的,只用本地仓库就足够了。但是实际开发中,还存在多个人同时开发1个项目的情况。这时需要多个人共享一份代码。
在版本控制系统中,大约90%的操作都是在本地仓库中进行的:暂存、提交,查看状态或历史记录等。除此之外,如果仅有1个人在这个项目里工作,那么永远没有机会需要设置一个远程仓库。
只有当需要和开发团队共享数据时,设置一个远程仓库才有意义。可以将远程仓库想象成一个文件管理服务器,利用这个服务器可以与开发团队的其他成员进行数据交流。
这不意味着开发人员直接在远程仓库中开发。开发人员仍然需要在本地仓库进行开发。
当功能开发完成后,开发人员将本地仓库的代码推送到公共仓库中。
其他开发人员可以从公共仓库中拉取你推送的代码,这样就实现多人协作开发。
本地仓库位于每个开发人员的本地计算机上。相反,公共仓库被设置在所有开发人员访问到的远程服务器上,基本都是在互联网上或本地局域网中。因此也称公共仓库为远程仓库。
知名git仓库服务的提供商,提供公共仓库服务的网站——Github。
要使用Github,需要在网站注册Github账号。
3.1 注册
登录GitHub: Let’s build from here · GitHub,点击sign up按钮进行注册,按照要求填写注册信息即可注册成功。
3.2 多人协作开发流程
- A在自己的计算机中创建本地仓库
- A在github中创建远程仓库
- A将本地仓库推送到远程仓库
- B克隆远程仓库到本地进行开发
- B将本地仓库中开发的内容推送到远程仓库
- A将远程仓库中的最新内容拉取到本地
3.2.1 远程仓库
- 1 创建本地仓库
- 新建文件夹,然后在当前目录下执行git init
- 然后新建index.html,并添加到暂存区(git add index.html),然后提交到本地仓库(git commit -m index.html)
- 2 创建远程仓库
点击new按钮
输入新建的仓库名称,点击按钮
远程仓库创建完毕。
3.2.2 本地仓库推送到远程仓库
此时来到了仓库的首页。
此时github显示了仓库的基本信息,以及如何向仓库推送内容的命令。
远程仓库有两种形式,1是https开头的形式,第2种是SSH。现在只需要关注https就可以了。
已知远程仓库地址,如果向仓库推送内容?
方法1:在命令行工具中创建一个空的仓库,然后推送到当前远程仓库;
方法2:从命令行工具中推送一个已经存在的仓库到远程仓库;
方法3:从其他的仓库中导入内容。
这里使用方法2.
具体如何推送?将本地仓库推送到远程仓库。
1 git push 远程仓库地址 分支名称
比如想推送master主分支,那么分支名称就写master
2 git push 远程仓库地址别名 分支名称
3 git push -u 远程仓库地址别名 分支名称
-u记住推送地址及分支,下次推送只需要输入 git push 即可。
4 git remote add 远程仓库地址别名 远程仓库地址
实践
执行1命令git push 远程仓库地址 分支名称,提示向远程仓库推送了一个分支,将本地的master推送到远程仓库的master
回到github并刷新,可以看到提交的index.html文件。
3.2.3 远程仓库地址别名
A程序员将本地仓库推送到远程仓库,但是刚才输入的命令过于繁琐,每次推送时都要写上仓库的远程地址。
每次写远程地址时不是很方便,为解决这个问题,可以为远程仓库地址起别名,再推送远程地址时就比较方便了。
如何给远程仓库起别名呢?用到的命令是
git remote add 远程仓库地址别名 远程仓库地址
远程仓库地址别名一般起名为origin。
向远程仓库别名推送分支
git push origin master
实践
1 为远程仓库起别名
2 向远程仓库别名推送master
注意:第二次提交,不需要再次输入用户名和密码。此功能是win10系统记住的用户名和密码。
win10将用户名和密码保存在哪里了呢?
要想更加方便提交代码。
git push -u origin master -u记住推送地址及分支,下次推送只需要输入 git push 即可。
再推送到远程仓库,第三步命令直接git push就可以了。
总结:
1 git push 远程仓库地址 分支名称
远程仓库地址太长了,所以我们起别名。
4 git remote add 远程仓库地址别名 远程仓库地址
下次提交可以直接写命令
2 git push 远程仓库地址别名 分支名称
起了别名发现命令还是比较长,所以在提交的时候对命令加上-u参数,-u表示记住推送地址及分支,下次推送只需要输入 git push 即可。
3 git push -u 远程仓库地址别名 分支名称
3.2.4 远程仓库克隆到本地仓库
3.2.1 程序员A创建本地仓库,创建远程仓库
3.2.2 程序员A将本地仓库推送到远程仓库
作为程序员B,与程序员A一起开发项目,不需要创建仓库。他可以将程序员A创建的仓库直接拿来使用。
此时程序员B要用到克隆命令,将程序员A创建的远程仓库克隆到程序员B的本地即可。
克隆远端数据仓库到本地: git clone 仓库地址
注意:克隆不需要身份验证,因为这里创建的仓库是开放的,任何人都可以克隆。
实践
此时程序员B的文件夹下多了git-demo-A文件夹。
3.2.5 推送到远程仓库
程序员B就可以在克隆仓库的基础上开发了。
开发完成后,程序员B要将开发成果提交到本地仓库,然后将本地仓库推送到远程仓库。
注意:
程序员B不能向远程仓库提交代码。如果我们创建的仓库可以被任何人随意提交代码,那么这个仓库就无法管理了。
程序员B如何向仓库提交代码呢?需要程序员A邀请程序员B成为当前项目的开发者。
如何邀请?
此处填写程序员B的github账号
后续复制邀请链接,并发给程序员B。
程序员B接受邀请链接,
(懒得搞第2个账号,我这里继续用程序员A来模拟这里的程序员B)
注意: 程序员B克隆的很全面,连程序员A添加的远程仓库别名也克隆过来了。因此程序员B可以直接使用 git push origin master来提交修改。
提交成功后可以看到远程仓库显示程序员B的提交信息。
3.2.6 将最新版本更新到本地仓库
3.2.5 程序员B将最新代码推送到远程仓库,此时程序员A本地仓库中没有程序员B提交的最新代码。
程序员A需要将远程仓库的最新版本拉取到本地仓库。
拉取远程仓库中最新的版本:git pull 远程仓库地址 分支名称
注意:拉取操作属于读操作,github不需要验证身份。
回到程序员A的项目目录。
拉取
结果
可以A的本地仓库的index.html文件多了一行程序员B添加的内容。
说明:git pull 和git clone命令的区别。
git pull命令只是拉取远程仓库最新的版本,最新版本是与本地仓库的版本进行比较的。所以git pull是在已有本地仓库的基础上进行的。
git clone命令完全克隆远程仓库,是在没有本地仓库的基础上进行的。git clone只需要在加入项目开发的时候用到,在克隆完成后就不需要这个命令了。
说明2:如果远程仓库的版本高于本地仓库的版本,此时本地仓库是不能向远程仓库提交的。本地仓库需先拉取远程仓库的内容到本地,然后再向远程仓库进行提交。
3.3 冲突
3.3.1 冲突的发生
在多人同时开发一个项目时,如果两个人修改了同一个文件的同一个地方,就会发生冲突。
先向远程仓库推送的人才会推送成功,后推送的人推送会失败。
因为第一个人已经向远程仓库提交了版本,第二个人的本地仓库没有这个版本。导致远程仓库版本高于本地仓库版本,此时本地仓库不能向远程仓库提交。
第二个人需要将远程仓库的版本拉取到本地仓库,但由于两个人修改了同一个文件的同一个地方,因此导致冲突的发生。
冲突需要人为解决
冲突发生的时候工具是不能帮助我们决定怎么做的,需要人为解决。
因此第二个人需要在本地仓库先把冲突解决掉,然后再向远程仓库中提交才能提交成功。
3.3.2 制造冲突
没有第2个账号,这里口述一下冲突的发生。
程序员A修改index.html的第2行内容。然后将修改的文件添加到暂存区。然后将修改提交到本地仓库。然后将本地仓库推送到远程仓库。
程序员A修改index.html的第2行内容。后将修改的文件添加到暂存区。然后将修改提交到本地仓库。然后将本地仓库推送到远程仓库(此时是推送不上去的)。
冲突:程序员B在git push origin master时会失败。
解决冲突:
步骤1:程序员B将远程仓库最新版本拉取到本地。此时会提示有冲突conflict。
步骤2:切换到编辑器中
此时先把无用的东西删除。
步骤3:将当前做出的修改添加到暂存区中(git add),然后提交到本地仓库中(git commit)。此时冲突就解决完成了。
注意:提交信息可以写“解决冲突”
步骤4:将本地仓库推送到远程仓库(git push)
步骤5:可以看到github上的远程仓库的文件已经包括程序员A和B提交的修改内容了。
3.4 跨团队协作
3.4.1 跨团队协作场景
github除了支持团队协作之外,还支持非团队协作。即你不是团队成员,也有方法向其他人的git仓库中提交代码。只是你提交的代码需要被审核,只有审核通过了才可以生效。
该功能的应用场景:比如说要完成一个网页效果,你在github上找到了一个可以实现这个效果的库。但是使用过程中发现这个库的功能并不完善,然后你将这个库进行了一番完善。此时你可以将你完善的代码提交给仓库的作者。如果仓库的作者认为你提交的代码十分有价值,原仓库的作者就会将你提交的代码合并到他的仓库中。
3.4.2 向其他仓库贡献代码
问题:如果才能向其他的仓库中贡献代码呢?
实践:程序员C访问程序员A创建的仓库git-demo-A,如果程序员C想为git-demo-A仓库贡献代码,要做以下几步。
步骤1:fork一下这个仓库(点击下图fork按钮)。
fork:有叉子的意思,实际上指的是将程序员A创建的仓库复制一份,且放到程序员C的github账户中。
然后就可以看到程序员C的github账户里也有git-demo-A仓库了,fork之后这个仓库就完全属于程序员C了。
然后程序员C克隆仓库到本地(git clone),在本地仓库进行修改。
注意这时克隆的是程序员Cgithub账号里的远程仓库地址。
修改完成后推送到当前远程仓库中来(git push)。
然后向原作者发送代码修改的请求。
点击页面的 Pull requests 按钮,然后点击 New pull request按钮,然后Create pull request,然后会在页面底部看到程序员C当前添加的内容。
然后与原作者进行对话,填写对话主题和详细信息。完成后点击Create pull request。
然后编辑的代码和填写的信息都会发送到原作者。
3.4.3 原仓库作者审核
切换到程序员A的视角。
程序员A的仓库中也有Pull requests。
可以发现程序员C发来的request,也可以对程序员C做回复,比如,问你的代码经过测试了吗等内容,且要对程序员C修改的内容进行审核。
确认没有问题,可以将代码合并到仓库中。
如何合并?
在与程序员C的对话里,可以看到Merge pull request的按钮,点击按钮即可合并程序员C提交的代码合并到程序员A的仓库中去。然后点击Confirm merge。
3.4.4 总结
- 程序员C fork 仓库
- 程序员C 将仓库克隆在本地进行修改
- 程序员C 将仓库推送到远程仓库
- 程序员C 发起 pull request
- 原仓库作者审核
- 原仓库作者合并代码
3.7 ssh免登陆
3.7.1 ssh产生原因
到目前为止,对远程仓库的操作采用的都是https协议的仓库地址,这种协议要实现身份验证,用户必须要提供用户名和密码,在正常情况下,每次向远程仓库推送内容都需要进行身份验证,都需要提供用户名和密码。只不过现在使用的是win10操作系统,在第一次输入完用户名和密码后,操作系统就帮我们记住了。下一次再推送时,使用的就是操作系统记住的用户名和密码。如果使用的操作系统不具备这个功能,那么每次推送时都需要输入用户名和密码。频繁的输入是一件十分头疼的事情。github提供了另外一种仓库通信协议,就是ssh协议,这种协议使用身份验证时不需要使用户名和密码。他可以实现免登陆操作。
3.7.2 ssh的身份验证
ssh如何做到身份验证的呢?
在ssh里,身份验证通过密钥实现。密钥是成对出现的,分为公钥和私钥。
ssh协议通过验证公钥和私钥的配对情况,决定验证是否通过。
举个例子,公钥相当于门锁,私钥相当于钥匙。如果钥匙可以打开门锁,说明他们是一对的,那么验证就通过了。
公钥和私钥需要开发者通过命令生成,实际上就是两个文件。公钥放在github的账户中,私钥保留在开发者的电脑中。
开发者通过ssh协议向远程仓库推送内容时,公钥和私钥会进行配对,如果配对成功,内容会推送失败。如果配对失败,内容会推送失败。
3.7.3 ssh实现免登陆操作
如果通过ssh实现免登陆操作?
1 生成密钥
步骤1:生成密钥:ssh-keygen
注意:第2-5个红框,git要求我们输入一些内容,但是git全部都有默认值,因此这里直接回车就可以了(一路回车)。然后就生成密钥了。
一对密钥实际就是两个文件。
这两个文件被存到系统目录下。
2 配置网站公钥
步骤2:一对密钥文件。
rsa是一种非对称加密方式,这里不进行展开。
通过代码编辑器打开公钥文件(实际存储了一堆字符串),复制文件内容。
去github网站
复制粘贴过来的公钥,然后点击Add SSH key。
标题会自动填充公钥里的内容。
然后公钥就被添加好了。
3 操作仓库
接着,使用ssh协议对仓库进行操作。
ssh协议的仓库地址。
- 对本地仓库的文件内容进行修改。
- 查看git管理的文件状态。
- 将修改后的文件添加到暂存区(git add)。
- 改动提交到本地仓库(git commit)。
- 本地仓库推送到远程仓库。使用ssh协议。
- 地址起别名(ssh协议的仓库地址还是有点长)
- 使用远程别名推送内容
起别名: git remote add origin_ssh git@github.com:abigale00/git-demo-A.git
推送内容到远程:git push origin_ssh master
以上,将本地内容推送到远程了,这个过程中没有输入用户名和密码。
因为在github网站中,存储了公钥。程序员A的电脑中保留了公钥对应的私钥。
在推送的时候,github会自动进行配对。
以上就是ssh实现免登陆操作。
4 总结
生成密钥:ssh-keygen
公钥添加到github的仓库中。
进行push推送时,私钥和公钥会进行配对,如果配对成功,那么就会push推送成功。
3.8 git忽略清单
将不需要被git管理的文件名字添加到此文件中,在执行git命令的时候,git会忽略这些文件。
git忽略清单文件名称:.git
将工作目录中的文件全部添加到暂存区: git add .
在实际开发中,一次添加的文件可能有很多,为了方便,可以使用命令一次性将所有的文件添加到暂存区中,此时不希望被管理的文件也会被添加到暂存区中。
因此需要另外一个文件告诉git哪些文件不需要被管理。
在实际开发中,不需要被git管理。
比如node开发时的node_modules,放的都是项目开发时所依赖的第三方模块,这部分的文件是不会更改的,所以这部分没必要被git管理,也没必要上传到远程仓库里。
项目存在package.json文件,其他人只需要根据这个文件下载项目所依赖的文件就可以了。
比如,项目中会临时写一些测试代码文件,这些代码也不希望被管理。
实践
改了下
git status
未跟踪的列表文件中有2个文件,没有index.html,因此index.html已经被写到了git的忽略清单文件。所以未跟踪的列表文件中就没有index.html了。
然后将工作目录的所有文件添加到暂存区中。
查看文件状态
原先有的index.html也被删除了。index.html文件不再被git跟踪管理。
3.9 为仓库添加详细的说明
GitHub - jquery/jquery: jQuery JavaScript Library
jQuery的官方仓库有一堆说明。
如何为自己的仓库添加说明。
在项目的根目录下建一个readme.md文件。文件内容会自动显示在仓库文件列表的下方。
在工作目录建md文件。
提交到本地仓库。
推送到远程仓库。
刷新页面,可以看到项目列表有readme.md文件,且在下方显示出内容。