分布式版本控制工具----git

版本控制

版本控制的功能

  1. 协同修改
    多人并行—修改服务器同一文件
  2. 数据备份
    保存文件的当前状态、历史状态
  3. 版本管理
    保存每一个版本信息时,不存重复的数据,节约内存
    git采用文件快照的方式,
    svn采用增量式
  4. 权限控制
    对团队中开发者进行权限控制,对团队外贡献的代码进行审核(git独有)
  5. 历史记录
    查看修改人、日志信息等;将本地文件恢复到某一历史版本
  6. 分支管理
    团队开发中,多条生产线同时推进,提高效率

版本控制分类

集中式:svn,各个版本存于服务器,易单点故障
分布式:git,能有效解决单点故障,C语言开发

git简介

git官网
由linus使用C编写

git优势

  1. 大部分操作----本地完成-----不需联网
  2. 保证完整性
  3. 尽可能添加数据,而不是删除、修改数据
  4. 分支操作,快捷流畅
  5. 与linux命令全面兼容

git安装

下载地址

  1. window
    下载,安装,use git from git bash
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    其他默认!!使用右键–git bash here

  2. linux
    参考地址
    安装当前linux版本的最新、稳定版的git

sudo apt-get install git #最新、稳定版
git --version #查看

git结构

在这里插入图片描述

代码托管中心

维护远程代码仓库

  1. 局域网
    GitLab服务器
  2. 外网
    GitHub,国外服务器,慢
    码云,国内服务器,快,可以微信登录

代码托管模式

  1. 团队内部
    在这里插入图片描述
  2. 跨团队
    在这里插入图片描述

git操作

  1. 初始化本地仓库
    进入项目目录,命令行执行git init,初始化一个本地仓库.git,内部的文件不能更改
  2. 设置签名
    用户名: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
    二者的优先级:就近原则
  3. 实际操作
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. 版本切换
    1)使用索引
    2)使用^,后退一步
    3)使用~,后退n步
#随意切换
git reflog
git reset --hard 复制的索引

#后退的切换
git reset --hard HEAD^ #后退一步
git reset --hard HEAD^^ #后退两步

#后退n步
git reset --hard HEAD~100 #后退100步
  1. hard、soft、mixed
#查看本地文档
git help reset

#reset的三个参数 index file[暂存区] working tree[工作区]
#reset --soft:仅在本地仓库移动HEAD指针
#reset --mixed:本地仓库移动指针;重置暂存区;
#reset --hard:本地仓库移动指针;重置暂存区;重置工作区
#hard使用较多
  1. 删除文件,并找回
    文件存在时的状态,需提交到本地库
#删除
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
  1. 比较文件
#比较工作区与暂存区
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算法

特点

  1. hash算法固定,输出加密结果长度固定(不管输入多少数据)
  2. hash算法固定,输入内容不变,加密结果不变
  3. hash算法固定,输入数据变化,加密结果也变化,且通常变化很大
  4. hash算法不可逆

git底层采用SHA-1,来校验文件
服务端的文件,计算一次hash值,下载到本地的文件计算一次hash值,对比两个值,一致则文件没有损坏。

git文件管理机制

在这里插入图片描述
不同版本对应多个文件(以一个文件为例)
初始化本地仓库,创建一个master分支(指针),此时HEAD指向master
创建分支,创建一个指针,可以指向所有文件的不同版本,即版本切换。
看起来像是复制了master分支
切换分支时,HEAD指向该分支指针。
在这里插入图片描述
切换不同的分支,只是HEAD指针的移动。

github

  1. 使用邮箱注册账号
  2. 更改头像:右上角账户下三角—your profile----点击头像
  3. 创建本地库
# 创建项目,并在目录下
#初始化本地库
git init
#签名
git config user.name lauf
git config user.email xxx@mail.com

#编辑项目,并提交到本地库
  1. 创建远程库
    登录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—生成----复制保存(后续看不到了)

  1. 猪队友克隆操作
#创建一个文件夹,并进入
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.

解决!!

  1. 将猪队友的github账户加入团队
    远程仓库管理账户-----登录github----settings----manage access
    在这里插入图片描述
    输入队友的github账号名字
    复制邀请链接-----发送队友----队友登录github----访问该链接----接受邀请—队友可以使用自己的github账号git push

  2. 拉取修改的内容

git fetch origin master  #将远程库拉取到本地库,并不修改工作区
#可以查看本地内容,并没有变化
#切换远程master分支
git checkout origin/master

#合并到本地
git merge origin master

#pull =  fetch + merge
#当修改的内容不多时,可以使用pull
git pull origin master
  1. 团队冲突解决
    若两个人同时改一个文件的同一个位置,A先提交本地并push到远程库;B再提交本地并push到远程会报错!
    解决:
    B先pull,然后解决冲突(删除特殊符号),git add xxx----git commit -m ‘xxxxx’----git push origin master
    注意:若修改不是基于github远程库的最新版,则需要pull,有冲突则解决。

A/B各有一个github账号

  1. 跨团队协作
    在这里插入图片描述
  1. 复制团队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
  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值