关于版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 在本书所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。Git 是基于差异(delta-based)的版本控制工具。
在 Git中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git 会为每个版本都创建一个快照。
Git 工作方式
基本的 Git 工作流程如下:
- 在工作区中修改文件。
- 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
- 提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
文件的三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
- 已修改表示修改了文件,但还没保存到数据库中。
- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- 已提交表示数据已经安全地保存在本地数据库中。
结合文件的三种状态,与之对应的有三个位置:工作区(workspace)、暂存区(index)、Git仓库(repository);
- 工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
- 暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。
- Git仓库是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
Git 工作三个阶段:
Git 文件状态变更:
Git 安装
Windows 上安装:
- 从官网下载,地址;
- 执行安装程序,不更改默认选项,一路确认完成安装;
- 安装完成后查看 Git 版本,
git --version
;
Git 使用
配置信息
git config
命令用于查看或更改配置信息。安装完 Git 之后,要做的第一件事就是设置用户名和邮件地址。这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改。该配置项会被写入用户文件夹下的.gitconfig 文件中。
1 | $ git config --global user.name "username" # 设置用户名 |
创建仓库
Git 创建仓库一般分为两种方式:
- 在本地创建
git init
命令将创建一个名为 .git 的子目录(隐藏文件夹),这个子目录包括初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
1 | $ cd /path/to/myProject # 进入到项目文件夹下 |
- 从远程克隆
git clone
命令将从远程 Git 服务器上将项目下载到本地,形成一个本地的克隆仓库,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。命令会自动将其添加为远程仓库并默认以 “origin” 为简写。
1 | $ git clone https://github.com/User/Project.git # 使用http协议在当前文件夹下下载Project项目 |
修改提交
git status
命令用于查看项目中文件状态,待提交、已修改、未跟踪等。
1 | $ git status # 查看文件状态 |
git add
命令用于添加文件到缓冲区并跟踪文件,即监视文件变动。
1 | $ git add <file> # 添加跟踪文件到暂存区 |
git diff
命令用于查看文件更改前后之间的差异。
1 | $ git diff <file> # 比较工作目录中当前文件和暂存区域快照之间的差异; |
git commit
命令用于将缓冲区中的文件提交到本地仓库。
1 | $ git commit # 提交代码到本地仓库,默认使用 nano 编辑器,建议更改默认编辑器 |
git mv
命令用于重命名已跟踪的文件。
1 | $ git rm <fileA> <fileB> # 将文件fileA重命名为fileB |
git merge
命令用于合并分支,待补充。
远程操作
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。git remote
命令用于查看、配置远程信息。
1 | $ git remote # 用于显示远程配置信息,列出你指定的每一个远程服务器的简写,克隆仓库会显示origin,这是默认远程仓库的名称\ |
git fetch
命令用于从远程仓库获取数据,该命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作,后续需要手动合并代码。
1 | $ git fetch <remote> # 抓取指定远程仓库的代码,省略则抓取默认的 origin 远程仓库 |
git push
命令用于将本地仓库的代码推送到远程仓库。需要有写入权限,并且本地代码已经更新到和远程仓库同步。
1 | $ git push [remote] [branch] # 将代码推送到指定远程仓库的指定分支下,一般默认 origin 下的 master/main 主分支; |
git pull
操作用于从服务器拉取更新代码,并自动合并到本地。
1 | $ git pull # 相当于 git fetch + git merge 结合的操作 |
分支管理
git branch
命令用于查看、创建分支等操作。
1 | $ git branch # 查看工作区下的分支,并显示当前分支 |
git checkout
命令用于切换分支,切换分支体现在.git/HEAD文件中的指向;
1 | $ git checkout # 显示工作区、暂存区和远程仓库之间的差异 |
撤销删除
git reset
用于撤销操作。
1 | $ git reset HEAD <file> # 用于从暂存区取消暂存文件 |
git rm
命令用于删除 Git 项目中的文件。
1 | $ git rm <file> # 从暂存区中删除文件,同时永久删除文件,不能删除未提交到仓库中的文件 |
git restore
命令用于丢弃更改。
1 | $ git restore <file> # 忽略该文件的更改,退回到上次提交时的状态 |
提交历史
git log
命令用于查看提交历史。
1 | $ git log # 查看提交历史,包括哈希值、作者、日期、注释等信息; |
标签管理
git tag
命令用于为不同版本提交设置标签,待补充。
获取帮助
以下命令可以查看 Git 指令的描述,以及详细用法;打开的是本地的英文网页文档;
1 | $ git help <action> |
忽略文件
当项目中有一些缓存文件、日志文件、临时文件、测试文件等不需要跟踪的文件时,可以在项目根目录下新建一个.gitignore
文件,将不需要跟踪的文件添加进去,Git 会忽略到这些文件。
.gitignore
文件格式规范:
- 所有空行或者以 # 开头的行都会被 Git 忽略,注释。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
其中 glob 模式是指 shell 所使用的简化了的正则表达式。
- 星号(*)匹配零个或多个任意字符;
- [abc] 匹配任何一个列在方括号中的字符;
- 问号(?)只匹配一个任意字符;
- 如果在方括号中使用短划线分隔两个字符,表示匹配这两个字符范围内的字符;
- 使用两个星号(**)表示匹配任意中间目录;