【尚硅谷】Git与GitHub基础全套完整版教程(快速上手,一套搞定)_哔哩哔哩_bilibili
介绍
为什么需要版本控制?
单人开发有的时候,在开发过程中需要回退到之前的版本。好的版本管理可以大大提高开发效率。
多人开发的时候,不同人做修改 / 上传时间不统一,如果两个人同时上传,后者就会把前者的内容覆盖。普通文件服务器不能管理文件内容。
版本控制工具特性
版本控制是一种思想,版本控制工具(如 SVN、git)是对其实现。
集中式版本控制工具:如 SVN,开发人员都是客户端,而内容存储在服务器上,所有人和服务器交互。缺点在于服务器一挂,历史数据全部丢失,客户端上只能保存当前状态。(单点故障)
分布式版本控制工具:如 git ,开发人员在本地就能进行完整的版本控制。就算一个人的数据丢失了,依靠其他人的也能找回来,能有效避免单点故障。不过还是不建议本地库传数据,还是有一个远程库。
git其他优点:
- 大部分操作在本地进行,不需要联网
- 完整性保证(哈希算法,之后介绍)
- 尽可能添加数据,而不是删除或修改数据
- 分支操作快捷流畅
- 与 Linux 命令全面兼容
版本控制工具应该具有的功能?
- 协同修改:多个人并行不悖地修改同一份文件。
- 数据备份:保存历史版本。
- 版本管理:各个版本之间肯定有重叠的部分,这一部分不要重复保存。对此,SVN 采用增量式管理的方法(每次只保存修改的部分),git 采取的是文件系统快照的方法。
- 权限控制:不同人的权限不同。git 不仅支持权限控制,还可以对团队外开发者贡献的代码进行审核。
- 历史记录:查看修改人、时间、内容、日志等,还可以把本地文件恢复到之前的状态。
- 分支管理:允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。
Git 结构
Git 和代码托管中心
代码托管中心可以帮我们维护远程库
局域网内:Gitlab
外网:Github,Gitee
开发者通过 push 把代码推送到远程库。其他开发者要先 clone 把代码克隆下来,然后加入团队,然后才能把自己做的修改 push 推送到远程库。再通过 pull 把其他人的操作拉取下来。
如果需要项目成员之外的人修改代码:那个人先通过 fork 克隆一个自己的远程库,然后自己对自己的远程库做 clone、push 等操作,修改完成之后向项目开发者发送 pull request 请求,开发者审核同意后 merge 合并代码。
常用命令行操作
本地库初始化
git 的专属命令都是以 git 打头的。
在文件夹中右键 – git bash here 启动 git 命令行。
命令 | 作用 |
---|---|
ll | 当前目录下的资源 |
ls -lA | 带隐藏资源 |
ls -l|less | 分频查看 |
pwd | 当前位置路径 |
mkdir 目录名 | 新建目录 |
git init | 初始化当前目录(并创建 .git 文件夹) |
.git 里存放的是本地库相关的子目录和文件,不要删除和随便修改!!
设置签名
需要设置用户名和 email 地址,唯一用处就是标识开发者身份。
登录代码托管中心的账号密码(如 github、gitee)和签名的用户名、email 地址没有任何关系。
项目/仓库级别:只对当前本地库范围内有效。
系统用户级别:对当前系统的登录账号(lenovo)有效。
同时存在的话,项目/仓库级别优先级更高。但是二者必须至少有一个。
git config user.name Jingqing //项目级别
git config user.email Jingqing@163.com //项目级别
git config --global user.name Jingqing //系统用户级别
git config --global user.email Jingqing@163.com //系统用户级别
项目级别的签名:在项目文件夹下输入 cat .git/config
,会发现在签名就保存在 .git 文件夹的 config 目录下。
项目级别的签名:cat ~/.gitconfig
跳转到家目录查看。
开发时如果不是特殊需求,一般一个系统级别签名即可。
查看状态
git status 查看工作区、暂存区状态
no commit yet:指本地库里没有内容,因为 commit 之后是会放到本地库里的。
nothing to commit:暂存区没有内容可以提交。
changes to be committed:暂存区有内容等待提交。
提交文件
//vim 新建文件
vim good.txt
//然后输入文本文档内容,按 esc 后按两次大写 Z 保存退出。
git add good.txt
//这里提示:warning, 行末的 LF 会被替换为 CRLF,这和安装时 git 的配置有关,影响不大
git rm --cached good.txt
//撤回暂存区的内容
git commit good.txt
//提交文件,然后会提示:请输入提交的信息备注,并且显示一个 vim 编辑器
//输入注释信息后按 esc 输入 冒号+wq 退出
//但是其实这样才是更常见的用法
git commit -m "信息备注" good.txt
第一次提交会显示 root commit 根提交.
查看历史版本信息
git log
查看之前的版本信息。
其中可以看到 HEAD->master(或 main),HEAD 是指向当前版本的指针,之后修改版本其实就是移动这个指针。
如果最下面一行是冒号,说明记录多到一页装不下了。
多屏显示控制方式:空格向下翻页,b 向上翻页,q退出。
git log --pretty=oneline
以每次版本占一行的,漂亮的方式 显示版本信息。
git log --oneline
连哈希值也会缩短(被称为局部索引值)。只能查看之前的版本信息,版本回退后不能看到将来的版本。
git reflog
显示 commit 信息,以及从当前版本移动到这个版本需要多少步(如:HEAD@{1}表示差了一个版本,0表示这个版本就是当前版本)可以查看历史/未来版本。
版本前进 / 回退
本质就是移动 HEAD 指针。
方法1:首先通过 git log --oneline
找到要跳转的版本的哈希值
git reset --hard Fd83ed9 // 结尾是刚才获取的哈希值,即局部索引值
不管前进后退都是这种方法。
方法2:只能后退
git reset --hard HEAD^//回退一个版本。有几个异或符号,回退几个版本。
方法3:只能后退
git reset --hard HEAD~3//回退3个版本
这个 hard 什么意思?“硬的”。
soft:修改本地库的指针。修改后输入cat good.txt
查看本地库的文件,会发现文件已经变成修改版本后的文件了。
如果输入 git status
,会发现暂存区也被 modified 了。并不是因为暂存区变了,而是本地库指针移动了,和暂存区无法对应了。
mixed:修改本地库的指针,并重置暂存区(index)。
hard:修改本地库的指针,并重置暂存区和工作区(working tree)。
删除及找回删除文件
如果是删除并提交了删除操作之后:(不管是工作区还是暂存库,只要本地库里能找回就可以)
rm aaa.txt//删除文件
git add aaa.txt//添加删除操作
git commit -m "delete aaa.txt" aaa.txt//提交删除操作
git reflog//查看历代版本及其哈希值
git reset --hard abcdef//回退到有这个文件的版本
git checkout -- aaa.txt//另一种方法
如果是删除后把删除操作添加到暂存区后:git reset --hard HEAD
。
比较文件差异
//工作区未提交到暂存区:
git diff a.txt//比较该文件做的改动。红色行删除,绿色行新增/修改。
//工作区提交到暂存区后:上一种方法查不出差别。
git diff HEAD a.txt//比较本地库的版本
git diff HEAD^3 a.txt//比较本地库的当前版本和倒退三个版本的区别
不带文件名就是比较多个文件。