忘性大的Leslie 澄澈秋水 1周前
(Leslie根据b站学习视频整理:https://www.bilibili.com/video/av24736323/?p=1,这个老师讲的挺好,推荐~喜欢这个老师的笔记风格,但是没法获取,自己简单记一些~~凑合看吧)
版本控制:
分布式
1、协同修改
2、数据备份:可以保留历史状态
3、版本管理:svn是增量式管理,git是文件系统快照
4、权限控制
5、分支管理
集中式:SVN
分布式:git,可避免单点故障
git简介
优势:
1、大部分操作在本地完成,不需要联网
2、完整性保证
3、尽可能添加数据而不是删除或修改数据
4、分支操作非常快捷流畅
5、与Linux命令全面兼容
工作区--git add--暂存区--git commit--本地库
本地库和远程库
团队内:
本地库1--push--远程库--clone--本地库2--pull--本地库1
团队外:
远程库1--fork--远程库2--clone--本地库A--push--远程库2--pull request--审核--merge--远程库1
git命令行操作
本地库操作
1、本地库初始化:
git init---创建了一个.git目录,里面是本地库相关的子目录和文件,不要删除和修改
2、设置签名:
需要用户名和email地址,作用是为了区分不同开发人员,和代码托管中心的账号密码无关
用户名:tom
email:goodMorning@atguigu.com
项目级别/仓库级别:仅在当前本地库范围
-
命令:git config user.name tom_pro
-
git config user.email goodMorning_pro@atguigu.com
-
信息保存的位置:当前项目目录的.git/conf目录
系统用户级别:登录当前操作系统的用户范围
-
命令:git config --global user.name tom_pro
-
git config --global user.email goodMorning_pro@atguigu.com
-
信息保存的位置:家目录(~)下 ~/.gitconfig
优先级:就近原则,项目几倍优先于系统用户级别,如果只有系统用户级别签名,就以系统用户级别为准,二者都没有是不允许的
命令:
1、git status:查看工作区、暂存区状态
2、git add [file name]:提交到暂存区,首次必须执行
3、git rm --cached [file name]:撤销提交到暂存区的操作,文件还在工作区
4、git commit [file name]:提交到本地库,打开vim编辑器输入提交信息
5、git commit -m "提交信息" [file name]:提交到本地库
6、git log:查看历史版本,HEAD指向当前版本,
补充(多屏显示的操作):空格向下翻页、b向上翻页、q退出
6.1、git log --pretty=oneline:日志以一行的形式展示
6.2、git log --oneline:日志的哈希值选择部分,历史记录只能显示之前的,指针若指之前版本,后面版本不显示
6.3、git reflog:显示HEAD需要移动的步数,HEAD@{移动需要几步}
7、HEAD的前进后退
7.1、基于索引值[推荐],可以后退也可前进
git reset --hard [局部索引值]
7.2、使用^符号:只能后退,一个^代表后退一步
git reset --hard HEAD^^^
7.3、使用~符号:只能后退,~3代表后退3步
git reset --hard HEAD~3
reset命令的三个参数对比
--soft参数:仅仅在本地库移动HEAD指针
--mixed参数:在本地库移动HEAD指针,重置暂存区
--hard参数:在本地库移动HEAD指针,重置暂存区,重置工作区
8、删除工作区文件:
rm [file name]
恢复工作区文件思路:
①工作区删除文件后,执行git status会看到文件是待提交到暂存区状态,
②使用git add,可将删除文件提交到暂存区,
③然后再执行git commit -m "delet file"到本地库,工作区文件虽然不在了,但是文件的记录会在本地库中,
④使用git reflog可以查看日志,然后进行后退git reset --hard [局部索引值]的操作,可恢复工作区文件
注:若删除后,只使用了git add,将删除提交到暂存区,但是未执行commit将删除提交到本地库,此时恢复可使用git reset --hard HEAD即可,因为此时本地库中HEAD指针还在删除前的那条记录
9、查看差异
git diff [file name]:工作区当前文件和暂存区进行比较
git diff HEAD [file name]:工作区当前文件和本地库进行比较
git diff HEAD^ [file name]:工作区当前文件和本地库上一个版本进行比较,其他同理
git diff :多个文件比较
分支管理
在版本控制过程中,使用多条线同时推进多个任务
主干分支:master
好处:
1、同时并行推进多个功能开发,提高开发效率
2、各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可
分支的操作:
1、查看分支:
git branch -v
2、新建一个分支(例:新建一个hot_fix分支):
git branch hot_fix
3、切换分支(切换到hot_fix分支):
git checkout hot_fix
4、合并分支
第一步:切换到接受修改的分支上,相当于切换到master分支
git checkout master
第二步:追踪修改分支到master分支上
git merge hot_fix
5、合并冲突
第一步:先使用git merge 进行合并
第二步:提示合并失败,并且分支后有MERGING的提示
第三步:进入冲突的文件,查看具体的冲突,进行编辑并保存
第四步:使用git status查看状态,待提交到暂存区,git add 一下,提交到暂存区
第五步:查看状态,待提交到本地库,git commit -m 提交到本地库(特别注意:此时commit时一定不加文件名,否则提交失败)
git基本原理
哈希
是一个系列的加密算法
1、不管输入数据的数据量多大,输入同一个哈希算法,得到的加密结果长度固定
2、算法确定,输入数据确定,输出数据不变
3、算法确定,输入数据又变化,输出一定有变化,而且变化很大
4、算法不可逆
哈希算法可以用来被验证文件,对比传输前后的哈希值是否一致,git采取sh1算法
对git分支的理解
git分支可以理解为,文件提交是链条式的,首次提交后,后面的提交都是基于之前的提交形成了一种父子关系,每个文件的版本都会指向上一个版本,而git新建分支并不会像svn去完全复制一套文件出来,而是像指针一样指向了文件的版本,而当前所在的版本又是由HEAD去指向的。
所以,合并分支时的两步可以理解一下,第一步是切换接受修改的分支,相当于把HEAD指针指向被修改的分支;二是merge修改的分支,相当于HEAD带着分支的指针,指向被修改分支指向的文件版本的位置
远程库操作
1、在本地库给远程库起名:
git remote add [起的名字] [远程库地址]
2、在本地库查看远程库(fetch取回,push推送)
git remote -v
3、在本地库推送分支
git push [给远程库起的名字] [本地库分支]
4、从别人的远程库到自己的本地库
git clone [别人远程库地址]
(注:clone下来以后,可以提交到本地库,但是无法push到远程库,因为没有权限,需要远程库的作者把你加入团队
GitHub加入团队:setting--collaborators--添加被邀请加入团队人的GitHub账号---提交后copy地址发给被邀请者,让被邀请者在登录账号下被访问地址,accept)
5、把自己本地库分支推送到别人远程库
git push [远程库起的名字] [本地库分支]
6、从修改过的远程库拉取到本地
pull相当于fetch和merge的结合,fetch只是把远程库拉取到本地库【git fetch [远程库别名] [远程分支名]】,但是工作区还是原来的,merge后才是合并到本地工作区【git merge [远程库别名]/[远程分支名]】
git pull [远程库别名] [远程分支名]
7、与远程库发生冲突如何解决
团队外
远程库1---fork---远程库2---git clone---git push---远程库2----pull request---远程库1审核----merge----远程库1
1、团队外成员访问远程库1地址在github上点击“fork”
2、克隆,修改,提交远程库2
3、github上点击pull request--new pull request---create pull request
4、远程库1操作者在github上点击pull request,可以在里面对话---审核代码,点击commit或files change----merge pull request----填写日志信息---commit
5、git pull,拉取到本地
使用ssh登录,push到远程库不需要登录了
1、在家目录(~)下创建.ssh目录:
ssh-keygen -t rsa -C [github邮箱地址]
2、查看目录里的id_rsa.pub文件:cat id_rsa.pub
3、复制文件内容,登录github,点击头像---settings---SSH and GPS keys
4、New SSH Key
5、输入复制的密钥信息
eclipse特定文件,不提交到本地库,因为eclipse版本不同,这些文件也不同,会产生冲突:
.classspath
.project
.settings
target
在家目录下新建java.gitignore
在.gitconfig中添加
[core]
excludesfile = C:/Users/用户名/java.gitignore
补充:
微信扫一扫
关注该公众号