代码更新步骤:
git clone https://nas.zzj.wiki:3000/suxinghua/HS-PIMP.git
替换需要更新的代码(复制粘贴最新代码)
git status
git init
git status
git add . //加入git的index
git status //查看修改文件
git commit -m ‘提交内容的注释’ //提交到本地git库
git pull --rebase //从服务器上拉取最新的代码
git push origin //将本地代码上传到服务器
/
git remote add origin https://…git
git push -u origin master
ls --》查看当前目录所有文件名
cd .. --》返回上一级目录
cd F: --》进入F盘
cd 文件夹名Git --》进入F盘的名为Git的文件夹
tab键--》补全文件名
什么是git?Git is a free and open source distributed version control system。
git是一个免费并且开源的分布式版本控制系统。
官网:https://git-scm.com/
版本控制系统
- 保留文件所有的修改历史记录,可以方便地撤销之前对文件的修改操作。
安装 官网:https://git-scm.com/
window - 下载安装有一堆的选项。
mac - 下载无选项,直接安装,可以通过命令行进行操作。
简单的命令 - 入门运用
git init - 初始化创建仓库
· 会创建出一个隐藏的.git文件夹,所有的操作历史将存入这里
git status - 查看当前仓库所在目录的文件状态
· Untracked 未追踪的
git add filename - 使文件加入追踪
git commit - 提交(并且附带:对此次操作的描述信息)
git log - 查看提交记录
git add 到底做了些什么?
git add 在之前我们讲过是添加一个文件,让git对它进行追踪,那为什么追踪之后,我们再次提交的时候,还是需要commit?这就涉及到,我们的add到底做了什么。
文件的三种状态:已修改 、 已暂存、已提交
三个工作区域:工作目录 、 暂存区域 、 Git仓库
Git工作流程:
1. 在工作目录中修改文件
2. 暂存文件
3. 提交更新,找到暂存区文件
扩展命令新功能:
当你需要添加到暂存的文件过多的时候
git add . - 添加所有改动文件及未追踪的文件
每次进入vim模式输入描述很麻烦?
git commit -m ‘描述’ - 合并提交和描述,一步完成操作
每次都要输入add命令好麻烦?
git commit -a -m ‘描述’ - 从工作目录提交到暂存区后,直接提交
中文乱码:
1.文件名乱码
git config --global core.quotepath false
2.编辑描述乱码
- 进入setting
- 找到 environment
- 添加:set LANG=zh_CN.UTF-8
入门操作第二步:删除文件
1. 命令行删除
- git rm <file> - 删除git区域中记录的文件,并且不保留在工作目录中
- git rm -f(force) <file> - 强制删除
2. 手动删除工作目录中的文件
- git rm <file>
3. 删除Git仓库中的,保留工作目录中的文件
- git rm --cache <file>
入门操作第二步:移动文件
移动文件的妙用
1.重命名
2.移动文件
git mv file_from file_to
以上命令相当于以下三条
mv file_from file_to
git rm file_from
git add file_to
查看功能up up!
git status 打印文件状态(未追踪、已修改、已暂存)
git status -s = git status --short 简化文件状态打印内容
git diff - 查看当前文件的修改(主要看工作区文件)
git diff --<> 查看暂存区和提交区域之间的差异
–staged
git log - 查看日志
git log -p 查看详细信息
git log -2 查看最近的n条信息
git log --stat 列出所有被修改的文件,以及简略的统计信息
git log --pretty 设置打印内容的格式
- oneline 哈希和描述
- short 哈希、作者、描述
- full 哈希、作者、提交者、描述
- fuller 哈希、作者、日期、提交者、提交日期、描述
- format - 定制要显示的记录格式
** 此处的作者:实际修改的人
提交者:最后将此工作成果提交到仓库的人
format的常用选项
什么是HEAD?! 什么是master?!
提交对象:
Git 保存的并不是文件的变化或者差异,而是一系列的不同时刻的文件快照。
提交操作时Git会保存一个提交对象,该对象中包含一个指向暂存内容快照的指针、作者姓名、邮箱、父对象指针以及提交输入信息。
* 首次提交的对象没有父对象
* 普通的提交有一个父对象
* 多个分支合并的有多个父对象
什么是HEAD?! 什么是master?!
master分支:
Git 的分支本质上仅仅是指向提交对象的可变指针。
Git默认分支名:master,它会在每一次的提交中自动前移。
** Git的分支 master并不是一个特殊分支,它和其他的分支完全没有区别,之所以每个分支都是有master是git init命令默认创建,而大部分人又懒得去更改。
git进阶阶段
某天完成了项目的一次开发后,准备开始二次开发,但是如果直接在一次开发的基础上更改,我们的文件就是 1+2,管理起来相当不方便
分支的操作:
创建分支:git branch 分支名称
* 创建出来的分支,并不会改变我们当前所在的位置
切换分支:git checkout 分支名
* 将HEAD指向切换的分支
* 将工作目录恢复成当前分支的快照
简写命令:git checkout -b 分支名
HEAD:
HEAD是一个特殊指针,该指针指向当前所在分支
* HEAD是唯一的
查看命令:
git log --oneline --decorate 查看分支指向+哈希
git log --oneline --decorate --all --graph
查看命令的完美组合~包含了 所有分支的提交,以树形图形式展现
合并分支:
git merge 目标分支 - 将目标分支的内容合并到当前分支
快速前移
当master和branch没有形成分叉,依旧是处于一条路径线,当HEAD落后于所要合并的分支,将会形成快速前移
--no-ff 禁止快速前移(可以commit记录描述为合并操作)
分支冲突:
如何判断是否会引起冲突:
master 和 branch1 处于同一条commit路径上(直接级祖先关系)
master 和 branch1 直接进行合并,不会引起冲突
① 分析 master 和 branch1中的修改是否一致,如果一致合并将会成为一次空合并(因为内容完全一致,没有合并的需要)
② 如果不一致,是否修改的同一个文件内容,如果是,产生冲突
解决分支冲突:
① 手动解决冲突部分
② 解决完成后再次提交,会以这次提交内容为准
删除分支:
合并完成后,分支就没有任何的后期用途了,这时候我们需要手动删除分支,以防止自己词穷的时候出现重复命名分支的情况。
git branch -d 分支名称
如果你的分支,从未合并:git branch -D 分支名称
* HEAD所指向的分支,无法删除
取消合并:
git merge --abort
撤销大集合:
撤销上一次提交信息
git commit --amend
1. 修改提交信息
2. 修正紧挨着的一次的提交与本次提交合并
取消暂存
git reset HEAD
撤销对文件的修改
git checkout –
Reset的本质:
可以用来撤销commit,但实质行为上并不是撤销操作,而是移动HEAD并且带上所指向的分支,重置HEAD及分支
即在HEAD之后的提交,因为当前不在任何分支上,就不会出现在工作目录中,起到撤销效果。
** 该提交并未丢失,可以通过哈希找回。
查看历史提交记录:
git reflog
Reset的本质:
重置工作目录,丢失暂存:
git reset --hard (尽量避免使用)
保留工作目录,与原分支差异将放到暂存区
git reset --soft
保留工作目录,并且清空暂存区
git reset --mixed(默认)
checkout的本质:
签出指定commit,只会改变HEAD指向,并不会影响分支指向
存储:
当在一个分支中向暂存区添加内容,切换到另一个分支时,提交commit会带上另一分支中的暂存内容。
git stash 存储暂存区及工作目录修改文件
git stash -u 在上面的基础上带上未追踪文件
git stash list 打印所有存储内容
git stash apply <stashName> 将存储内容重新应用(默认不保留已暂存内容)
git stash apply --index 将原暂存依旧以暂存进行取出
git stash drop 移除存储
rebase变基 :
和merge同样都是进行合并操作的。
将一个分支的内容都移至另一个分支上
工作流程:
1. 首先找到两个分支的共同祖先
2. 然后对比当前分支与祖先的历次提交,进行提取相应修改,并保存为临时文件,将当前分支指向目标基底,最后将之前存为临时文件的修改依序应用
别名
有时候觉得常用的命令字母多了点,例如:
git checkout
我们输入的时候,会花费很长的时间,那不如给它取个别名吧~
git config --global alias.co checkout
** 不是任何东西都可以取别名的,还需要熟悉命名规则,建议可以观看下命令行相关的视频:
https://study.miaov.com/study/show/chapter/504
多人合作模式
以防万一,我们把本地的仓库不小心删除,所以我们需要一个可以备份的地方,这个地方可以是我们的网盘,也可以是u盘,或者是类似于我们今天要用到的github。
但是u盘或网盘这类的存储方式虽然可以保存备份,却不能适用于多人的开发,如果我们想要多人的开发,就需要有一个中央仓库,可以给团队开发中的每个人下载并且使用。
中央仓库:存储每个成员的提交对象,共享提交对象给每个成员。
分布式版本控制系统:
分布在每个成员的电脑上,都有一个本地仓库,任何一个电脑的本地仓库不小心丢失,都可以从成员处找回,或者可以从中央仓库进行下载共享,保存历史纪录的任务分配到了每个开发成员的身上,中央仓库只需要整合共享。
github:https://github.com/
需要注册账号
tag标签
我们经常看到下载的软件分为“xx版本”,这个“xx版本”其实就是我们说的标签,该标签指向一个commit对象,虽然我们也可以用这个commit对象进行版本的表述,但是由于哈希太长,并且没有规律,所以我们使用标签的方式,进行版本标注。
设置标签
git tag v1.0 (默认在最新的commit提交上)
查看标签
git tag
给指定commit添加标签:
git tag v0.1 1094adb
tag标签
添加带有说明的标签:
git tag -a v0.1 -m “描述信息” 1094adb
删除标签:
git tag -d v1.0
远程仓库
创建远程仓库,仓库的名称默认origin,origin中有单独的master和HEAD指针,和本地仓库的HEAD或master并非一致。
git push 提交远程仓库
git clone 克隆项目到本地
git pull 拉取
配置忽略文件
我们会发现,有些时候我就是不希望git管理文件夹中的某个文件,每一次查看状态总是告诉我未追踪,很麻烦~
.gitignore 文件,列出忽略文本模式
远程仓库的操作
远程仓库克隆分支:
git checkout -b branch1 origin/branch1
** 拉取下来的分支默认是master
删除远程仓库分支:
git push origin :branch
推送标签到远程仓库:
git push origin v1.0
git push origin --tags
删除远程仓库的标签:
git push origin :refs/tags/v1.0
使用SSH密钥
① ssh-keygen -t rsa -C “zmouse@miaov.com”
生成ssh密钥
② 在github上找到settings,设置SSH
③ 将生成的文件填到对应的位置(生成的信息给到仓库的管理者)
课堂主题
- git概念及git的作用
- git工作流
- 分支操作
- 解决冲突
- 标签操作
- 协同工作
知识点
- git工作流
- 分支操作
- 解决冲突
- 标签操作
- 协同工作
什么是版本控制?
版本控制是指对软件开发过程中各种程序代码、说明文档等文件的变更进行管理,它将追踪文件变化,记录文件的变更时间、变更内容、甚至变更执行人进行记录,同时对每一个阶段性变更(不仅仅只是一个文件的变化)添加版本编号,方便将来进行查阅特定阶段的变更信息,甚至是回滚。
什么是 Git?
-
人工版本控制器
通过人工的复制行为来保存项目的不同阶段的内容,添加适当的一些描述文字加以区分。
Git:中文意思傻子;是linux编写的 ;是git和linux操作系统之父;
-
版本控制工具
通过程序完成上述人工版本控制行为
-
方便且功能强大
-
只记录不同版本之间变化的部分
-
常见版本控制工具
- CVS
- SVN
- Git
怎么工作的?
首先,我们得先了解两个重要概念
- 状态
- 区域
git 文件生命周期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZDQ7PsW-1639554433606)(.\assets\lifecycle.png)]
状态
同时,git 又提供了三种(也可以说是四种)不同的记录状态
- 已修改(modified)
- 已暂存(staged)
- 已提交(committed)
有一个特殊的状态
- 未追踪(Untracked)
区域
git 提供了三个不同的工作区,用来存放不同的内容
- 工作目录
- 暂存区域
- Git 仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N0j3CUtw-1639554433607)(.\assets\areas.png)]
安装
- 下载安装:https://git-scm.com/
- 安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
brew install git
配置
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改
git config user.name "你的姓名"
git config user.email "你的邮箱"
– global
通过 --global
选项可以设置全局配置信息
git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"
检查配置
# 打印所有config
git config --list
# 打印指定config
git config user.name
创建仓库 - repository
进入希望纳入 git 版本控制的项目目录,使用 git init
初始化
git init
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这个目录也是上面我们说的三个区域之一,这个目录也是 Git 保存数据记录的地方,非常重要,如非必要,不要轻易改动
工作流与基本操作
当一个项目被 Git 初始化以后,只是表示我们希望通过 Git 来管理当前的这个项目文件的不同时期版本记录,但是这个时候项目中已存在的文件,或者以后新增的文件都是没有进入版本控制管理的,它们是 未追踪(Untracked)
的状态
查看工作区的文件状态
git status
git status
查看工作区中的文件状态
乱码
git status 显示乱码
git config --global core.quotepath false
终端乱码
菜单 -> 设置 -> 文本 -> 本地 / 编码
添加工作区文件到暂存区
git add
git add 1.txt
# 添加多个文件
git add 2.txt 3.txt
# 添加整个目录
git add ./a
# 添加多个目录
git add ./b ./c
# 添加所有文件
git add .
创建版本
git commit
将暂存区里的改动给提交到本地 git 仓库,也就是为这次工作(一般会把某个具有特定意义的工作作为一个版本,它可以是多个文件的变化)
- 每次提交同时会生成一个 40 位的哈希值,作为该次提交版本的唯一 id
提交备注
每次提交都需要填写备注信息
git commit
# 会调用默认(或自定义)的文本编辑器
修改默认编辑器
git config core.editor notepad
# 添加 vscode 编辑器 - mac
# 通过 vim 打开环境变量配置文件
vim ~/.bash_profile
# 添加环境变量
export PATH=/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin:$PATH
# 保存退出
source ~/.bash_profile
# 测试:在终端中直接通过命令 code 调用 vscode
git config --global core.editor "code --wait"
单行备注
git commit -m 备注信息
查看提交日志
git log
// 完整格式
git log
// 简要格式(单行)
git log --oneline
git reflog
// 查看所有历史提交(包括已删除的)
修复提交
git commit --amend
修复(替换上一次)提交,在不增加一个新的提交版本的情况下将新修改的代码追加到前一次的提交中
git commit --amend -m 提交
删除
git rm
# 从 git 仓库与工作区中删除指定文件
git rm 文件
# 只删除 git 仓库中的文件
git rm --cached 文件
# rm 以后,需要 commit 这次操作,否则 rm 将保留在暂存区
git commit -m 修正
撤销重置
git reset
从暂存区中撤销到工作区
// 从暂存区中撤销一个指定文件
git reset HEAD 文件名称
// 从暂存区中国年撤销所有文件
git reset HEAD .
该命令既可以用于回退版本
# 回退到指定的 commitID 版本
git reset --hard commitID
比较
# 比较 工作区和暂存区
git diff 文件
# 比较 暂存区和仓库
git diff --cached [commitId] 文件
# 比较 工作区和仓库
git diff commitId filename
# 比较 仓库不同版本
git diff commitId1 commitId2
分支
我们的开发就像是游戏的任务,默认是在主线(master)上进行开发的。许多时候,还有各种支线任务,git 支持我们创建分支来进行项目开发
查看分支
git branch
创建分支
git branch 分支名称
切换分支
git checkout 分支名称
# 也可以使用 checkout -b 来新建分支
git checkout -b 分支名称
分支合并
# B 合并到 A,需要切换到 A 分支
git merge 被合并分支
# 查看已经合并的分支
git branch --merged
# 查看未合并的分支
git branch --no-merged
删除分支
# 如果分支为未合并状态,则不允许删除
git branch -d 分支名称
# 强制删除
git branch -D 分支名称
合并冲突
有的时候,不同的分支可能会对同一个文件内容和位置上进行操作,这样在合并的过程中就会产生冲突
- 查看冲突文件
- 修复冲突内容
- 提交
标签
有的时候,我们希望给某一个特定的历史提交打上一些标签
新建 tag
git tag -a v1.0.0 HEAD/commitId
查看 tag
git tag
协同开发
以上所有的操作都是建立在本地的,如果我们希望进行团队协同开发,那么这个时候,我们就需要把 git 仓库信息与团队中的所有人进行共享
- 分布式 - 中心化与去中心化
github
首先注册一个账号
使用 ssh 链接
SSH
https://help.github.com/cn/articles/connecting-to-github-with-ssh
https://help.github.com/cn/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
生成 SSH 秘钥
ssh-keygen -t rsa -C "zmouse@miaov.com"
添加代理
使用 ssh-add
代理,如果没有启动,可以手动启动
eval $(ssh-agent -s)
添加 私钥
ssh-add 私钥路径
或者修改 ~/.ssh/config 配置多个Host
在 github 上添加公钥
个人中心 -> 设置 -> ssh -> 添加
测试
ssh -T git@github.com
git 远程
链接
git remote add origin git@github.com:miaov-zmouse/kkb-test.git
提交(同步)远程
同步本地仓库到远程
git push -u origin master
# -u 简化后续操作
git push origin master
远程分支
# 提交到远程(分支)
git push origin [本地分支名称]:[远程分支名称]
# 远程先创建好分支然后拉取到本地
git checkout -b [本地分支名称] origin/[远程分支名称]
# 拉取远程分支到本地
git pull origin [远程分支名称]:[本地分支名称]
# 查看远程仓库
git remote show origin
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
# 删除本地分支
git branch -d [本地分支名称]
# 删除远程分支
git push origin --delete [远程分支名称]
# or
git push origin :[远程分支名称]
# 设置默认提交分支
git branch --set-upstream-to=origin/[远程分支名称] [本地分支名称]
总结:
- git概念及git的作用
- git工作流
- 分支操作
- 解决冲突
- 标签操作
- 协同工作