版本控制系统
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
[图片上传失败...(image-dffb10-1544337723992)]
- 本地版本控制系统
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会加上备份时间以示区别,这么做唯一的好处就是简单,但是特别容易犯错。 为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。
本地版本控制系统.jpg
- 集中化的版本控制系统
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
集中化的版本控制系统.jpg
这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。但这样做的的缺点是如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
- 分布式版本控制系统
于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
分布式版本控制管理.jpg
Git 初始化配置
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
-
/etc/gitconfig文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
2.~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
3 .当前使用仓库的 Git 目录中的.git/config文件:针对该仓库。
每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
- 用户信息
当安装完 Git 应该做的第一件事就是设置用户名称与邮件地址,此后每一个 Git 的提交都会使用这些信息,不可更改。$ git config --global user.name "xxx" # 设置用户名 $ git config --global user.email xxxxxx # 设置用户邮箱 - 文本编辑器
用户信息设置完毕,你可以配置默认文本编辑器了,当 Git 需要你输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以这样做:# git config --global core.editor emacs - 检查配置信息
如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。
你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:# git config --list user.name=John Doe user.email=johndoe@example.com color.status=auto color.branch=auto color.interactive=auto color.diff=auto .../etc/gitconfig与~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。
可以通过输入 git config <key>: 来检查 Git 的某一项配置
# git config user.name
Git三种状态
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified,已暂存(staged)。
- 已提交表示数据已经安全的保存在本地数据库中。
- 已修改表示修改了文件,但还没保存到数据库中。
- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
Git的三种状态.png
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’',不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
-
在工作目录中修改文件。
-
暂存文件,将文件的快照放入暂存区域。
-
提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
获取 Git 仓库
基本的 Git 工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作"索引",不过一般说法还是叫暂存区域。
-
在现有目录中初始化仓库
如果你打算使用 Git 来对现有的项目进行管理,只需要进入该项目目录并输入$ git init该命令将创建一个名为
.git的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件。但是这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。 -
克隆现有的仓库
如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到git clone命令。$ git clone https://github.com..... # 从github上面获取项目当你执行
git clone命令的时,远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
提交
- 查看文件状态
Git 所跟踪的文件有三种状态:已提交(committed)、已修改(modified)和 已暂存(staged)。- 已提交表示数据已经安全的保存在仓库中。
- 已修改表示修改了文件,但还没保存到仓库中。
- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次的提交中。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。
如果作了修改并已放入暂存区域,就属于已暂存状态。
如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
-
跟踪新文件
$ git init $ echo "hello word" > txt $ git status Untracked files: # 新文件未被跟踪 (use "git add <file>..." to include in what will be committed) txt $ git add txt $ git status Changes to be committed: # 新文件已被跟踪,但还未被提交 (use "git rm --cached <file>..." to unstage) new file: txt $ git commit -m "add txt" # 提交 $ git status On branch master nothing to commit, working directory clean # 新文件已被提交到仓库中,现在工作目录是干净的。使用命令
git add开始跟踪一个文件。 -
暂存已修改的文件
$ echo "hello world2" >> txt $ git status On branch master Changes not staged for commit: # 文件已被修改,但没有暂存 (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: txt $ git add txt # 文件已被暂存 $ git status On branch master Changes to be committed: # 文件已被暂存,但没有提交 (use "git reset HEAD <file>..." to unstage) modified: txtgit add命令是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 -
提交
-
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,即使用git rm命令,然后再提交。另外一种情况是,我们想把文件从 Git 仓库中删除,但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 可以用
git rm --cached命令$ git init $ echo "hello world" > txt $ git add txt && git commit -m "add txt" $ git status On branch master nothing to commit, working directory clean $ git rm --cached txt $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: txt Untracked files: (use "git add <file>..." to include in what will be committed) txt $ git commit -m "remove txt from git" $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) txt -
重命名
不像其它的 VCS 系统,Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。 不过 Git 非常聪明,它会推断出究竟发生了什么,至于具体是如何做到的,我们稍后再谈。$ git mv txt2 txt3 On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: txt2 -> txt3其实,运行
git mv就相当于运行了下面三条命令:$ mv txt2 txt3 $ git rm txt2 $ git add txt3
查看提交历史
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log 命令。
git log 有许多选项可以帮助你搜寻你所要找的提交,最常用的有:
-p,用来显示每次提交的内容差异。
-2 来仅显示最近两次提交:
撤销操作
在任何一个阶段,你都有可能想撤销某些操作。
- 撤销对文件的修改
如果你不想保留对文件的修改,你想将它还原成上次提交时的样子,可以使用git checkout命令。$ echo "hello world2" >> txt $ git status Changes not staged for commit: # 修改还未加入暂存区 (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: txt $ git checkout HEAD txt $ git status On branch master nothing to commit, working directory clean - 撤销暂存的文件
-
对于新增加跟踪的文件,撤销跟踪的文件可以用
git rm --cached命令。 -
对于修改类型的文件,撤销可以用
git reset命令$ echo "hello world2" >> txt $ git add txt $ git status On branch master Changes to be committed: # 已将修改加入暂存区 (use "git reset HEAD <file>..." to unstage) modified: txt $ git reset HEAD txt $ git status Changes not staged for commit: # 修改还未加入暂存区 (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: txt
-
- 撤销提交
有时我们已经提交了修改,但此时发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行git commit --amend,重新提交。最终你只会有一个提交,第二次提交将代替第一次提交的结果。$ echo "hello world3" >> txt $ git add txt $ git commit -m "add hello world3" $ git status On branch master nothing to commit, working directory clean $ git commit --amend # 重新提交 $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: txt
分支
- 创建分支
- 切换分支
- 合并分支
参考资料









网友评论