版本控制
了解版本管理概念以及集中式和分布式版本管理
需要解决两个问题:
- 历史记录保留的问题
- 多人协同开发问题
什么是版本控制呢?
版本控制就是管理更新的历史记录,它给我们提供了一些在软件开发过程中必不可少的功能,例如:
- 记录一款软件添加或更改源代码的过程
- 回滚到特定阶段,恢复误删除的文件
- 合并多人协作的文件等
版本管理分类
版本管理分为集中式版本管理和分布式版本管理,这两种方式有什么差异,我们接下来一一介绍。
集中式版本控制 - SVN
SVN 全称 Apache Subversion,是一个开放源代码的集中式版本管理系统。在 2000 年由 CollabNet 开发,现已发展成为 Apache 软件基金会的一个项目。
早期的版本管理就是以 Apache Subversion
为代表的集中式版本管理,如下图所示将仓库集中存放在服务器之中,所以只有一个仓库。这就是为什么这种版本管理系统会被称作集中式版本管理。
集中式版本管理将所有的数据集中存放在服务器中,这是有便于统一管理的优点。
但是一旦开发者所处的环境不能连接服务器,就无法获取最新源代码,开发也就无法进行。
服务器宕机时也是同样的道理,而且万一服务器故障导致数据丢失,恐怕开发者就再也见不到最新的源代码了。
简而言之:
- 中央服务器好比是一个图书馆
- 你要改一本书,必须先从图书馆借出来(checkout)
- 然后回到家自己改,改完了,再放到图书馆(commit)
一些术语
- 源代码库(repository):源代码统一存放的地方
- 检出(checkout):当你手上没有源代码的时候,就需要从 responsive checkout 一份
- 提交(commit):当你已经修改了代码,就需要 commit 到 repository
- 更新(update):当你已经 checkout 了一份源代码,Update 一下就可以和 repository 上的源代码同步,你手上的代码就会有最新的变更
使用 VisualSVN 搭建 SVN 服务器
SVN 服务器:运行 Subversion 服务的计算机。
SVN服务器分为命令行工具和图形化工具,为了方便,我们这里使用比较流行的图形化工具
VisualSVN
安装完毕之后,基本使用流程如下:
- 创建用户或组
- 创建版本仓库
- 设定用户权限
使用 TortoiseSVN 作为 SVN 客户端
SVN 客户端:用户通过SVN客户端同SVN服务器交互
SVN 客户端也分为命令行工具和图形化工具,这里我们使用最流行的 TortoiseSVN
TortoiseSVN 客户端基本操作流程
- 检出项目:checkout
- 增加文件或目录:add(增加),commit(提交)
- 修改文件或目录:commit(提交)
- 删除文件或目录:commit(提交)
- 更新文件或目录:update(更新)
- 查看版本日志:log(日志)
关于冲突
多人协作时,同个目录或同个文件需要不同成员共同开发,这个时候 commit 和 update 就可能出现冲突。
- 两个程序员只要不是修改了同一行程序,SVN 可以通过 update 自动合并修改
- 但是如果两个程序员修改了同一行程序, SVN 会提示文件 conflict,需要手动确定
如何解决?
第一种解决方法:手动合并冲突的内容
第二种解决方法:每次修改某个文件的时候对文件上锁,这样你在修改的过程中别人就无法更新这个文件.
建议:
- 一个文件最好同一时间只被一个人修改提交
- 多跟团队成员沟通
- 不要随便去修改别人的文件
- 使用 SVN 解决冲突特别恶心,现在用的人也越来越少了
版本管理使用建议
- 不要频繁的提交版本
- 一般有比较成熟的功能模块的时候,再去提交
- 修复了功能性 bug 的时候再去提交
- 每次 commit 之前都要 update
- 因为你在编辑这个文件的时候,可能比人已经编辑并提价了某个版本
- 所以先 update,目的是为了检查一下服务器上有没有最新版,如果有,直接更新
- 更新的过程中如果遇到冲突,不要慌,去手动解决
- 每次 commit 的时候都要写提交日志
- 这个提交日志就好比你保存副本的时候加的一个标记
- 目的是为了日后做版本的回退查找以及查看记录更新状态
使用总结
- 版本控制管理系统
- 源代码仓库 repository
- 检出代码 checkout
- 更新最新源代码 update
- 提交修改 commit
分布式版本控制 - Git
- 本地版本
- 多人任务
- 多人协同
git 背景
- Git的诞生
- Git诞生背后的一些故事
- Git 简史
- Git 诞生 11 年后,BitKeeper 宣布开源
- Linus 原来带领数百万人开发 Linux 操作系统
- 使用 BitKeeper 作为团队的版本协同工具
- 商业收费
- 免费给 Linux 开发团队使用
- 直到有一天,其中有个开发人员试图去破解 BitKeeper 这个收费软件
- 被 BitKeeper 发现了,就要收回 Linux 团队的免费使用权限
- Linus 大神一怒之下,在两三个星期之内就开发出了 Git 的初版
分布式版本管理概念
Linus Benedict Torvalds
git 学习资料
安装 git 环境
确认是否有 git 环境:
|
|
如果看到能输出一个版本号 git version 版本号
(版本不一定一致),说明没有问题。
初始设置
|
|
这里设置的姓名和邮箱会用在 git 的提交日志中,执行完上面的命令之后会在当前用户目录下生成一个 .gitconfig
文件,想要更改上面的配置项,可以通过修改该文件完成。
只需要在第一次安装了 git 环境之后配置一下即可。如果想要修改,可以使用上面命令重新执行即可修改.
git 工作原理
git config
git config --global user.name 开发者名称
开发者名字git config --global user.email email地址
开发者邮箱- 配置用户,写明提交时谁完成的,记录是哪个开发者
- 只需要配置一次
- 工作目录、暂存区、git 仓库
- 未追踪(untracked)、已提交(committed)、已修改(modified)和已暂存(staged)
ls -al .git
查看.git 文件下的所有文件git add 文件名.后缀
将为追踪状态和已修改状态的文件添加到暂存区git commit -m "描述"
将已暂存状态的文件存到仓库中git status
查看文件状态git log
查看提交历史(也称之为版本)- 以上这几点 git 帮我们解决了一个问题,本地版本管理
多任务:
- 在现实中经常会同时开发多个功能
- 通过分支解决
- 执行
git add --all
–>git commit -m "历史记录一"
会自动创建一个 master 分支 - 为了保证各个功能之间相互的不影响
git branck login
创建一个名字叫 login 的分支- 这样就创建了一个分支
git checkout login(分支名)
切换到分支 login 的分支git add -A
git commit -m "完成了...功能"
- 然后该再回调 master 分支上创建别的分支
git checkout master
来到了 master 分支git branch cart
创建了 cart 分支git checkout cart
来到 cart 分支下- 修改 cart 的模块功能,突然需要处理 login 下的逻辑
git add index.html
git commit -m "创建 cart 功能"
- 修改 login 分支上的
git checkout login
git status
git add -A
git commit -m "修复了一个小 bug"
- 然后又回到 cart 分支下,继续开发
git checkout -b 分支名称
创建并切换至到这个分支
通过分支可以实现多任务并行进行,最终代码需要合并,如何合并?让 login 和 cart 上的代码合并
git merge login
合并分支,当前在 cart- 将 login 分支上的所有代码包括历史记录一起合并到 cart 下面。
这样就通过分支实现了不同模块之间的代码互不干扰,划分分支,有不同的任务对应不同的分支
git branch -d login
删除分支git branch
查看所有的分支*
表示在当前的分支
git checkout -b newbranch
创建名称为 newbranch 的分支并切换到该目录下
多人协同开发:
- 需要一台公网服务器(远程服务器) 借助 SSH 登录
- 需要在公网服务器上创建一个裸仓库
- 所谓裸仓库是指没有工作区的目录
mkdir xxx.git
–>git init --bare
,执行这两条命令
git push 远程仓库地址 master user@主机地址:目录
远程仓库地址可以是 IP 地址格式也可以是域名格式git pull 远程仓库地址 master user@主机地址:目录
拿远程仓库上的 master 分支git remote add 别名 真实地址
真实地址太长,使用短的别名来替换git remote show 别名
查看真实地址
如何实现计算机之间的登录问题,通过 SSH 协议实现计算机之间的安全登录,实现协议的软件有 openssh。
安装 openssh 后提供一个名字叫 ssh 的命令,通过此命令可以是现计算机之间的登录。ssh user@host
,输入密码之后创建裸仓库
知识点:ssh
–> ssh-keygen -t rsa
在我们的每个用户下创建公钥和私钥;
ssh 协议用来计算机之间安全登录的。通过一对公钥和私钥来实现信息的加密处理。
ssh 会通过公/私钥加密,通过 bash ssh-keygen -t rsa
命令生成。
公/私钥工作原理:传递的信息既可以通过公钥加密,也可以通过私钥加密,但最终都要进行解密,假如使用公钥加密,只能使用与其对应的私钥解密相反的,如果使用私钥加密,只能与其对应的公钥才能加密。SSH 会自动选择该使用谁进行加密。
通常在使用登录的时候,服务器在使用自己的公钥传递过来,本地计算机进行存储。下次再进行数据传递时会自动利用该公钥进行数据的加密,服务器接收到信息后会自动使用私钥将数据解开。
首相将本地私钥放到服务器上,当下次访问远程服务器时,服务会自动生成“一段小文本”并使用我们刚刚存的公钥进行加密,然后传递给我们。
免密码登录服务器,把自己的私钥放到服务器。
/mhq
在用户目录下mkdir .ssh
cd .ssh
touch authorized_keys
vi authorized_keys
i
复制本地的私钥 粘贴
wq
现实开发中要解决多人协同开发的
远程仓库,如何解决代码的共享问题:
–> 远程服务器
–> 登录SSH 用户名@服务器地址
–> yes –> 输入密码
–> mkdir demo.git
创建远程仓库
–> 初始成裸仓库(专门共享代码的,没用工作区的仓库)
–> git init --bare
(变成了裸仓库了)
–> ls
–> 在 bash 窗口中
–> git checkout master
切换到 master 分支下
–> git push 用户名@192.168.32.101:/root/demo.git
(远程仓库的地址)
只需要创建一个裸仓库,剩下的 git 会自己管理。
git pull 用户名@192.168.32.101:/root/demo.git master
从远程仓库拿到本地
rm -rf
ls
mkdir demo
git init --bare
ls
git bush student@192.168.32.101:/home/student/demo master
- 以 student 的身份登录,往这台服务器发送,: 表示要访问目录了
- –> 输入密码:
- 另一个开发小伙伴:
git clone student@192.168.32.101:/home/student/demo
- –> 输密码:
******
- –> 输密码:
git remote add hiraku git@地址
给远程仓库起一个名字git push hiraku master
将修改内容放到远程仓库上去git remote show hiraku
查看比较短的 hiraku 的对应真实地址是什么git remote add myself mhq@192.168.32.101:/mhq/demo.git
添加多个git push myself master
其他
git init
初始化一个新项目git clone
得到一个已有的仓库副本git config --global user.name
名称git config --global user.email
邮箱
基本操作详解
ls -al .git
查看.git 文件下的所有文件git init
- 通过该命令创建一个本地仓库
- 执行过后,会在目录下生成一个
.git
隐藏目录,最好不要手动修改
touch .gitignore
创建 .gitignore 文件git status
- 查看当前工作树状态
- 例如有新增的文件、修改的、删除的、等操作没有被添加到暂存区或者没有被提交
- 都可以通过 git status 命令看到
git add 文件名.后缀
或者git add --all
添加所有文件- 将制定的文件添加到暂存区(待提交列表)
git commit -m "描述"
- 将暂存区(待提交列表)中的文件提交到本地仓库,形成一个历史快照
git log
- 查看提交日志
gitk
- 以图形化的界面查看本地仓库提交日志状态
git push
- 连接到远程仓库
- 需要输入账号名
- 需要输入密码
更改提交的操作
指定文件回滚:
git checkout commit提交时的节点前五位 文件名.后缀
git checkout [file]
- 恢复暂存区的指定文件到工作区
git checkout [commit] [file]
- 恢复某个commit的指定文件到暂存区和工作区
git checkout commit ...
- 恢复暂存区的所有文件到工作区
指定版本回滚:
git reset --hard HEAD^
- 恢复暂存区和工作区到上一次最新的提交
- 回退一个版本
git reset --hard 提交哈希值
- 根据提交哈希值(版本号)回溯到历史版本,首先得知道到底有哪些值
- –hard 意味着把指针挪一个位置,工作区和暂存区都移了位置
- –soft log 只剩两次了,只是指针变了
- –mixed 历史会变、暂存区也变,工作区不变。
git reflog
- 查看当前仓库操作日志
git commit --amend
- 修改最近一次提交的提交日志
更新仓库:
本地仓库更新到和远程仓库一样
touch index.js
创建文件git status
git checkout -b aaa
创建平行分支git push hiraku aaa
远程仓库下创建一个相同的分支git fetch
git branch -a
查看远程分支和本地分支git merger 远程分支名称
远程和本地同步git pull
=git fetch
+git merge
git push hiraku --delete aaa
删除远程仓库下的 aaa 分支git push 远程地址 本地分支:远程分支
添加分支git push 远程地址 本地分支
添加分支 简写,相当于git push 远程地址 aaa:bbb
本地 aaa 放到远程 bbb。
推送至远程仓库
如果已经有了一个本地仓库,就可以通过下面的形式和线上的空仓库产生关联:
git remote add origin 远程仓库地址
- git 会自动将远程仓库地址起个别名 origin
git push -u origin master
- 推送到名称为 origin 远程仓库地址下的 master 分支下
从远程仓库获取
git clone 仓库地址
=git init
+git pull 地址 master
+git remote add origin
- git 会自动将 origin 设置为该远程仓库地址的标识符
git pull 地址 分支
- 本地得有一个仓库
git 高级
git difftool
比较工作区和暂存区的差异git difftool 提交记录1
比较工作区和特定提交的差异git difftool 提交记录1 提交记录2
这两次提交的差异git difftool cart
查看当前分支和 cart 分支的差异
github
Github 是为开发者提供 Git 仓库的托管服务。
是一个可以让开发者与朋友、同事、同学及陌生人共享代码的完美平台。
简而言之,Github 就是程序员的新浪微博,社交化编程。
介绍
- Github 与 Git 的区别
- Git 是一个分布式版本控制系统
- 历史记录的问题
- 多人协作的问题
- Github 是为开发者提供 Git 仓库的托管服务
- Git 是一个分布式版本控制系统
- 不仅仅是 Git 仓库的托管服务
- 社交元素:项目点赞、关注项目Watch、Pull Request 等功能
- Pull Request:假设你修改了一个开源仓库源代码
- 你可以通过 Pull Request 请求合并,请求合并到源代码仓库中
- 当你发送了请求合并,别人会收到你的合并请求,然后会检查你的合并请求,如果没有问题,就可以直接合并到源代码库中
- Github Flavored Markdown
- 写说明文档、发布评论等都使用的是 Markdown
- 基本上各大开源产品都在 Github 上
- jQuery、bootstrap、AngularJS、Vue、React、Node
基本使用
- 创建账户
- 设置头像
- 创建仓库
- 连接仓库
- 公开代码
- 克隆仓库 git clone 仓库地址
- 编写代码
- 提交 git add 文件名(添加某一个文件) –> git commit -m “提交说明”
- 进行 git push 发布到远程仓库
使用 Github Pages 搭建静态站点
我们可以把静态网站部署到 Github 上,然后通过特定的域名就可以访问了。
- 在 github 上创建一个空仓库,仓库名称以
自己github用户名.github.io
- 克隆仓库地址到本地 git clone https://github.com/用户名/用户名.github.io 文件名
- 将静态页的代码放到本地仓库中
- 过滤掉不需要上传到远程仓库的文件或文件夹
- cd 本地仓库根目录
- 创建
.gitignore
文件, 将不需要跟踪的文件添加到.gitignore
文件中, - 比如:.idea demo
- 然后提交文件到该仓库中,注意:仓库根路径必须有一个 index.html 文件
git add --all
- 接下来就可以通过
自己的github用户名.github.io
来访问你托管的那个静态网站仓库了,默认去找 index.html 页面
还可以通过创建不同名字的仓库用来托管别的静态网站项目,如果想要通过你的github域名来访问,就必须把你托管的文件放到一个叫做 gh-pages
的分支中。然后就可以通过 github用户名.github.io/拥有gh-pages分支的仓库名称
来访问你的这个网站了。
- 克隆
github 项目开源,协同开发
主动邀请 –> collaborators
fork –> 自己的项目下就会有一个一模一样的仓库
Pull requests –> new pull request
Issues –> 讨论问题
使用 Hexo 搭建自己的个人静态博客
- 必须安装 Node 环境
- 通过在终端任意目录输入
node -v
查看是否有输入node的版本
- 通过在终端任意目录输入
- 在终端的任意目录输入
npm install -g hexo-cli
然后回车执行等待安装成功- 通过输入
hexo --version
如果看到输入一大堆的版本号就说明安装成功了 - Hexo 是一个命令行应用程序
- 通过输入
- 接下来通过输入
hexp init 博客项目存储目录
- Hexo 会在你执行该命令的目录下生成一个博客项目
- 初始化博客项目的过程需要联网
- 接下来通过终端进入刚才创建的博客项目目录,然后在该目录下输入
npm install
回车等待执行结束 - 接下来输入
hexo server
回车执行,它会在你的本地启动一个服务器,然后就可以访问你的博客项目 - 进入博客项目,输入
hexo new 文章名称
创建博客- 该命令会自动在 source/_posts/ 目录下生成一个 文章名称.md 文件
- 生成静态文件:
hexo generate
- 该命令会自动在项目的根目录下的 public 目录下降静态文件放进去吧
快速部署
- 修改配置文件
- 在项目根路径下执行
npm install hexo-deployer-git --save
该命令 npm
在安装 node 时自动安装了- 接下来就可以直接输入
hexo deploy --generate
自动发布到 github 上
删除命令 : rm -rf 文件夹名