1. 版本控制
在工作中,我们为了记录一个文件在多次修改中的记录,我们经常会做这样的事情:
这就是一个简单的版本控制。
1.1 概念
版本控制就是记录一个文件或者一个工程从诞生到完成时文件内容变更的过程,以便于将来可能会发生的各种情况。可以给予文件所有者未来恢复到任意一个版本的选择权。
1.2 分类
在我们的软件开发过程中,一个项目存在许多变化,如果我们采用上述的记录文件的方式,开发者和管理者都会非常的崩溃,我们很难找出一个功能是因为什么原因加入到项目中的。为了解决这个问题,人们就开发了许多的版本控制系统,大多数都是采用简单的数据库来记录文件的每次更新差异。
1.2.1 本地版本控制系统
本地版本控制系统是在硬盘上保存了补丁集(就是文件在每次修改前后的变化),通过所有的补丁,然后计算出各个版本的内容。
1.2.2 集中版本控制系统
集中版本控制系统是有一个单一的集中管理的服务器,保存所有文件的修改补丁,所有的工作者都可以直接连接到服务器,取到最新的文件更新。
但是如果在系统宕机时,所有的人都无法更新、比较文件等,就无法进行工作。如果服务器磁盘损坏了,如果没有备份所有的数据以及历史更新都会丢失。
1.2.3 分布式版本控制系统
分布式版本控制系统不只是提取最新的文件,而是将整个远程代码仓库全部更新下来,包括完成的历史记录,这样,就算服务器磁盘损坏了,我们也可以将使用任意的镜像还原。
2. Git
我们的主角——Git,就是当今非常主流的一个分布式版本控制系统,在git中,每当提交更新时,会将所有的文件创建一个
快照,并且保存下这个快照的索引;而如果文件没有更新,git不会再次存储文件,而是保留一个链接指向之前存储的文件。
2.1 git的优势
- 本地执行:因为git会将远端拉取到本地保存在一个
本地的副本中,当你在没有网络的情况下,你也可以修改文件,先保存在本地的数据库,然后在有网络时再提交到远端,在本地也可以访问本地的数据库,查询历史文件,不需要连接网络; - 完整性:git中的数据会在存储之前计算校验和,这说明你修改任意的文件都会被git知道并且记录,保证了文件的完成性;
- 性能高:因为git是在本地执行,所以避免和网络进行交互,所以性能是非常高的。
2.2 git的四个阶段
Git项目有四个阶段:工作区、暂存区、本地仓库和远程仓库;
- 本地仓库:可以想象成一个本地的
数据库,这里存储了版本控制系统的所有记录和数据。
本地仓库就是在本地项目中的
.git隐藏目录。我们一般可以使用两种方式获取这个目录:
- 在本地初始化一个新仓库;
- 使用远端的URL地址克隆到本地计算机。
- 工作区:一个文件在本地仓库中放在磁盘上我们可以随意使用和修改。
- 暂存区:保存了下一个需要提交文件的信息列表。
- 远程仓库:通常位于远程服务器上,将本地仓库的代码可以推送到远程仓库中保存,供其他协作者使用。
2.3 git的工作流程
3. 下载配置Git
- 官网下载:git-scm.com/downloads 点击下载最新版然后进行安装。安装完成之后,右键点击
Git Bash Here,出现类似命令框的东西,则说明安装成功。 - 安装完成之后需要配置用户信息
git config --global user.name "xxx"
git config --global user.email xxx
4. Git的基础使用
4.1 初始化仓库
- 在已有的项目中初始化仓库
git init
这个命令可以在本地创建一个名为.git隐藏目录文件。
- 从远程仓库中克隆已经存在的仓库
git clone url
4.2 检查文件状态
git status
4.3 添加到暂存区
git add <files>
可以跟踪一个文件到暂存区
4.4 提交更新
git commit -m message
使用上述命令可以将我们的修改提交,message可以为每次提交设置提交信息。
git commit --amend
有些时候提交完了发现漏了几个文件没有上传,可以使用上述命令,可以编辑提交信息。
4.5 查看提交已暂存和未暂存的修改
git diff
使用上述命令可以查看每次修改与上一次添加到暂存区内容的差别,
4.6 查看提交历史
git log
项目中所有的提交记录将会以时间顺序显示出来,最新的提交会在最上方。如果所有的提交历史不能完全的显示在一个屏幕中,在命令行的最下面会显示一个冒号,可以点击空格键跳转到下一页,使用q退出。
git log -p
添加参数-p 可以显示更多的提交记录详情。
4.7 从暂存区中取消文件
git reset head <file>
使用上述命令可以将暂存区的文件取消。
4.8 撤销文件修改
git checkout -- <file>
一个暂存区的文件发生改变,如果我们不需要这次修改,可以使用上述命令撤销对文件的修改。
5. 远程仓库
5.1 查看远程仓库
git remote
查看已经配置的远程仓库服务器
5.2 添加远程仓库
git remote add <shortname> <url>
使用上述命令可以添加一个远程仓库,同时指定一个方便使用的简写。
5.3 从远程仓库拉取
git fetch <remote>
使用上述命令会访问远程仓库,从中拉取还没有获取的数据,也可以更新远程分支的指针。
注意:不会自动合并或者修改当前的工作。
git pull
自动抓取远程数据合并到当前分支。
5.4 推送到远程仓库
git push <remote> <branch>
推送到远程仓库的指定分支。
5.5 查看远程分支
git remote show <remote>
查看某个远程仓库的信息。
5.6 远程仓库的重命名
git remote rename <remote> <newname>
修改远程仓库的简写名。
5.7 远程仓库的移除
git remote rm <remote>
移除远程仓库,使用这种方式删除远程仓库,那么和这个远程仓库相关的远程跟踪分支以及配置信息都会被删除。
6. 分支
分支是Git的一个非常强大的功能,可以帮助我们解决在开发过程中的存在的冲突问题。比如通常在开发的过程中,我们每一个人都会创建属于自己的个人分支,自己新开发的功能都会先在自己的个人分支上个开发测试,如果测试没问题之后再合并到主分支。
6.1 创建分支
git branch <新的分支名称>
创建一个新的分支,但是当前的分支并没有指向新创建的分支。
6.2 切换分支
git checkout <切换的分支名称>
创建好分支之后,可以使用上述命令切换到新的分支上来。通常我们希望创建好分支之后,直接切换到当前创建的新的分支,可以使用-b参数:
git checkout -b <新的分支名称>
6.3 合并分支
git merge <合并的分支名>
如果需要将一个分支修改的内容合并到另一个分支,需要先切换到被合并的分支上,可以使用上述命令。
git rebase <需要合并的分支>
使用上述命令可以将当前分支的修改变基到目标分支。
6.4 删除分支
git branch -d <需要删除的分支>
使用上述命令可以将一个已经不需要的分支删除。
6.5 查看分支
git branch
使用这个命令可以查看所有的分支列表,分支名称前有*,代表当前git目录所处的分支为这个分支。
git branch -v
这个命令可以查看每一个分支的最后一次提交。
git branch --merged(--no-merged)
这两个可以过滤已经合并过的分支列表和没有合并过的分支列表。
6.6 推送到远程分支
git push <远程分支> <分支名>
使用上述命令推送到远程分支。
6.7 删除远程分支
git push <远程名> --delete <分支名>
从远程服务器中删除分支。
6.8 修改提交信息
- 首先需要使用
git log命令来查询历史记录; - 然后使用
git rebase -i <commit id>; - 在弹出的交互式命令框将消息前面的字符修改为
edit; - 然后重新提交。
更多关于Git的操作请查看 git-scm.com/book/en/v2