1.版本控制
- 简而言之,备份与记录
- 作用:
2.1 记录文件的所有历史变化 2.2 错误恢复到某个历史版本 2.3 多人协作开发编辑同一个文件
-
本地版本控制系统 -
集中化的版本控制系统
典型代表——SVN -
分布式版本控制系统
典型代表——GIT
2.Windows安装Git
2.1 下载安装
镜像下载Git网站:https://npm.taobao.org/mirrors/git-for-windows/ 下载最新版本即可
安装很简单,不再赘述安装过程
- 安装好之后,鼠标右键可看到
GUI很少用,一般使用命令窗口Bash - 配置用户信息(必须配置)
git config --global user.name "自定义名字" #配置用户名字
git config --global user.emain "你使用的邮箱" #配置用户邮箱
git config --global --list #查看当前用户(global)配置
配置环境变量:为了能全局使用,可以不配置
但使用idea,如果报错:idea file not found: git.exe 或 ‘git’ 不是内部或外部命令,也不是可运行的程序,时,就需要配置
3.Git文件的三种状态与工作模式
状态 | 描述 |
---|
已提交(committed) | 表示数据已经安全的保存在本地数据库 | 已修改(modified) | 表示修改了文件,但还没保存到数据库中 | 已暂存(staged) | 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中 |
本地工作区:
工作区域 | 描述 |
---|
工作区 | 简单的理解为在电脑里能看到的目录,比如自己创建的本地项目目录 | 暂存区 | Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git自动创建的第一个分支master,以及指向master的一个指针叫HEAD | Git仓库 | 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库 |
4.本地版本库初始化与文件提交
4.1 完整工作区域
工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory),如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。
4.2 文件提交
- 随便找个文件夹,鼠标右键调出Git命令窗口
git init 创建一个.git文件夹- 查看设置,才能看到.git文件
- 新建一个.txt文件,并将它加载到暂存区
git status #查看当前文件夹文件状态
git add test.txt #将test.txt加载到缓存区
git add . #将所有文件加载到缓存区
- 提交文件到Git仓库
git commit test.txt -m "自己写描述" #提交文件到Git仓库
git ls-files #查看仓库的文件列表
5.版本切换
5.1 文件修改与比对
- 修改之前提交的文件,
git status 查看状态 - 重新上传到暂存区,
git add . ,查看状态 - 上传到本地仓库,
git commit -m "修改第一次后提交" ,查看状态 - 查看提交日志记录,
git log - 与版本库内容进行比较,
git diff HEAD -- test.txt 查看暂存区的文件
差异比较说明: --- :表示变动前的文件 +++ :表示变动后的文件 变动的位置用两个@作为起首和结束 @@ -1,2 +1,3 @@:- 表示第一个文件, 1 表示第1行,2 表示连续两行, + 表示变动后的文件,1 表示第一行, 3 表示连续三行。
注意:当没有任何输出的时候(即提交之后),表示此文件与版本库中的文件一样,未发生任何变动
5.2 文件版本切换
当提交记录过多的时候,使用git log ,略显臃肿,可用--pretty=oneline 简化输出:每次提交记录只显示一行
回退到上一版本:git reset --hard HEAD^ ,上两个版本用^^ 回到上n个版本:git reset --hard HEAD~100 ,回到前多个版本 回到指定版本位置,git reset --hard 版本hash值(5~8个字符) 查看当前用户最近操作日志记录,git reflog ,可用于查找所有版本的hash值
5.3 文件删除
-
当文件(已提交到git库的文件)被误删之后,使用git checkout 从版本库中检出 注意:可使用git status 追踪文件状态
如:我将已提交的test.txt文件误删后的恢复流程 -
当确认要删除某个文件后,使用git rm 文件名
6.远程仓库github
下载方式:
- zip压缩包
- git:ssh、https
复制地址,选择一个本地目录打开Git Bash,git clone 地址 克隆到本地
注意:ssh比https编程效率高、也更安全。
国内登陆github需要一些加速器辅助才行
6.1 创建ssh公钥
- 本地生成ssh公钥和私钥,
ssh-keygen -t rsa -C "github账户邮箱" 一直回车就行 - 将公钥上传到github
- 验证是否配置成功,
ssh -T git@github.com
6.2 远程推送
- 创建一个远程仓库
- 本地上传文件
找到本地需要上传的文件的目录,右键Git Bash 刷新一下网页 推送成功
6.3 删除文件
由上图可知,之前在本地git仓库删除掉的test.txt仍然推送到了github,接下来演示如何删除它
- 先提交一次
- 再推送一次
总结:先在本地执行git rm 删除操作,然后提交,再推送一次,就OK了
7.Git本地分支操作
多人合作的项目在开发时通常不会直接在主干master上进行操作,而是重新开辟新的分支,在新的分支上进行开发 调试 等操作,当项目调试通过时才会将分支项目的代码合并到主干中。
7.1 分支指令
Git对于分支操作提供了以下基本的命令:
命令 | 说明 |
---|
git checkout branch | 切换到指定分支 | git checkout -b new_branch | 新建分支并切换到新建分支 | git branch -d branch | 删除指定分支 | git branch | 查看所有分支,并且*号标记当前所在分支 | git merge branch | 合并分支 | git branch -m | -M oldbranch newbranch | 重命名分支,如果newbranch名字分支已存在,则需要使用-M强制重命名,否则使用-m重命名 |
7.2 具体操作
分支的列表展示与切换 新建一个文本,并合并 分支命名 分支删除
注意:主干不能删
7.3 分支推送与拉取
- 相关指令
命令 | 说明 |
---|
git branch -a | 查看本地与远程分支 | git push origin branch_name | 推送本地分支到远程 | git push origin :remote_branch | 删除远程分支(本地分支保留) | git checkout -b local_branch origin/remote_branch | 拉取远程指定分支并在本地创建分支 |
- 操作演示——本地分支推送到远程
分支推送成功: - 操作演示——远程创建dev拉取到本地
因为github没有提供创建分支的按钮,所以先本地创建一个dev分支,推送到github之后并删除其本地分支git branch -D dev ,再演示远程拉取dev到本地。 将文件克隆到本地
7.3 本地分支冲突出现与解决
冲突演示 查看两个分支共同拥有的文件,并选取一个 查看分支中文件的内容cat test1_0.txt ,我这里是因为cat显示乱码,临时添加编码方式查看cat test1_0.txt | iconv -f GBK -t UTF-8 修改文件内容 修改之后提交 切换到main分支,并查看修改test1_0.txt的内容, 修改之后提交 合并dev,发生冲突 修改文件内容,删去===,<<,>>后提交
7.4 多人协同操作冲突
多人协同操作冲突比较常见
冲突演示 拉取远程仓库dev并在本地创建dev开发库,执 行命令git checkout -b dev origin/dev ,以同台电脑不同的窗口来模拟两个用户操作同一分支同一文件
-
克隆到桌面,并到克隆文件中打开控制git命令行拉取远端分支dev -
另找一个目录,进行相同操作 -
修改文件内容 并提交 两个端口都做推送 可看出,后推送的报错,远程拒绝推送。
防范措施 在执行git push 操作之前,先执行git pull 操作,保持本地和远端内容一致,再添加新的内容,然后再提交。
8.标签管理
通常,发布一个版本时,会在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
标签操作基本命令
命令 | 说明 |
---|
git tag tag_name | 新建标签,默认为HEAD | git tag -a tag_name -m ‘xxx’ | 添加标签并指定标签描述信息 | git tag | 查看所有标签 | git tag -d tag_name | 删除一个本地标签 | git push origin tag_name | 推送本地标签到远程 | git push origin --tags | 推送全部未推送过的本地标签到远程 | git push origin :refs/tags/tag_name | 删除一个远程标签 |
9.知识点小结
|