版本控制软件
简单操作
- 只需记住几组简单的终端命令,即可快速上手常见的版本控制软件
易于对比
- 基于版本控制软件提供的功能,能够方便地比较文件的变化细节,从而查找出导致问题的原因
易于回溯
- 可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态
不易丢失
- 被用户误删除的文件,可以轻松的恢复回来
协作方便
- 基于版本控制软件提供的分支功能,可以轻松实现多人协作开发时的代码合并操作
分类:
- 本地版本控制系统
- 集中化的版本控制系统(SVN)
- 分布式版本控制系统(主流Git)
Git之所以快速和高效,主要依赖于它的如下两个特性:
-
直接记录快照,而非差异比较
- SVN的差异比较:
存储的是一组基本文件和每个文件随时间逐步累积的差异(节省磁盘空间,但耗时效率低)。 - Git的记录快照:
是在原有文件版本的基础上重新生成一份新的文件,类似于备份。为了效率,如果文件没有修改,Git不再重新存储该文件。而只是保留一个链接指向之前存储的文件(空间换时间)。
- SVN的差异比较:
-
近乎所有操作都是本地执行
- 在Git绝大多数操作中都 只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。
- 断网后依旧可以在本地对项目进行版本管理
- 联网后,把本地修改的记录同步到云端服务器即可
Git的三个区域
- 工作区
- 暂存区(临时存放,等待提交)
- Git仓库
Git中的三种状态
- 已修改(modified)
- 文件已修改,但未将结果放到暂存区
- 已暂存(staged)
- 对已修改文件的当前版本做了标记,使之包含在下次提交的列表中
- 已提交(committed)
- 文件已安全保存在本地Git仓库中
基本的Git工作流程:
- 在工作区修改文件
- 将想要下次提交的更改进行暂存
- 提交更新,找到暂存文件,将快照永久性存储到Git仓库
配置用户信息
git config --global user.name 'dongzhiwei-rgb'
git config --global user.email '2889723085@qq.com'
- 如果使用了 --global 选项,那么该命令只需要运行一次,即可永久生效
检查配置信息
<!-- 查看所有的全局配置项 -->
git config --list --global
<!-- 查看指定的全局配置 -->
git config user.name
git config user.email
获取帮助信息
<!-- 打开 git config 命令的帮助手册 -->
git help config
<!-- 获取 git config 命令的快速参考 -->
git config -h
Git基本操作
1. 获取Git仓库的两种方式
- 将尚未进行版本控制的本地目录转换未Git仓库
- 从其它服务器克隆一个已存在的Git仓库
以上两种方式能够在自己的电脑上得到一个可用的Git仓库
2. 在现有目录中初始化仓库
如果自己有一个尚未进行版本控制的项目目录,想要用Git来控制它,需要只需如下两步骤:
- 在项目目录中,通过鼠标右键打开“Git Bash”
- 执行 git init 命令将当前目录转化为Git仓库
git init 命令会创建名为.git 的隐藏目录,这个.git 目录就是当前项目的Git仓库,里面包含了初始化的必要文件,这些文件是Git 仓库的必要组成部分。
3.工作区文件的4种状态
工作区中每个文件可能有 4种状态,这四种状态共分为 两大类:
一. 未被Git管理: 未跟踪(Untracked)
二. 已被Git管理: 未修改(Unmodified)、已修改(Modified)、已暂存(Staged)
Git操作的最终结果:让工作区中的文件都处于“未修改”的状态
4. 检查文件状态
可以使用 git status命令查看文件处于什么状态:
未跟踪的文件意味着 **Git在之前的快照(提交)中没有这些文件;**Git不会自动将之纳入跟踪范围,除非明确告诉它“我需要使用Git跟踪管理该文件”
5. 精简的方式显示文件状态
<!-- -s == --short -->
git status -s
<!-- ??表示未跟踪的文件 -->
6. 跟踪文件
git add 要跟踪的文件名
文件会在Changes to be committed这行下面,说明文件处于跟踪状态
以精简的方式显示文件的状态: 新添加到暂存区 中的文件前面有绿色的A标记
- 绿 色 的 A \color{#00FF00}{绿色的A} 绿色的A
7. 提交更新
暂存区文件 等待提交到Git 仓库中进行保存。可执行 git commit 命令进行提交,其中 -m 选项后面是本次的提交消息,对提交内容的描述
git commit -m "新建了index.html文件"
结果:工作区文件都处于未修改状态
8. 对已提交的文件进行修改
跟踪状态下,修改了工作区中文件以后,查看文件状态,该文件会出现在Changes not staged for commit这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区
- 红 色 M \color{red}{红色M} 红色M
9. 暂存已修改的文件
git add 命令,多功能命令,主要有如下3个功效:
- 可以用它开始跟踪新文件
- 把已跟踪的、且已修改的文件放到暂存区
- 把有冲突的文件标记为已解决状态
- 绿 色 M \color{#00FF00}{绿色M} 绿色M
10. 提交已暂存的文件
git commit -m "提交消息"
11. 撤销对文件的修改
把对工作区中对应文件的修改,还原成Git仓库中所保存的版本。
所有的修改会丢失,且无法恢复!
git checkout -- index.html
撤销操作的本质:用Git仓库中保存的文件,覆盖工作区中指定的文件
12. 取消(移除)已暂存文件
git reset HEAD 要移除的文件名称
13. 跳过使用暂存区域
Git标准的工作流程是 工作区->暂存区-> Git仓库。 可以将过程简化为 工作区->Git仓库
<!-- 加上 -a 选项,Git会自动把所有已跟踪过的文件暂存起来一并提交,跳过git add步骤 -->
git commit -a -m 描述信息
14. 移除文件
从Git仓库中移除文件的方式有两种:
- 从Git仓库和工作区中 同时移除 对应文件
git rm -f index.js
- 只从Git仓库中移除指定的文件,但保留工作区中对应的文件
git rm -cached index.css
- 绿 色 D \color{#00FF00}{绿色D} 绿色D 下次提交此文件将被从Git仓库删除, 红 色 ? ? \color{red}{红色??} 红色?? 则不再跟踪
忽略文件
有些文件无需纳入Git管理,也不希望它们总出现在未跟踪文件列表。创建 .gitignore 配置文件
文件规范:
- 以#开头的是注释
- 以/结尾的是目录
- 以/开头防止递归
- 以!开头表示取反
- 可以使用glob模式进行文件和文件夹的匹配(glob指简化了的正则表达式)
查看提交历史
<!-- 最近的排在最上面 -->
git log
<!-- 查看最近两条提交历史信息,并自定义输出格式 -->
git log -2 --pretty=format:"%h | %an | %ar |%s"
回退到指定版本
<!-- 在一行显示所有提交历史 -->
git log --prety=oneline
<!-- 使用 git resst --hard 命令,根据指定的提交ID回退到指定版本 -->
git reset --hard <CommitID>
<!-- 在旧版本中使用 以下命令,查看命令操作历史 -->
git reflog --pretty=oneline
<!-- 再次依据最新的提交ID,跳转到最新的版本 -->
git reset --hard <CommitID>
Github
开源协议
- BSD
- Apache
- GPL
- 具有传染性的一种开源协议,不允许修改后和衍生的代码作为闭源的商业软件发布和销售
- 使用 GPL的著名软件项目是:Linux
- LGPL
- MIT
- 是目前限制最少的协议,唯一条件:在修改后的代码或者发行包中,必须包含原作者的许可信息
- 使用MIT的软件项目有:jquery、Node.js
开源项目托管平台
- Github(全球最牛的开源项目托管平台,没有之一)
- Gitlab(对代码私有性支持较好,因此企业用户较多)
- Gitee(又叫作码云,是国产的开源项目托管平台。访问速度快、纯中文界面、使用友好)
这3个平台,只能托管以Git管理的项目源代码,因此,它们的名字都以Git开头
Github- 远程仓库的使用
1. 新建空白远程仓库
网站New repository
2. 远程仓库的两种访问方式
Github上的远程仓库,有两种访问方式,分别是HTTPS和SSH。他们的区别是:
- HTTPS:零配置;但是每次访问仓库时,需要重复输入Github的账号和密码才能访问成功;
- SSH:需要进行额外的配置;但是配置成功后,每次访问仓库时,不需要重复输入Github的账号和密码
- 在实际开发过程中,推荐使用SSH方式访问远程仓库
3. 基于HTTPS将本地仓库上传到Github
<!-- 1. 将本地仓库和远程仓库进行关联,并把远程仓库命名为origin -->
git remote add origin Github仓库https地址
<!-- 2. 将本地仓库中的内容推送到远程的origin仓库中 -->
git push -u origin master
4. SSH key
SSH key作用:实现本地仓库和Github之间免登录的加密数据传输。
SSH key好处:免登录身份认证、数据加密传输。
SSH key由两部分组成:
- id_rsa(私钥文件,存放于客户端的电脑中即可)
- id_rsa.pub(公钥文件,需要配置到Github中)
生成SSH key
- 打开Git Bash
- 粘贴如下命令,并填写注册邮箱:
ssh-keygen -t rsa -b 4096 -C"你的邮箱地址"
- 连续敲击3次回车,即可在 C:\Users\用户名文件夹.ssh 目录中生成 id_rsa 和 id_rsa.pub 两个文件
配置SSH key
- 使用记事本打开 id_rsa.pub 文件,复制里面的文本内容
- 在浏览器中登录Github,点击头像->Setting->SSH and GPG keys->New SSH key
- 将 id_rsa.pub 文件中的内容,粘贴到key对应的文本框中
- 在Title文本框中任意填写一个名称,来标识这个key从何而来
检测Github的SSH key是否配置成功
ssh -T git@github.com
基于SSH将本地仓库上传到Github
git remote add demo2 git@github.com:dongzhiwei-rgb/demo2.git
git branch -M master
git push -u demo2 master
远程仓库克隆到本地
git clone 远程仓库地址
分支
分支之间互不影响,合并到主分支
master主分支
Git默认创建,用来保存和记录整个项目已完成的功能代码,不直接修改
功能分支
专门用来开发新功能的分支,最后需要合并到master主分支(完成后删除)
查看分支列表
git branch
创建新分支
git branch 分支名称
切换分支
git checkout 分支名称
快速创建和切换
可以创建分支,并且立即切换到新分支
git checkout -b 分支名称
合并分支
完成测试开发后,将完成后的代码合并到master 主分支上:
# 1. 切换到master分支
git checkout master
# 2. 在 master 分支上运行 git merge 命令,将login分支的代码合并到master分支
git merge login
删除本地分支
# -D 强制删除
git branch -d 分支名称
遇到冲突时的合并
如果在两个不同分支中,对同一个文件进行了不同修改,Git就没法干净的合并它们。此时,我们需要打开这些包含冲突的文件然后手动解决冲突。
# 打开冲突文件,处理后再放到暂存区,标识冲突已解决
git add .
将本地分支推送到远程仓库
如果是 第一次 将本地分支推送到远程仓库需要运行如下命令:
# -u 表示把本地分支与远程分支进行关联,只在第一次推送的时候需要带 -u 参数
git push -u 远程仓库的别名 本地分支名称:远程分支名称
# 实际案例:
git push -u demo2 payment:pay
# 如果希望远程分支的名称和本地分支名称保持一致,可以对命令进行简化
git push -u demo2 login
查看远程仓库所有分支列表
git remote show 远程仓库名称
跟踪分支
从远处仓库中,把远程分支下载到本地仓库中:
# 从远程仓库中,把对应的远程分支下载到本地仓库,保持本地分支和远程分支名称相同
git checkout 远程分支的名称
# 示例:
git checkout login
# 从远程仓库中,把队友的远程分支下载到本地仓库,并把下载的本地分支进行重命名
git checkout -b 本地分支 远程仓库名称/远程分支名称
# 示例:
git checkout -b login2 demo2/login
拉取远程分支的最新的代码
# 从远程仓库,拉取当前分支的最新代码,保持当前分支的代码和远程分支代码一致
git pull
删除远程分支
# 删除远程仓库中,指定名称的远程分支
git push 远程仓库名 --delete 远程分支名
# 示例:
git push demo2 --delete login