Git
目录
-版本控制器
用于对项目进行协同开发和版本管理,帮助程序员整合代码,帮助开发者合并开发的代码,并且代码合并出现冲突时,会提示错误并提交给合并代码的开发者以便解决
--种类
集中式版本控制,如svn
svn只有一个服务端,下面可设很多个客户端,每个客户端都只能集中与那一个服务端交互
如果服务端崩了或宕机,整个开发就会停滞
分布式版本控制,如git
git装完后既有客户端又有服务端,git中每个客户都能充当服务端的功能,当服务器出现问题时,便可以启用给一个客户端作为服务端。并且git还可以做版本控制器集群部署
-git
--简介
git是一种版本控制器,控制对象是项目开发的代码
--工作流程
git本地有三个区:工作区,暂存区,版本库
我们在工作区开发程序代码,总操作就只涉及三个:创建、编写、删除文件
代码开发完后需先提交到暂存区然后才能提交到版本库
我们也可把提交到暂存区或版本库中的代码回滚回来重新更新或修改
工作区中也可回滚,就是比如你已提交到版本库中代码版本是1.0,现在在工作区中写的2.0版本的代码,经过回滚后2.0的代码会回滚到/变成原来1.0版的内容
最终将项目文件提交到远程仓库,即远程的服务端版本库。进行所有开发人员的代码整合同步等操作;当然我们也可从远程仓库中拉取代码,参考或修改
远程仓库
流行的如github,码云,gitlab
--分支管理
使用git可以方便的对项目进行分支管理,就是将项目开发分为多个时间轴,每个分支相互独立互不影响,比如项目开发到一定阶段但还未完全开发完,比如luffy项目的轮播图做好了,可以在预览分支上给甲方浏览看效果,不行在返递给开发分支上修改
-git使用
小技巧总结:
有红色信息(工作区有内容),就执行add
全绿信息(内容全在暂存区),才执行commit
只有被版本库控制的代码才能被监听,so可以回滚到任何一个版本
--下载安装
下载:
官网: Git - Downloads
或者 Git for Windows 只有Windows系统的
安装
一路傻瓜式安装即可
教程: git下载安装教程笔记_weer-wmq的博客-CSDN博客
--基础命令
下载完成后我们在左面右击鼠标会出现:
后面我们只用Git Bash Here
---创建git仓库
将已有文件夹初始化为git仓库:
双击打开该文件夹,鼠标放在该文件夹内部,右键鼠标Git Bash Here
>: git init
或者打开Git Bash软件,切换到某路径下: git init 文件夹名
然后就会自动创建一个该文件夹(git 仓库),里面有.git文件夹
# 之后在该文件夹下会有一个.git文件夹(隐藏式文件夹),设置查看所有才能看到
---命令
git status 查看操作状态 git add a.txt 把a.txt提交到暂存区 git add . 把当前路径下的所有提交到暂存区 git commit -m '注释信息' 把暂存区的所有提交到版本库 -m 表示message,后面必须写注释信息,记录到log中,谁干了什么事
使用这句之前必须得有作者信息,以下必须被执行过才能执行提交到版本库
git config --global user.email "用户邮箱" git config --global user.name "用户名" --global表示全局,也可局部: git config user.email "用户邮箱" git config user.name "用户名"
git log 查看版本管理日志
git checkout . .表示当前文件下回到当时提交到版本库的状态(很少用)
---忽略文件
项目中有些文件不用传到版本库中,比如日志文件等
!空文件夹默认不被管理,即默认被忽略
方法:
在项目下(项目路径同级别下或跟.git文件夹一个路径下),创建一个.gitignore文件,在里面配置想要忽略的文件或文件夹,比如luffycity中就有该文件
语法:
# 表示注释 默认.gitignore文件不被忽略 直接写文件夹名,表示该文件夹不被管理即被忽略 忽略文件需要加文件类型后缀,如a.txt 即忽略a.txt文件 /dist 表示根路径下的dist文件夹不被管理 *.py 表示所有后缀名为py的文件都被忽略,*表示任意 *.log* 表示所有日志文件都被忽略,如luffy.log, luffy.log(2)等
---分支操作
git branch 分支名 创建分支
git branch 查看分支
git checkout 分支名 切换分支,绿色表示当前所在分支
远端创建分支: 1、在远端直接创建 2、本地创建然后提交(git push origin 新分支)到远端
git checkout -b 分支 创建并切换分支 git branch -d 分支名 删除分支 git merge 分支 合并分支 注意使用:比如把dev分支合并到master分支:先切到master分支,然后执行git merge dev git branch -a 查看远程分支
---链接远程仓库
以码云(gitee)为例,点新建仓库,然后
一般上面三个都不勾选。分支模型不勾选默认即是单分支模型,即我们勾选了选它也行。重点是新建的时候不用点设置模板勾选添加Readme
远程仓库建立成功后,出现页面,里面会有提示:
说你没有新建git仓库可执行以下代码创建
你已有仓库可执行以下代码远程链接
远程操作命令
git remote # 查看远程仓库(没有就看不到) git remote add origin https://gitee.com/weera/git_first.git # 跟远程仓库git_first建立连接,origin是起的名字,任意,但一般都为origin git push origin master # 把本地的master分支提交到远程的origin,需要输入用户名和密码
---项目开发者操作——pull 和 push
项目创始者,操作如上
现在项目已被创建,我们作为项目的开发者,写代码的,就需要把项目下载下来开发:
git clone https://gitee.com/weera/git_first.git # 把项目文件克隆/下载下来,能看到完整的版本和日志 可以恢复到任意版本: git reset --hard 版本号
好,现在开发人员weer和yuner下载了项目文件,在下载下来的项目文件夹中开发,假设现在weer码完了,新增了一个local.txt文件,
weer开发完了要提交到远程仓库
先走自己本地的噻:git add . git commit -m '新增了local.txt'
然后提交到远程: git push origin master
那现在yuner怎么让项目中的文件成为最新,即得到当前项目最新的所有文件:
git pull origin master # 把origin拉到我本地的master分支上
重点:
每次提交到远程仓库前,一定得先拉取pull代码,然后再push上去,不拉提不上去
比如刚开始weer和yuner开发,weer push了local.txt之后,yuner码完了study.txt,准备push上去,但weer先push上去,即origin中更新了,yuner中的文件不是最新的,然后yuner直接执行push就不被准许,因为这是跨版本提交了,weer的版本跳过了,如下图,上面为正常,下面图为跨版本提交
但好在你push之前没有pull的话,git是不允许的,会rejected,但如果你加了-f
git push origin master -f # 就会执行,嘿嘿嘿push成功
# 褪个色,谨慎使用-f(坏笑)
--git出现冲突的原因及解决
1、分支冲突
不同分支在合并时,比如我们在本地修改了a文件并把a文件的修改push到了test分支下,接着我们切换到master分支下将test分支上的修改合并到当前master分支下时,如果master分支下的a文件也有修改的话,这时进行merge就会产生冲突。(因为这个两个分支是不同步的,两个分支下的同一个文件都有修改)
2、重复冲突
比如同一分支下,我修改了远程仓库中的a文件并提交了,但另一个同事在我push之前也从远程仓库中pull了这个a文件,也对它进行了修改,然后他再想push的时候就会出冲突
解决:
简言之就是对出现冲突的地方进行解决,比如本地分支合并冲突,我和我同事同时修改了a文件,合并时出冲突,会把我的和同事的都列出来,然后我的写得好把同事的删了不就行了,然后再走add,commit那一套
解决参考:
① git冲突出现的原因及解决方案_工程人在路上的博客-CSDN博客_git 冲突
--ssh连接和https连接
前面用的是https连接,但其实大多用的ssh连接
因为用https连接,你向组长那要了git地址,然后pull或clone了项目到本地,你写完代码后要提交,但用https连接的git地址,你提交要你输密码和用户,而用ssh就不用输密码等了
数据加密
-对称加密:加密解密用的同一套算法
-非对称加密:会生成一对公钥和私钥,公钥加密,私钥解密
ssh就是用的非对称加密,会生成一对公钥和私钥,ssh生成公私钥命令:如
会自动在用户家路径下生成一个.ssh文件夹,里面装的公钥和私钥
known_hosts文件(连接远程仓库地址后自动在.ssh中产生的文件):
A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
然后要想用ssh连接,需去码云上配置,把公钥复制出来给领导或组长,组长去他管理的项目的码云里配置你的公钥,私钥保密
组长进入"设置",找到"SSH公钥",粘贴你的公钥
|
|
即可成功添加公钥,可删除
之后就可以发ssh的链接给你了,然后你就可以ssh连接了
--pycharm操作git
要把我们写的传到远程仓库,一般是新建一个文件夹,然后git bash here,然后输入命令把项目从远程仓库拉下来,然后里面多了.git等文件,把这些拉下来的全复制粘贴到我们的项目根文件夹下,再新建一个.gitignore文件,忽略我们要提交的,然后git bash here,输入命令提交要提交的代码到远程仓库中(先走完我们自己的,add,commit,然后push)
pycharm操作git,首先得安装git,然后"设置"-"版本控制"-"测试",有git版本即配置成功
对于用git命令操作的项目文件,再用pycharm操作时,任意右键一个文件都会出现↓,且每个文件都会有颜色的差异
|
|
并且在pycharm工作区右下角↓可以有快速的点点点的分支操作(切换删除等)
就是pycharm会提供很便捷的git相关操作,点点点就能完成,学过命令操作的你肯定上述所有都知道的噻。。。
补充:
对于没有给pycharm指定远程仓库地址的,可以在↓设置,但你在你的项目文件夹下git bash here然后pull或push命令操作过输入了远程仓库地址后,pycharm就会有你的远程地址。就是这步针对实在没有的可以这样做
--线上回滚
本地切换到master分支,git reset --hard 某个版本,然后再向远程push后,远程也回到了那个版本
--git变基
在git中整合来自不同分支的修改主要有两种方法:merge 和 rebase(变基)。
①merge采用的是三元合并的方式。如图,假设此时有master和dev两个分支,我们希望把dev最新的提交结果合到master上v2.0。这时merge指令其实完成了下面三件事:
1、找到需要合并的两个版本(m2和d3),然后找到这两个版本的最近共同祖先(v1.0)
2、提取m2,d3和v1.0的工作区文件,对内容做合并。如果发生冲突则按提示解决冲突,并将解决完毕后的冲突文件add到暂存区中;如果没有冲突则略过这一步。最终,暂存区将会保存合并过后所有文件最终版的快照结果
3、提交结果,生成新的提交对象v2.0
②merge之后,我们去查看提交日志,很可能会发现一个非常复杂交错的日志,但我们希望提交日志能变成干净的一条线,就像它们没做过合并一样。
rebase的意思就是我们把dev分支的基础变到master分支上,但又不删掉dev,这样提交日志看起来就像一根了。
还是上图,我们想合并m2和d3,我们先切换到dev上,然后执行git rebase master,rebase会首先找到这两个分支(即当前分支dev,以及目标基底分支master)的最近共同祖先v1.0,然后对比当前分支(dev)相对于该祖先的历次提交,提取相应的修改保存为临时文件,然后以基底分支(master)的最后一个提交对象为新的出发点,逐个应用之前准备好的临时文件,最后会生成一个新的合并提交对象,从而改写dev的提交历史,最后回到master,执行一次快速合并。