Git
git 中文 教程 git-scm.com/book/zh/v2
版本管理系统介绍
在做项目时,每一个功能写完以后, 为了方便查看都是单独保存成一个文件,但后期维护怎么办?
实际开发中,代码经常改来改去,修改后就无法找回之前的代码了。 程序员应该记录每次代码的变化,以便以后回到历史版本查看或直接使用
版本管理系统就是为了解决上述这些问题应运而生的
版本管理,是一种记录一个或若干文件内容变化,以便将来查阅特定版本修改情况的系统。
作用: 记录每次代码的变更,以便将来查阅特定版本的修改情况。 完成多人协作(必须配合远程仓库)
版本管理软件的分类 : 集中式(代表:SVN ) 分布式(代表:Git )
集中式版本管理
集中式版本管理软件的特点是,代码的版本集中到一个服务器上。
问题:如果没有网络或者服务器崩溃,将无法进行版本管理
集中式
- 必须要链接网络 才能保存代码记录
- 落后 少部分公司在用
- 软件代表 svn
分布式版本管理
分布式
- 随时随地都可以保存代码的记录
- 主流 必须会用
- 软件代表 Git
Git安装及配置
通过Git官网,即可下载到Git
Git官网,除了可以下载Git,还有完整的文档及入门教程
一直下一步安装即可。 如果你不想安装在C盘,则把路径中的C修改为D或者E即可。 安装成功后,桌面不会有任何图标, 在任何文件夹空白处,点击鼠标右键,看到多了两个右键菜单,表示安装成功
Mac系统,打开终端,输入 git --version 回车,看到Git版本号表示安装成功
必要配置
当我们使用Git记录代码的版本的时候,Git需要知道你是谁?也就是提交代码的人是谁?
Git要求,必须配置一个用户名和一个邮箱 - 重要
用户名,配置成自己名字的全拼(如 SuJiehao)
邮箱,最好配置成和你能收邮件的邮箱(如 megasu@qq.com)
具体操作
1、windows用户,在任何文件夹空白处,鼠标右键,打开 “Git Bash Here”; Mac用户打开终端窗口
2、在出现的终端窗口中,输入 git config --global user.name "xxx" ,回车执行该命令,用以配置用户名
3、在出现的终端窗口中,输入 git config --global user.email "xxx" ,回车执行该命令,用以配置邮箱
查看版本
git --version
首次使用 设置个人信息
- 用户名 xxx 要修改
git config --global user.name "用户名"
- 邮箱 xxx 修改为邮箱即可
git config --global user.email "xxx"
查看设置的信息是否正确
- 查看用户名
git config --global user.name
- 查看邮箱
git config --global user.email
初始化本地仓库
VsCode 初始化仓库
点击初始化仓库按钮,其实就是在当前文件夹根目录运行了 git init 进行仓库初始化
VsCode 查看 Git 状态
Git 常见文件标志
通过标志可以知道当前文件属于什么状态
U: 未跟踪的文件
A: 新增的文件
D: 删除的文件
M: 修改的文件
C: 文件内有冲突
GitLens 插件安装 - VsCode(掌握)
安装 GitLens 提高工作效率
出现以下弹窗时,点击<总是>按钮即可
点击了总是按钮:
git add . 总是自动完成
git commit -m 输入框的信息
Git内部实现,离不开它维护的三个区域
工作区(代码区) 暂存区 仓库
通过 VsCode 实现Git功能
确保你的代码已经提交过版本
打开 commits
找到我们想要回去的版本 鼠标右键
以上就是使用 VsCode 实现快捷的操作
在以前 使用的则是Git的原生操作
以下示例
初始化git仓库
git init
添加到暂存区
git add .
提交到本地仓库
git commit -m "完成了登录功能"
版本回退
查看所有版本信息
git reflog
通过终端 输入命令的方式 来切换版本
git reset --hard 版本号
基础命令(添加、提交、撤销)
初始化仓库
执行 git init 表示初始化一个本地仓库
一个项目,如果要使用Git对其进行管理,必须先初始化
初始化之后,会在项目文件夹中出现叫做 .git 的隐藏文件夹;有关git的全部记录都在它里面,不要轻易删除。
你的电脑中,肯定会有很多项目,所以,初始化的时候,必须要注意路径,注意路径是不是项目文件夹 绝对不能嵌套初始化
初始化,顾名思义,一个项目初始的时候,执行一次 git init 命令即可
当我们看到项目文件夹中,已经有 .git 文件夹了,说明已经初始化过了,就不要再初始化了
查看日志
查看日志的命令: git log (了解)
如果日志比较多,后面会出现 :
按 ↓ 键,可以查看剩余的日志
按 q 键,退出
命令选项
git log 命令后面,可以跟一些选项;
如同调用一个函数,传递一些参数一样
命令后跟不同的选项,得到的结果也不一样
git log --oneline (了解) 单行查看简略版日志
git log -n (了解)查看最近 n 次提交
git log --reflog (了解)可以查看到当前版本之后的日志
git log --reflog --oneline (了解)也可以这样配合使用
命令式皆为了解即可
将工作区的改动添加到暂存区:git add(了解)
git add . (了解)将工作区全部改动添加到暂存区
git add < file > (了解)指定文件添加到暂存区
将暂存区的文件提交到仓库:git commit -m (了解)提交日志
git commit -m (了解)提交日志 全部提交到本地仓库,形成一个版本
git commit < file > -m (了解)提交日志 指定文件提交到本地仓库,形成一个版本
提交日志,最好使用英文半角引号引起来;如果没有特殊字符,不加引号也可以
直接将工作区的改动提交到本地仓库
git commit -a -m (了解)提交日志
该命令对新增的文件无效
该命令会将工作区的改动更新到暂存区,同时提交到仓库
撤销,指的是将最后一次提交的内容撤销到暂存区、工作区;或者将刚刚暂存的内容撤销到工作区
最后一次提交的内容 暂存区:
git reset < file> 撤销指定的文件
git reset . 撤销全部文件
暂存区 工作区:
git checkout < file> 撤销指定的文件
git checkout . 撤销全部
最后一次提交的内容 暂存区/工作区(相当于重置) git reset --hard
该命令后不能指定文件
回到历史版本、或在历史版本中穿梭
git reset --hard 版本号
分支
分支介绍
首先说,其他版本管理软件,也有分支系统;但Git的分支系统及其强大,是Git的重要特色
分支就是当前项目的一个副本(可以理解为把当前项目复制了一份,可以这样理解,但要知道内部实现并非如此)。
初始化之后,Git默认创建了一个叫做 master 的分支,master分支也叫做主分支。
实际开发中,正规的公司,都不允许直接在master分支上开发。需要创建分支,在分支上开发,最后将代码合并回master。
分支相关-命令式(了解)
查看所有本地分支
git branch
创建新分支
git branch 分支名
比如,创建一个叫做 laoban 的分支
git branch laoban
切换分支
git checkout 分支名
比如,切换到 laoban 分支
git checkout laoban
比如,切换到master分支
git checkout master
删除分支(删除时,必须先切换到其他分支-了解)
git branch -d 分支名
git branch -D 分支名 强制删除分支,分支有代码更新,代码还没有合并就要删除,则需要强制删除
删除分支,必须先切换到另外的分支,然后再执行删除命令
创建并直接切换分支
git checkout -b 分支名
合并分支(重点)
git merge 分支名
分支合并,快进模式-了解
两个分支,如果一个分支包括另一个分支的全部版本,则合并的时候,属于快进模块合并
分支合并的冲突
千万不要“视冲突而不见”-重点
分支合并,三方合并-了解
三方合并模式中,如果两个分支更改了不同的文件,或同一个文件的不同位置,则合并时会出现如下弹框
这是告诉我们,合并成功了,但是,需要提交一次呀
提交,就得写提交日志呀
这个框,就是让我们写提交日志呢
画面中,黄色的 “Merge branch add”是默认的提交日志
如果使用默认的提交日志,则直接输入 “:q”即可完成合并
如果要修改提交日志,则按 “i”进入 “插入模式”
修改黄色的字(提交日志)
按 “esc”退出“插入模式”
输入 “:wq”退出,即可完成合并
三方合并模式中,如果两个分支更改了同一个文件的同一个位置,则合并时会出现如下画面
这是告诉我们,合并时产生了冲突 千万不要“视冲突而不见”
根据提示,找到有冲突的文件
根据自己的分析、或寻求另一个同事一起解决冲突 去掉代码中的分割线,保存代码
此时,还没有合并完哟。。。
执行 git add .
执行 git commit -m '提交日志' 完成分支的合并
工具的方式分支使用
让 master 分支来合并 dev分支
分支的删除
远程仓库
目前我们都是在本地进行版本管理
如果要发布项目或者进行多人协作,那么就需要一台公共的服务器
github 、码云 等提供免费的仓库托管服务
也就是,我们可以将本地仓库的代码推送到远程仓库永久保存
创建远程仓库
码云
右上角的 “+” ,选择新建仓库
填写仓库名,选择公开 或 私有
点击创建按钮,创建。
github(自行了解)
右上角的 “+” ,选择 “New repository”
填写仓库名称
点击创建按钮,创建。
初学,必须按照上述步骤创建;不要勾选其他选项
两种推送方式
推送本地仓库 到 远程仓库,有两种方式
https 方式
ssh 方式(推荐使用)
不同的方式,注意选择不同的 url,千万不可混淆
https方式推送(自行了解)
如果使用 https,无需配置,但每次使用都需要手动输入账号密码,较为麻烦
添加远程仓库地址到本地 git remote add origin https地址
首次推送 git push -u origin master
执行完后者,会弹出一个输入账号密码的框,填写 码云/github 的账号密码即可推送成功
正常的在这个仓库中 项目的开发
- 新建文件
- 修改文件
- 提交记录
开始推送本地仓库的代码到远程仓库上
拉取更新
A: 创建了项目初始化(v1)
B: 克隆远程仓库(v1)
A: 继续在仓库上添加功能 (v1->v2,v2->v3)
B:让本地仓库来拉取远程仓库上的最新的版本 拉取更新
git pull
第二种方式推送和使用远程仓库
- 用户先在本地电脑上进行初始化 git 仓库的操作
git init
- 正常添加文件 提交版本
git add .
git commit -m "init"
- 如果直接敲 命令
git push
提示出错 - 按照 码云的上的两行命令 复制来操作即可
- 当我们运行
git remote add origin https://gitee.com/ukSir/web04-75.git
- 最后运行
git push -u origin master
-u 意思如果这次我们推送成功了,下次 可以直接 执行 git push 不用写这么长一串
如果失败
出现git错误 error: failed to push some refs to 'github.com/... 的主要原因是远程库与本地库不一致造成的,在hint中也有提示把远程库同步到本地库就可以了。
发生问题时候的状态
执行 git pull -–rebase origin master 操作
执行 git pull -–rebase origin master 操作,
意为先取消commit记录,并且把它们临时保存为补丁(patch)(这些补丁放到”.git/rebase”目录中),之后同步远程库到本地,最后合并补丁到本地库之中。
最后把本地库push到远程库当中,使本地与远程仓库保持一致
解决办法
git pull --rebase origin master
该命令的意思是把远程库中的更新合并到(pull=fetch+merge)本地库中,–-rebase的作用是取消掉本地库中刚刚的commit,并把他们接到更新后的版本库之中
远程仓库和本地仓库产生关联
分支对分支
远程仓库的某个分支 - 本地仓库的某个分支
git clone 地址 克隆远程仓库中某个分支(master) 存在本地仓库 (master)
指定远程仓库的某个分支来克隆
git clone -b 分支名称 远程仓库地址
把本地仓库指定的分支 推送到远程仓库上
git push -u 远程仓库的地址(变量) 分支名称
多人协作
设置码云 SSH 推送和拉取代码
背景
一些电脑系统在使用码云的时候,没有自动记录密码功能,就可能会出现频繁要求添加账号和密码的问题。 这个时候可以通过设置 ssh 来解决。
什么是 ssh
SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现了设备之间的安全保障。传统远程登录或文件传输方式,例如 Telnet,FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这种方式已经慢慢不被人接受。SSH 协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。目前 SSH 协议已经被全世界广泛使用,大多数设备都支持 SSH 功能
本地生成 ssh 密钥
- 打开
git bash
输入以下命令
ssh-keygen -t ed25519 -C 你的邮箱
- 然后一直按下回车键 等待以下界面 表示生命密码成功
- 打开你的码云 点击 设置
- 选择 SSH 公钥
- 回到 git bash 输入以下命令 复制你的密钥
cat ~/.ssh/id_ed25519.pub
- 回到 网页中 粘贴到这里
- 以后,在你的项目中 使用远程仓库时,不能使用 https,要修改成 ssh
- 如果在已有的项目中 修改协议 可以输入
git remote set-url origin 新的协议