分布式版本控制工具
版本控制
版本控制的功能
- 协同修改
多人并行—修改服务器同一文件 - 数据备份
保存文件的当前状态、历史状态 - 版本管理
保存每一个版本信息时,不存重复的数据,节约内存
git采用文件快照的方式,
svn采用增量式 - 权限控制
对团队中开发者进行权限控制,对团队外贡献的代码进行审核(git独有) - 历史记录
查看修改人、日志信息等;将本地文件恢复到某一历史版本 - 分支管理
团队开发中,多条生产线同时推进,提高效率
版本控制分类
集中式:svn,各个版本存于服务器,易单点故障
分布式:git,能有效解决单点故障,C语言开发
git简介
git官网
由linus使用C编写
git优势
- 大部分操作----本地完成-----不需联网
- 保证完整性
- 尽可能添加数据,而不是删除、修改数据
- 分支操作,快捷流畅
- 与linux命令全面兼容
git安装
-
window
下载,安装,use git from git bash
其他默认!!使用右键–git bash here -
linux
参考地址
安装当前linux版本的最新、稳定版的git
sudo apt-get install git #最新、稳定版
git --version #查看
git结构
代码托管中心
维护远程代码仓库
代码托管模式
- 团队内部
- 跨团队
git操作
- 初始化本地仓库
进入项目目录,命令行执行git init,初始化一个本地仓库.git,内部的文件不能更改 - 设置签名
用户名:jack
Email:xxxx@qq.com
作用:区别不同的开发人员,与登录远程仓库的用户名无关
命令:
项目级别—当前项目
git config user.name jack
git config user.email xxxx@qq.com
签名保存在项目目录下.git/config
系统用户级别—登录操作系统的用户
git config - -global user.name jack
git config - -global user.email xxxx@qq.com
签名保存在~/.gitconfig
二者的优先级:就近原则 - 实际操作
git status #查看当前工作区、暂存区状态
sudo echo test file > a.txt
#增加到暂存区
git add a.txt
#从暂存区移除
git rm --cached a.txt
#暂存区提交到本地仓库
git commit a.txt #使用vim添加操作的描述
git commit -m "描述信息" a.txt
#查看历史记录
git log
如下,可以看到提交的人、提交时间、提交描述、每次提交的索引hash值,HEAD是一个指针,指向当前版本。
若内容太多,需翻页:空格向下、b向上、q退出
#格式化输出版本
git log --pretty=online
git log --oneline
git reflog
- 版本切换
1)使用索引
2)使用^,后退一步
3)使用~,后退n步
#随意切换
git reflog
git reset --hard 复制的索引
#后退的切换
git reset --hard HEAD^ #后退一步
git reset --hard HEAD^^ #后退两步
#后退n步
git reset --hard HEAD~100 #后退100步
- hard、soft、mixed
#查看本地文档
git help reset
#reset的三个参数 index file[暂存区] working tree[工作区]
#reset --soft:仅在本地仓库移动HEAD指针
#reset --mixed:本地仓库移动指针;重置暂存区;
#reset --hard:本地仓库移动指针;重置暂存区;重置工作区
#hard使用较多
- 删除文件,并找回
文件存在时的状态,需提交到本地库
#删除
sudo rm test.txt #在git管理的项目目录下
git status
#将删除操作文件,增加到暂存区
git add test.txt
git status
#删除的文件,提交本地仓库
git commit -m "测试删除" test.txt
#文件删除了,但是删除记录不会丢
#只需回到上一个版本,就可以实现文件的恢复
git reset --hard 索引
#如果删除的文件,只增加到暂存区,没有提交到本地库
#恢复
git reset --hard HEAD
- 比较文件
#比较工作区与暂存区
git diff test.txt
#比较工作区与当前版本
git diff HEAD test.txt
git diff HEAD^ test.txt
git diff HEAD~2 test.txt
绿色为差异部分
git 分支(45minutes)
多条生产线同时推进。
复制Master,产生分支,各个分支同时推进,完成则合并到Master。产生Bug则分支热修复。
分支作用:
1.并行推进,提高开发效率
2.其中一个分支失败,不影响其他分支
分支操作
初始化本地仓库,就只有一个Master分支
#查看分支
git branch -v
#创建分支,将主分支的仓库复制过来
git branch b1
#切换分支
git checkout b1
#在b1分支,不断修改,然后合并到Master分支
git checkout master #切换到master
git branch -v
git merge b1 #在 master上合并b1分支
#合并分支,产生冲突,怎么解决?
#打开文件,删除特殊符号(HEAD代表当前分支),保存
#git add filename
#git commit -m 'xxxxxx'
#最后提交没有文件名
git基本原理
hash算法
特点
- hash算法固定,输出加密结果长度固定(不管输入多少数据)
- hash算法固定,输入内容不变,加密结果不变
- hash算法固定,输入数据变化,加密结果也变化,且通常变化很大
- hash算法不可逆
git底层采用SHA-1,来校验文件
服务端的文件,计算一次hash值,下载到本地的文件计算一次hash值,对比两个值,一致则文件没有损坏。
git文件管理机制
不同版本对应多个文件(以一个文件为例)
初始化本地仓库,创建一个master分支(指针),此时HEAD指向master
创建分支,创建一个指针,可以指向所有文件的不同版本,即版本切换。
看起来像是复制了master分支
切换分支时,HEAD指向该分支指针。
切换不同的分支,只是HEAD指针的移动。
github
- 使用邮箱注册账号
- 更改头像:右上角账户下三角—your profile----点击头像
- 创建本地库
# 创建项目,并在目录下
#初始化本地库
git init
#签名
git config user.name lauf
git config user.email xxx@mail.com
#编辑项目,并提交到本地库
- 创建远程库
登录github----点击右上角±—>new repository
输入一个仓库名字,创建,得到如下链接:
将该https链接保存在当前项目的git管理中
#查看保存的远程仓库链接
git remove -v
#增加远程仓库链接
git remove add name url #给url起一个名字name
#本地库 推送到远程库
git push remote_name native_branch #将本地的一个分支,推送到远程库
#git是怎么识别当前用户是管理远程仓库用户的????签名
#推送远程库时的错误
#
#其他
echo "# lauf" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/wn15239159680/lauf.git
git push -u origin main
推送远程的错误:
另外还要保证网速!
如下输入github个人口令:
生成个人口令:右上角—点击头像-----settings----Developer settings-----Personal access tokens
输入token描述-----选择所有范围select scopes—生成----复制保存(后续看不到了)
- 猪队友克隆操作
#创建一个文件夹,并进入
git clone github_addr #远程仓库地址--code 复制
克隆的功能:
完整地将远程库-----复制到本地
在复制下来的项目中初始化本地仓库, 保存远程地址
此时该队友只能将修改----提交到本地库(需先签名)!!!,不能远程库,因为在push到远程库时,需要登录自己的github,如下:
lauf@master:~/lauf$ git push origin master
Username for 'https://github.com': 944582529@qq.com
Password for 'https://944582529@qq.com@github.com': 个人权限口令验证
Counting objects: 3, done.
Writing objects: 100% (3/3), 250 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/wn15239159680/lauf.git
e623a3f..d404a43 master -> master
问题1:windows下克隆,无法解析域名!!
问题2:ubuntu下克隆,
lauf@master:~$ git clone https://github.com/wn15239159680/lauf.git
Cloning into 'lauf'...
fatal: unable to access 'https://github.com/wn15239159680/lauf.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
lauf@master:~$ git config --global --unset http.proxy
lauf@master:~$ git config --global --unset https.proxy
lauf@master:~$ git clone https://github.com/wn15239159680/lauf.git
Cloning into 'lauf'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
Checking connectivity... done.
$ git clone https://github.com/wn15239159680/lauf.git
Cloning into 'lauf'...
fatal: unable to access 'https://github.com/wn15239159680/lauf.git/': Could not resolve host: github.com
$ git config --global --unset http.proxy
$ git config --global --unset https.proxy
$ git clone https://github.com/wn15239159680/lauf.git
Cloning into 'lauf'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
解决!!
-
将猪队友的github账户加入团队
远程仓库管理账户-----登录github----settings----manage access
输入队友的github账号名字
复制邀请链接-----发送队友----队友登录github----访问该链接----接受邀请—队友可以使用自己的github账号git push -
拉取修改的内容
git fetch origin master #将远程库拉取到本地库,并不修改工作区
#可以查看本地内容,并没有变化
#切换远程master分支
git checkout origin/master
#合并到本地
git merge origin master
#pull = fetch + merge
#当修改的内容不多时,可以使用pull
git pull origin master
- 团队冲突解决
若两个人同时改一个文件的同一个位置,A先提交本地并push到远程库;B再提交本地并push到远程会报错!
解决:
B先pull,然后解决冲突(删除特殊符号),git add xxx----git commit -m ‘xxxxx’----git push origin master
注意:若修改不是基于github远程库的最新版,则需要pull,有冲突则解决。
A/B各有一个github账号
- 跨团队协作
- 复制团队A的github仓库地址
登录团队B的成员的github账号,然后在地址栏后面粘贴复制的github仓库地址,可以看到对应的仓库,点击fork。
2)团队B成员,克隆,本地修改,推送远程(使用自己的github账号)
3)B成员—点击Pull requests—new pull requests—create pull requests—添加描述
4)团队A的管理员账户----Pull requests—对话、审核----merge pull request—添加日志、confirm merge
- ssh免密登录
使用https链接,每次需要输入验证口令,这里配置免密ssh方式
1)生成rsa密钥对
ssh-keygen -t rsa -C github_account_email
#将公钥内容复制到github
cd ~
cd .ssh
cat id_rsa.pub #全部复制
2)登录github----settings-----SSH and GPG keys—new ssh key -----输入title&粘贴
3)到客户端操作,提交到本地库
4)本地管理远程库的ssh地址
git remote -v
git remote add origin_ssh ssh_addr
git push origin_ssh master #将本地master分支,通过ssh,推送到远程库。
此时,将本地库—推送到远程时,不再需要输入密码!!
git图形化界面
Eclipse中的git
window—preferences—team—git