版本控制
一种记录一个或若干文件内容变化,以便将来查阅待定版本修改情况的系统。(VCS)
发展
本地版本控制系统
RCS: 在硬盘上保存补丁集(补丁是指文件修订前后的变化),通过应用所有的补丁。可以重新计算出各个版本的文件内容。
缺点:不同系统上的开发者无法协同工作
集中化的版本控制系统(CVCS)
CVS、Subversion、Perforce: 有一个单一的集中管理的服务器,保存所有文件的修订版本。协同工作的人们通过客户端连到服务器。取出最新的文件或者提交更新。
缺点: 中央服务器的单点故障。有丢失所有历史更新记录的风险。
分布式版本控制系统(DVCS)
Git、Mercurial、Bazaar、Darcs: 客户端不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。
导论
Git 和 Svn 的主要差别在于对待数据的方式。
其他版本控制工具存储的是每个文件与初代版本的差异,而 Git 存储项目随时间改变的快照。
Git 更像是把数据看作是对小型文件系统的一组快照。每当提交更新时,它主要是对当时的全部文件制作一个快照并保存这个快照的索引。如果文件没有修改,Git 不再重新存储,而是只保留一个链接指向之前存储的文件。
绝大数操作只需要访问本地文件和资源
因为本地磁盘上有项目的完整历史,不需要外连远程服务器。
保证完整性
Git 数据库中保存的信息都是以文件内容的哈希值(SHA-1)来索引,而不是文件名。因此在传送过程中丢失信息或者损坏文件都会被发现。
三种状态
- 已提交(committed):数据已经安全的保存在本地数据库中
- 已修改(modified):修改了文件,但还没保存到数据库中
- 已暂存(staged):对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
三个工作区域
- Git 仓库目录:Git 用来保存项目的元数据和对象数据库的地方(克隆代码时就是拷贝这里的数据)
- 工作目录:对项目的某个版本提取出来的内容(从仓库的压缩数据中提取出的文件,放在磁盘里以供使用或修改)
- 暂存区域:一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。
配置
Git 自带 git config 工具来帮助设置控制Git外观和行为的配置变量。这些变量存储在三个不同的位置。
- /etc/gitconfig 文件:系统上每一个用户及他们仓库的通用配置
// 读写配置
git config --system
- ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户
// 读写配置
git config --global
- .git/config:只针对该仓库
配置的变量会逐级覆盖(覆盖上一级别)
// 用户信息(针对项目的话去掉--global)
git config --global user.name 'jss'
git config --global user.email [email protected]
// 文本编辑器
git config --global core.editor emacs
// 检查配置信息
git config --list
// 检查某一项配置
git config user.name
// 获取帮助
git help
git --help
man git-
基础
获取 Git 仓库
- 在现有项目或目录下导入所有文件到 Git 中
// 初始化仓库,创建了一个.git的文件
git init
// 跟踪指定文件
git add *.c
git add LICENSE
// 提交
git commit -m '~'
- 克隆现有的仓库
// 支持多种数据传输协议
git clone (https:)(git:)(ssh传输)
克隆的是仓库服务器上的所有数据,包括每一个文件的每个版本。
使用 Git 时文件的生命周期
检查当前文件状态
使用 git status 命令
nothing to commit, working directory clean
// 所有已跟踪文件在上次提交后都未被更改过
Untracked files:~
nothing added to commit but untracked files present
// 当前目录下的未跟踪的文件
Changes not staged for commit
// 已跟踪文件的内容发生了变化,但还没有放到暂存区
Changes to be committed
// 文件已暂存待提交
如果在暂存区的文件又被修改了,那么文件会存在两种状态(后两种),两种状态对应的是不同的版本。
状态简览
git status -s || git status --short
?? a.txt // 未跟踪文件
A b.html // 新添加到暂存区的文件
M c.css // 文件被修改了并放入了暂存区
M d.js // 文件被修改了还没放入暂存区
MM e.jsx // 文件被修改并提交到暂存区后又在工作区中被修改了
忽略文件
创建.gitignore文件列出忽略的文件模式,使无用的文件不会出现在未跟踪文件列表。
GitHub上的.gitignore文件列表 https://github.com/github/gitignore
详细的格式规范可以参考
https://www.cnblogs.com/kevingrace/p/5690241.html
查看修改
git diff
通过文件补丁的格式显示具体哪些行发生了变化
git diff --cached || git diff --staged(版本限制)
查看已暂存的将要添加到下次提交的内容
跳过使用暂存区
git commit -a
自动把所有跟踪过的文件暂存起来一并提交
文件的删除、重命名
git rm (删除命令 —— 暂时不理解)
git mv file_form file_to
// 重命名相当于下面三条命令
mv file_from file_to
git rm
git add
查看提交历史
git log
// 显示每次提交的内容差异
git log -p
// 显示最近两次提交
git log -p -2
// 每次提交的简略的统计信息
git log --stat
// 指定使用不同于默认格式的方式展示
git log --pretty=oneline/short/full/fuller
git log --pretty=format:"%h - %an, %ar : %s"
// 查看最近两周的提交
git log --since=2.weeks
关于git log的常见选项、限制输出的选项和 git log --pretty=format的常用选项详情见git的官方文档。
撤销操作
git commit --amend -m '~'
修改最后一次提交的描述信息
// 在最后一次提交追加某个文件并且不改变描述信息
git add
git commit --amend --no-edit
git reset HEAD
取消暂存某个文件
git checkout --
撤销对某个文件的修改
查看远程仓库
// 列出制定的每一个远程服务器的简写
git remote
// 显示需要读写远程仓库使用的Git保存的简写与其对应的URL
git remote -v
// 添加一个新的远程Git仓库,同时制定一个简写
git remote add
// 拉取远程仓库中所有分支的引用,只是拉取数据,不会自动合并或修改当前工作
git fetch [remote-name] (branch-name)
// 从最初克隆的服务器上抓取数据并自动尝试合并到当前分支
git pull [remote-name] (branch-name)
// 推送提交到远程仓库
git push [remote-name] (branch-name)
// 查看远程仓库详细信息
git remote show [remote-name]
// 重命名远程仓库
git remote rename name_from name_to
// 删除远程分支
git remote rm [remote-name]
origin 是 Git 给克隆的仓库服务器的默认名字
别名
// git co 等同于 git checkout
git config --global alias.co checkout( git checkout => git co )
// git last显示最后一次提交
git config --global alias.last 'log -1 HEAS'
// 外部命令的别名可以在命令前面加入!符号
git config --global alias.start '!yarn start'