本篇将介绍git与github的相关内容
1、git相关
1.1版本管理
版本管理是一种记录文件变化的方式,以便将来查阅特定版本的文件内容;
人为维护版本管理的话则容易有如下问题:
-
文档数量多且命名不清晰导致文档版本混乱
-
每次编辑文档需要复制,不方便
-
多人同时编辑同一个文档,容易产生覆盖
1.2git定义
Git是一个版本管理控制系统(缩写VCS),它可以在任何时间点,将文档的状态作为更新记录保存起来,也可以在任何时间点,将更新记录恢复回来,git正是由于解决上面人工版本管理存在的问题的。
对于我们程序员来说,git最简单的应用便是用来管理项目的更新迭代以及项目的版本(在开发新功能之前可以将项目状态保存一下防止后面写的太多不能再ctr+z回撤);
1.3git的使用
git的下载安装这里不再赘述,其他博客有很多;
下面先介绍git的工作原理:如下,工作目录是我们当前的项目文件夹,而暂存区是通过add命令从工作目录中存入的,要将文件存入到git本地仓库之前必须经过暂存区(只更新当前修改的文件即可)。在暂存区中的文件通过commit语句提交到本地的git仓库中(这是暂存区已被清空):
介绍完原理便可以直接介绍使用方法了,在项目文件夹根目录下右键点git bash here打开git的命令行窗口:
注意在安装好git初次使用时要对其进行配置(用户、邮箱等等…):
- 配置提交人姓名:
git config --global user.name 提交人姓名
- 配置提交人姓名:
git config --global user.email 提交人邮箱
- 查看git配置信息:
git config --list
注意:
4. 如果要对配置信息进行修改,重复上述命令即可;
5. 配置只需要执行一次;
6. 以上信息处理可以在git的命令行窗口中进行,也可以在c盘下的.gitconfig文件中直接修改:
再已经配置后则可以提交,步骤如下;
git init
初始化git仓库,在当前目录下创建一个空的git仓库(.git文件,如果看不到将隐藏文件显示就好了);
git status
查看文件状态,查看当前缓存区有哪些文件,以及哪些文件修改了但是没有被放到暂存区,表明当前在master主分支下,当前仓库还没有提交内容,untracked表明下面的index.html修改了但没有被存入:
git add 文件列表
追踪文件,将相应的文件添加到暂存区,该句命令运行后是没有提示的;此时如果查看status会发现被提交的文件变成了绿色:
git commit -m 提交信息
向仓库中提交代码,向本地git仓库中提交暂存区的内容,注意要补上提交信息才能提交:
git log
查看提交记录,查看仓库提交了多少次,分别打印出了上传时的id,作者以及提交时间:
下面介绍撤销操作:
1、当将文件提交到暂存区(尚未提交到git仓库中)后继续开发时,想要恢复之前提交到暂存区的文件:用暂存区中的文件覆盖工作目录中的文件: git checkout 文件
;注意覆盖以后暂存区中的文件还是存在的:
2、如果误将一些文件提交到暂存区了想将其删除,则将文件从暂存区中删除: git rm --cached 文件
,如当前暂存区中内容:
现在我们删掉test.html后再打印:
3、最后介绍从本地git仓库中将文件恢复到暂存区和文件目录:将 git 仓库中指定的更新记录恢复出来,并且覆盖暂存区和工作目录:git rest --hard commitID
,如当前git仓库中有两次提交记录:
然后想将第二次提交的记录删掉:
则这时再打印则只有第一次提交的记录了:
此时工作目录下也会恢复成第一次提交时的数据(即版本回退到第一次提交的版本);
1.4git的进阶使用
首先介绍git的分支:
为了便于理解,大家暂时可以认为分支就是当前工作目录中代码的一份副本。使用分支,可以让我们从开发主线上分离出来,以免影响开发主线。比如在一个分支上开发新功能而在另一个分支中修复bug,不同环境互不影响;
其主要有以下几类:
1、主分支(master):第一次向 git 仓库中提交更新记录时自动产生的一个分支,其是以时间为导向的:
2、开发分支,基于主分支master基础上创建的,在这里进行开发经测试后代码没问题则将其并入主分支中,开发分支和主分支的关系如下图:
3、功能分支,基于开发分支基础上创建的分支,作为开发具体功能的分支;当功能分支中的代码开发完毕后将其并入开发分支中(再将当前功能分支删除),当开发分支到达一定目标后将开发分支并入主分支中,如下图所示:
下面介绍相应的分支命令:
-
git branch
查看分支,如下表明当前仓库中只有master一个分支,*表示当前正处于该分支下并且分支名称是有颜色的:
此外也可以通过命令行最后的(master)看出当前处于master分支中:
-
git branch 分支名称
创建分支,下面创建一个开发分支develop(注意当前在a分支下创建b分支,则b分支就是基于a分支的),另外在创建成功时是没有提示信息的:
-
git checkout 分支名称
切换分支:
此时再查看分支,分支已经被切换到了develop分支下:
注意:在切换分支前一定要确保暂存区没有内容,如果在develop分支中暂存区存了develop.html,此时如果切换到master分支,则该develop就会在master分支中也有造成混乱; -
git merge 来源分支
合并分支,如果想将develop分支内容合并到主分支中去,应将其先切换到master分支下,然后:
则现在在主分支的工作目录下也能看到develop.html文件了,上面说明1个文件发生了改变,有0行插入与删除。注意此时develop分支还是存在的,还能再切换回去; -
git branch -d 分支名称
删除分支(分支被合并后才允许删除)(-D 强制删除)
如上则删除了develop分支,这时再打印分支则只剩下master主分支;这是在develop已经被合并后的前提下才能删除,如果develop没合并直接删除会报错,这时如果想没合并也强制删除则应将d改成D;
了解了以上分支命令后最后介绍暂时保存更改命令:
如果在一个分支中开发未完成,在暂存区中有内容(不想提交),但这时必须切换到另外一个分支中,从上面我们已经知道这样会出现问题。
在git中可以通过存储临时改动:git stash
将暂存区中的内容先存储到一个临时区中,然后等忙完另一个分支的工作后再切换回当前分支通过恢复改动:git stash pop
将刚刚临时区中的内容读取回来;
注意必须要切换回原先的分支后再恢复内容,因为内容的恢复是当前处于哪个分支执行了
git stash pop
就往哪个分支中恢复的;
2、github相关
上面我们介绍到的git是本地仓库,但是在团队多人进行开发时则需要用到远程仓库github,其相当于一个文件管理服务器,通过这个服务器可以和团队的队友进行数据交互;
github的注册邮箱验证等这里不再赘述,直接开始介绍使用;
2.1多人开发协作流程
下面以两个程序员a与b的协作说明该流程:
- A在自己的计算机中创建本地仓库
- A在github中创建远程仓库
- A将本地仓库推送到远程仓库
- B克隆远程仓库到本地进行开发
- B将本地仓库中开发的内容推送到远程仓库
- A将远程仓库中的最新内容拉去到本地
1、a创建本地仓库在上面git中已有介绍这里不再赘述,记得将内容上传到本地仓库即可;
2、在github中创建远程仓库其他帖子已写很多,注意一般远程仓库的名字与本地仓库名字保持一致;
3、a在命令行工具中通过git push 远程仓库地址 分支名称
将本地仓库推送到远程仓库中,注意这里的分支名称是指推送到远程仓库的分支名称:
其他操作还有:
- git push 远程仓库地址别名 分支名称;
- git push -u 远程仓库地址别名 分支名称,-u 记住推送地址及分支,下次推送只需要输入git push即可;
- git remote add 远程仓库地址别名 远程仓库地址 ,通过其给远程地址起个别名,后面可以直接通过别名进行操作;
注意:注意在第一次提交时会弹出提示框要求输入账号和密码,本质上在每次提交时都需要输入密码但是win10会自动帮我们记住密码,可在控制面板中的凭据管理中可以找到保存的账号密码:
4、现在b需要从远程仓库上将a提交的内容进行克隆(注意克隆会将a中的设置一并克隆下来,如在a中设置的别名b现在把仓库克隆下来后仍是能继续使用,同时b在本地不需通过git init
创建仓库,因为克隆下来后自然有的),克隆操作:git clone 仓库地址
则在b的工作目录下会有a所提交的全部文件,b可以在其中进行编程;
补充知识点:git命令行工具中进入某一文件夹也是使用cd命令;
5、当b编辑完成后,便可以将所编辑的内容提交到之前a所创建的远程服务器中(注意必须a在github中将邀请码给b进行验证后才可提交,在项目settings中,而克隆操作只要a设置库是public则可以随意克隆),b中将内容提交到本地仓库,然后通过push命令将其推送到远程服务器中:
6、现在a需要通过git pull 远程仓库地址 分支名称
将最新内容拉取到本地:
注意pull和clone的区别:pull是在已有本地仓库的前提下将最新更新的内容拉取到本地仓库,而clone是没有本地仓库的前提下克隆整个仓库到本地中(只需第一次使用);
2.2github中冲突问题
github中存在一个冲突问题在github仓库文件版本高于本地仓库版本,本地是不能向上提交内容的,比如:a程序员和b程序员修改了代码中的同一个地方,这时a先提交了,则b由于本地仓库版本比远程的低则是无法成功提交的:
解决方法是b先将a的提交拉取本地,此时打开会显示拉取下的代码与b在本地修改的冲突:
b需根据需求作相应修改后再重新提交,如:
2.3github另一种推送方法
如这时c使用了a提交的代码实现去自己项目实现功能但是觉得并不完整,自己进行完善后想把该代码贡献给a的仓库,则可以通过以下方式,当贡献a审核通过后也相当于c从命令行工具中提交了代码:
- 程序员 C fork仓库,这是将a的现在目标仓库拷贝到自己的github中:
- 程序员 C 将仓库克隆在本地进行修改
- 程序员 C 将仓库推送到远程
- 程序员 C 发起pull reqest
- 原仓库作者审核
- 原仓库作者合并代码
2.4SSH免密推送
之前我们用的推送都是通过http协议的地址的,并且每次推送时都是需要账户密码验证的(虽然win10帮我们记住了密码),这里介绍SSH方式:
其身份验证通过秘钥实现(秘钥是成对出现的分为公钥和私钥,ssh通过验证公私钥是否配对从而决定验证是否通过);
公钥放在github账户,私钥在开发者电脑中,开发者通过ssh向服务器推送内容两个钥就会进行配对;
生成秘钥:ssh-keygen
秘钥存储目录:C:\Users\用户\.ssh
公钥名称:id_rsa.pub,提交到github上的;
私钥名称:id_rsa,本地电脑中(rsa表示非对称加密方式)
在命令行中输入ssh-keygen
,便可以生成秘钥:
此时在相应目录下可以找到相应的秘钥文件:
这时我们打开公钥文件,看到其中内容如下,将其复制:
在当前项目下的settings中选择ssh:
将刚才复制的公钥码复制到以下的key中,title可以不用填写其会根据key中最后的内容进行填写:
则下面可以使用ssh进行推送了:
2.5git忽略清单
在前面我们将文件提交到暂存区再到仓库都是对单个文件进行操作,虽然可以一次性写多个文件(各文件之间以空格隔开),但在实际项目中文件极多,我们一般在首次提交时都是通过git add .
整体进行提交的,.代表所有文件。
但项目中会包含第三方的模块文件夹如node_modules等我们并不希望将其上传(只要有配置文件这些都能后面进行下载)或者一些临时性的测试文件我们也不希望将其上传,这时可以通过git忽略清单避免将这部分文件上传:git忽略清单文件名称:.gitignore,步骤如下:
在当前的根目录下新建一个.gitignore文件,并打开该文件在其中写上不想提交的文件(有后缀)或文件夹(没后缀),如下写入了两个文件夹以及一个文件:
这时查看status是看不到test.html文件的:
这时可以使用git add .
将其他文件进行提交;
2.6github仓库说明文件
在很多github仓库中我们都能看到readme.md文件,其是对仓库的说明文件,这个文件在创建仓库时可以生成,但我们也可以后期提交,下面介绍后期提交的步骤:
先在项目根目录下新建一个readme.md文件,并在其中写入相应的仓库介绍内容,并将该文件一步步最终添加到远程仓库中去:
最后在github中可以看到此文件;