版本控制简述
版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
版本控制内容
版本控制包括:检入检出控制、分支和合并、历史记录。
1.检入检出控制
软件开发人员对源文件的修改不能在软件配置管理库中进行,对源文件的修改依赖于基本的文件系统并在各自的工作空间下进行。为了方便软件开发,需要不同的软件开发人员组织各自的工作空间。一般说来,不同的工作空间由不同的目录表示,而对工作空间的访问,由文件系统提供的文件访问权限加以控制。
访问控制需要管理各个人员存取或修改一个特定软件配置对象的权限。开发人员能够从库中取出对应项目的配置项进行修改,并检入到软件配置库中,对版本进行“升级”;配置管理人员可以确定多余配置项并删除。
同步控制的实质是版本的检入检出控制。检入就是把软件配置项从用户的工作环境存入到软件配置库的过程,检出就是把软件配置项从软件配置库中取出的过程。检人是检出的逆过程。同步控制可用来确保由不同的人并发执行的修改不会产生混乱。
2.分支和合并
版本分支(以一个已有分支的特定版本为起点,但是独立发展的版本序列)的人工方法就是从主版本——称为主干上拷贝一份,并做上标记。在实行了版本控制后,版本的分支也是一份拷贝,这时的拷贝过程和标记动作由版本控制系统完成。版本合并(来自不同分支的两个版本合并为其中一个分支的新版本)有两种途径,一是将版本A的内容附加到版本B中;另一种是合并版本A和版本B的内容,形成新的版本C。
3.历史记录
版本的历史记录有助于对软件配置项进行审核,有助于追踪问题的来源。历史记录包括版本号、版本修改时间、版本修改者、版本修改描述等最基本的内容,还可以有其他一些辅助性内容,比如版本的文件大小和读写属性。
常见版本控制工具
-
CVS
-
SVN
-
Git
什么是git
Git 是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小到大的所有项目。
Git易于学习, 占用空间小,性能快如闪电。它优于 Subversion、CVS、Perforce 和 ClearCase 等 SCM 工具,具有便宜的本地分支、方便的暂存区和 多个工作流等功能。
Git 是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小到大的所有项目。
Git易于学习, 占用空间小,性能快如闪电。它优于 Subversion、CVS、Perforce 和 ClearCase 等 SCM 工具,具有便宜的本地分支、方便的暂存区和 多个工作流等功能。
安装git
git的上传的流程
他的两个概念:
状态
同时,git 又提供了三种(也可以说是四种)不同的记录状态
-
已修改(modified)
-
已暂存(staged)
-
已提交(committed)
有一个特殊的状态
-
未追踪(Untracked)
区域
git 提供了三个不同的工作区,用来存放不同的内容
-
工作目录
-
暂存区域
-
Git 仓库
安装完git配置一下gitup的邮箱和用户名因为git提交需要你的这些信息
git config user.name "你的姓名"
git config user.email "你的邮箱"
-- global
通过 --global
选项可以设置全局配置信息
git config --global user.name "你的姓名" git config --global user.email "你的邮箱"
检查配置
# 打印所有config git config --list # 打印指定config git config user.name
创建仓库 - repository
进入希望纳入 git 版本控制的项目目录,使用 git init
初始化
git init
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这个目录也是上面我们说的三个区域之一,这个目录也是 Git 保存数据记录的地方,非常重要,如非必要,不要轻易改动
工作流与基本操作
当一个项目被 Git 初始化以后,只是表示我们希望通过 Git 来管理当前的这个项目文件的不同时期版本记录,但是这个时候项目中已存在的文件,或者以后新增的文件都是没有进入版本控制管理的,它们是 未追踪(Untracked)
的状态
查看工作区的文件状态
git status
git status
查看工作区中的文件状态
乱码(win文件名为汉语时)
git status 显示乱码
git config --global core.quotepath false
终端乱码
菜单 -> 设置 -> 文本 -> 本地 / 编码
或修改配置文件
[gui] encoding = utf-8 # 代码库统一使用utf-8 [i18n] commitencoding = utf-8 # log编码 [svn] pathnameencoding = utf-8 # 支持中文路径 [core] quotepath = false # status引用路径不再是八进制(反过来说就是允许显示中文了)
添加工作区文件到暂存区
git add
git add 1.txt # 添加多个文件 git add 2.txt 3.txt # 添加整个目录 git add ./a # 添加多个目录 git add ./b ./c # 添加所有文件 git add .
创建版本
git commit
将暂存区里的改动给提交到本地 git 仓库,也就是为这次工作(一般会把某个具有特定意义的工作作为一个版本,它可以是多个文件的变化)
-
每次提交同时会生成一个 40 位的哈希值,作为该次提交版本的唯一 id
提交备注
每次提交都需要填写备注信息
git commit # 会调用默认(或自定义)的文本编辑器
修改默认编辑器
git config core.editor notepad # 添加 vscode 编辑器 - mac # 通过 vim 打开环境变量配置文件 vim ~/.bash_profile # 添加环境变量 export PATH=/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin:$PATH # 保存退出 source ~/.bash_profile # 测试:在终端中直接通过命令 code 调用 vscode git config --global core.editor "code --wait"
单行备注
git commit -m 备注信息
查看提交日志
git log
// 完整格式 git log // 简要格式(单行) git log --oneline // 显示完整格式(包括删除的信息) git reflog
修复提交
git commit --amend
修复(替换上一次)提交,在不增加一个新的提交版本的情况下将新修改的代码追加到前一次的提交中(忘记提交部分内容时/修复Bug时)
git commit --amend -m 提交
删除
git rm
# 从 git 仓库与工作区中删除指定文件 git rm 文件 # 只删除 git 仓库中的文件 git rm --cached 文件 # rm 以后,需要 commit 这次操作,否则 rm 将保留在暂存区 ##(工作区:无 暂存区:有 仓库:无) ##每次操作,都应该提交到仓库中记录 git add . 从暂存区内提交到仓库中 git commit -m 修正
撤销,重置(回到指定历史时期)
git reset
从暂存区中撤销到工作区
// 从暂存区中撤销一个指定文件 git reset HEAD 文件名称 // 从暂存区中撤销所有文件 git reset HEAD .
该命令既可以用于回退版本
# 回退到指定的 commitID 版本 git reset --hard commitID
比较
# 比较 工作区和暂存区 git diff 文件 # 比较 暂存区和仓库 git diff --cached [commitId] 文件 # 比较 工作区和仓库 git diff commitId filename # 比较 仓库不同版本 git diff commitId1 commitId2
分支
我们的开发就像是游戏的任务,默认是在主线(master)上进行开发的。许多时候,还有各种支线任务,git 支持我们创建分支来进行项目开发
查看分支
git branch
创建分支
# 新的分支会存在主分支的所有信息 git branch 分支名称
切换分支
git checkout 分支名称 # 也可以使用 checkout -b 来新建分支,并切换过去 git checkout -b 分支名称
分支合并
# B 合并到 A,需要切换到 A 分支 ## 合并后会产生一个新的分支节点(A分支中) git merge 被合并分支 # 查看已经合并的分支 git branch --merged # 查看未合并的分支 git branch --no-merged
删除分支
# 如果分支为未合并状态,则不允许删除 git branch -d 分支名称 # 强制删除 git branch -D 分支名称 # 删除后,分支记录会保留
合并记录
rebase
# 合并 HEAD 前两个祖先记录 git rebase -i HEAD~2
合并冲突
有的时候,不同的分支可能会对同一个文件内容和位置上进行操作,这样在合并的过程中就会产生冲突
-
查看冲突文件
-
修复冲突内容
-
提交
标签
有的时候,我们希望给某一个特定的历史提交打上一些标签(默认为当前节点)
新建 tag
git tag -a v1.0.0 HEAD/commitId
查看 tag
git tag
协同开发
以上所有的操作都是建立在本地的,如果我们希望进行团队协同开发,那么这个时候,我们就需要把 git 仓库信息与团队中的所有人进行共享
-
中心化(集中式svn)与去中心化(分布式git)
github
首先注册一个账号
git 远程
链接
git remote add origin git@github.com:MrYangiOS/remove.git
提交(同步)远程
同步本地仓库到远程
git push -u origin master # -u 简化后续操作 git push origin master
远程分支
# 提交到远程(分支) git push origin [本地分支名称]:[远程分支名称] # 远程先创建好分支然后拉取到本地 git checkout -b [本地分支名称] origin/[远程分支名称] # 拉取远程分支到本地 git pull origin [远程分支名称]:[本地分支名称] # 查看远程仓库 git remote show origin # 查看本地分支 git branch # 查看远程分支 git branch -r # 查看所有分支 git branch -a # 删除本地分支 git branch -d [本地分支名称] # 删除远程分支 git push origin --delete [远程分支名称] # or git push origin :[远程分支名称] # 设置默认提交分支 git branch --set-upstream-to=origin/[远程分支名称] [本地分支名称]
使用HTTPS链接
需要输入账号and密码
使用 ssh 链接
SSH
https://help.github.com/cn/articles/connecting-to-github-with-ssh
https://help.github.com/cn/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
生成 SSH 秘钥
ssh-keygen -t rsa -C "zmouse@miaov.com"
添加代理
使用 ssh-add
代理,如果没有启动,可以手动启动
eval $(ssh-agent -s)
添加 私钥
ssh-add 私钥路径
在 github 上添加公钥
个人中心 -> 设置 -> ssh -> 添加
测试
ssh -T git@github.com
###