①协同修改:多人并行不悖的修改服务器端的同一个文件
②数据备份:不仅保存目录和文件的当前状态,还能保存每个提交过的历史状态
③版本管理:不保存重复内容,Git采取了文件系统快照的方式,SVN采用的是增量式管理
④权限控制
⑤历史记录
⑥分支管理:多条生产线同时进行提高效率
①版本控制
②版本控制工具
思想:版本控制 实现:版本控制工具
①大部分操作在本地完成,不需要联网
②完整性保证
③尽可能添加数据而不是删除、修改数据
④分支操作非常快捷流畅
⑤与Linux命令全面兼容
工作区--(git add)-->暂存区:临时存储--(git commit)-->本地库:历史版本
任务:维护远程库
局域网环境下:GItLab服务器
外网环境下:GitHub、码云
团队内部协作:其他人加入团队可直接clone到本地库进行修改上传
跨团队协作:fork(复制)一份其他团队的远程库,clone到本地库中进行修改(push),再通过pull request推送请求到原远程库中进行审核,审核通过则merge合并
①命令:git init
②效果:
ll .git/
-rw-r--r-- 1 DELL 197121 23 Nov 16 14:42 HEAD
-rw-r--r-- 1 DELL 197121 130 Nov 16 14:42 config
-rw-r--r-- 1 DELL 197121 73 Nov 16 14:42 description
drwxr-xr-x 1 DELL 197121 0 Nov 16 14:42 hooks/
drwxr-xr-x 1 DELL 197121 0 Nov 16 14:42 info/
drwxr-xr-x 1 DELL 197121 0 Nov 16 14:42 objects/
drwxr-xr-x 1 DELL 197121 0 Nov 16 14:42 refs/
③.git目录存放的是本地库相关的子目录和文件
①作用:区分不同开发者的身份
②辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系
③命令:
查看级别:cat .git/config
项目级别/仓库级别:仅在本地库范围内有效
git config user.name xxx
git config user.email [email protected]
系统用户级别:登录当前操作系统的用户范围(信息保存位置:~/.gitconfig文件)
git config --global user.name xxx
git config --global user.email [email protected]
级别优先级:
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
若只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
(1)git status——查看状态
①显示该信息表示本地库没有提交任何东西,也没有东西可提交
②没有提交任何东西,但有东西未提交
(2)git add files——添加提交,追踪文件
这里提示输入“git rm --cached file”来从暂存区移除该文件
(3)git commit——提交 / git commit -m "提交的内容" xxx.txt(f提交的file)
root-commit是根提交,只能有一个
再次输入git status:此时工作树(区)是干净的
①git log
——记录提交
②git log --pretty=oneline/ --oneline
——让日志以一行显示
③git reflog
——显示指针值
①基于索引值操作——git reset --hard 局部索引值(c0ef29c)
②使用^符号(只能往后退)——多少个^就后退几步:git reset --hard head^
③使用~符号(只能后退)——git reset --hard head~n后退n步
①--soft——仅在本地库移动head指针
②--mixed——在本地库移动head指针、重置暂存区
原理:head指针和暂存区往后退,而工作区则保持原来位置
③--hard——在本地库移动head指针、重置暂存区、重置工作区
前提:文件存在时的状态提交到了本地库
①删除文件后会停留在暂存区中
(可选)②此时添加被删除的文件
③提交形成历史记录并将head指针后退到删除前
将工作区中的文件和暂存区进行比较
git diff [本地库历史版本] [文件名]
将工作区中的文件和本地库历史记录比较,不带文件名比较文件
①定义:在版本控制中,使用多条线同时推进多个任务
②好处:同时并行推进多个功能开发提高效率;各个分支在开发过程中,如果某个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可
③分支操作
为当前head创建分支——git branch
[分支名]
查看分支——git branch -v
切换分支——git checkout [分支名]
合并分支:
切换到接收修改的分支(被合并,增加新内容)上——git checkout [被合并的分支名];
执行merge命令——git merge [有新内容的分支名]
解决合并分支后产生的冲突:
对主线路和分支的文件进行修改,然后进行合并分支,出现错误
上图表明两条分支都对a.txt文件进行了修改
解决:
修改好文件,删除特殊符号,添加文件到暂存区(提示:所有冲突已解决,但仍处于合并状态,使用git commit来解除这种状态)
使用git commit命令提交
原理:明文——【加密算法/Hash算法】——密文
哈希是一个系列的加密算法,各个不同哈希算法虽然加密强度不同但有相同特点:
①不管输入数据多大,输入同个哈希算法得到的加密结果长度固定
②哈希算法确定,输入数据确定,输出数据能够保证不变
举例:下载一个压缩包,下载之前和下载之后只是部分有大小写变化,其余不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
举例:1个文件进行哈希算法,改变数据后输出数据有很大变化
④哈希算法不可逆
GIt底层采用SHA-1算法
2)Git保存版本的机制
①集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息,这类系统只会保存文件变化后的数据,不会保存重复内容
②Git的文件管理机制
Git把数据看作是小型文件系统的一组快照,对之前版本的所有文件进行快照(复制)到下个版本;为了高效,若文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件,Git的工作方式称之为快照流
③Git文件管理机制细节
Git的“提交对象”
各个版本的文件是用链表联系起来的,一个文件包含自己的哈希值和父对象的哈希值这样就形成了关系
在文件管理的基础之上创建分支,类似链表,切换分支通过切换指针实现
创建本地库——在一个文件夹中git init初始化本地库
创建远程库——在github上new responsitory来创建自己的远程库
创建别名——git remote add origin 地址
查看别名——git remote -v
创建与远程库的连接——git push origin master(分支)
连接成功后远程库出现本地库中的内容
克隆后将在本地仓库生成对应文件夹
问题:第二个账户clone第一个账号远程仓库到本地仓库后,登录自己的账号会出现错误
解决:此时需要将第二个账号拉入到第一个账号的团队中
第二个账号确认加入后即加入团队进行开发
①将结果拉取到origin/master中——git fetch origin master
此时看不到修改的内容,需要切换到orgin/master分支才能看到——git checkout origin/master
若想要将拉取结果放到本地库,切换到本地库执行命令——git merge orgin/master
②直接拉取到本地库——git pull origin master
①若不是基于最新版本所作的修改不能push推送,必须先拉取
②拉取下来若进入冲突状态,则按照分支冲突解决操作即可
①第三个账户fork到本地仓库
②本地修改推送到远程
fork过来后克隆到本地仓库,再添加新数据推送到远程库
③pull requests拉取请求,新建pull requests
第三个账号拉取请求给第一个账号,请求审核通过进行合并
接收者可以对发起者进行审核和测试——审核和测试通过即可以合并
④此时第一个账号可以将合并的内容拉取到本地,完成跨团队协作操作
1)进入当前用户的home目录——cd ~;
删除.ssh目录——rm -rvf .ssh
2)运行命令生成.ssh密钥目录——ssh-keygen -t rsa -C 用户的ssh地址
2)进入.ssh目录获取id_rsa.pub文件的所有内容复制到账户的SSH公钥中
3)添加SSH公钥地址的origin
4)推送SSH请求到远程仓库实现免密登录
在idea中选择git--创建本地库
在git
下定义远程
1)环境配置
①忽略.idea文件等一些与项目实际功能无关的文件
创建xxx.ignore文件——最好存放在用户home目录下,便于让~/.gitconfig文件引用
xxx.ignore文件内容
#Compiled class file *.class #Log file *.log #BlueJ files *.ctxt #Mobile Tools for Java(J2ME) .mtj.tmp/# Package Files # *.jar *.war *.nar *.ear *.zip *.tar.gz *.rar hs_err_pid* .classpath .project .settings target .idea *.iml
②在.gitconfig文件中引用忽略配置文件(此文件在windows的home目录下)
[user] name = tom email = [email protected] [core] excludesfile = C:/Users/git/git.ignore
③在idea中指定git的bin目录
④在idea项目目录中创建.git文件
此时文件变红表示创建成功,并且部分文件并未添加到暂存区中
⑤添加文件到暂存区并提交
注意:文件红色——未添加到暂存区;文件绿色——未提交;文件蓝色——文件收到改变
直接在左下角进行切换
①在hot-fix分支上提交了新的信息
②此时master信息不会更新,需要合并
③在右下角进行合并
问题:在分支和master分支在未合并前在同个文件修改了,就会出现冲突
此时可以对他们的结果进行选择性的合并
在settings中点击gitee创建账号,若用账号密码登录登不进则用(user token)口令登录,在账户中生成口令
github生成口令:settings----developer settings----personal access token