版本控制、git、github、博客搭建

版本控制

了解版本管理概念以及集中式和分布式版本管理

需要解决两个问题:

  • 历史记录保留的问题
  • 多人协同开发问题

什么是版本控制呢?

版本控制就是管理更新的历史记录,它给我们提供了一些在软件开发过程中必不可少的功能,例如:

  • 记录一款软件添加或更改源代码的过程
  • 回滚到特定阶段,恢复误删除的文件
  • 合并多人协作的文件等

版本管理分类

版本管理分为集中式版本管理和分布式版本管理,这两种方式有什么差异,我们接下来一一介绍。

集中式版本控制 - SVN

SVN 全称 Apache Subversion,是一个开放源代码的集中式版本管理系统。在 2000 年由 CollabNet 开发,现已发展成为 Apache 软件基金会的一个项目。

早期的版本管理就是以 Apache Subversion 为代表的集中式版本管理,如下图所示将仓库集中存放在服务器之中,所以只有一个仓库。这就是为什么这种版本管理系统会被称作集中式版本管理。

集中式版本管理将所有的数据集中存放在服务器中,这是有便于统一管理的优点。

但是一旦开发者所处的环境不能连接服务器,就无法获取最新源代码,开发也就无法进行。

服务器宕机时也是同样的道理,而且万一服务器故障导致数据丢失,恐怕开发者就再也见不到最新的源代码了。

简而言之:

  • 中央服务器好比是一个图书馆
  • 你要改一本书,必须先从图书馆借出来(checkout)
  • 然后回到家自己改,改完了,再放到图书馆(commit)

一些术语

  • 源代码库(repository):源代码统一存放的地方
  • 检出(checkout):当你手上没有源代码的时候,就需要从 responsive checkout 一份
  • 提交(commit):当你已经修改了代码,就需要 commit 到 repository
  • 更新(update):当你已经 checkout 了一份源代码,Update 一下就可以和 repository 上的源代码同步,你手上的代码就会有最新的变更

使用 VisualSVN 搭建 SVN 服务器

VisualSVN

SVN 服务器:运行 Subversion 服务的计算机。

SVN服务器分为命令行工具和图形化工具,为了方便,我们这里使用比较流行的图形化工具
VisualSVN

安装完毕之后,基本使用流程如下:

  • 创建用户或组
  • 创建版本仓库
  • 设定用户权限

使用 TortoiseSVN 作为 SVN 客户端

TortoiseSVN

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 背景

  • 被 BitKeeper 发现了,就要收回 Linux 团队的免费使用权限
  • Linus 大神一怒之下,在两三个星期之内就开发出了 Git 的初版

分布式版本管理概念

分布式版本控制

Linus Benedict Torvalds

Linus Benedict Torvalds

git 学习资料

安装 git 环境

下载地址

历史版本地址

确认是否有 git 环境:

1
$ git --version

如果看到能输出一个版本号 git version 版本号(版本不一定一致),说明没有问题。

初始设置

1
2
$ git config --global user.name "yourname"
$ git config --global user.email "your_email@example.com"

这里设置的姓名和邮箱会用在 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基本命令
      gitk命令打开的界面

更改提交的操作

指定文件回滚:

  • 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-octocat.png

Github 是为开发者提供 Git 仓库的托管服务。
是一个可以让开发者与朋友、同事、同学及陌生人共享代码的完美平台。
简而言之,Github 就是程序员的新浪微博,社交化编程。

介绍

  • Github 与 Git 的区别
    • Git 是一个分布式版本控制系统
      • 历史记录的问题
      • 多人协作的问题
    • Github 是为开发者提供 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 上,然后通过特定的域名就可以访问了。

  1. 在 github 上创建一个空仓库,仓库名称以 自己github用户名.github.io
  2. 克隆仓库地址到本地 git clone https://github.com/用户名/用户名.github.io 文件名
  3. 将静态页的代码放到本地仓库中
  4. 过滤掉不需要上传到远程仓库的文件或文件夹
    • cd 本地仓库根目录
    • 创建 .gitignore 文件, 将不需要跟踪的文件添加到.gitignore 文件中,
    • 比如:.idea demo
  5. 然后提交文件到该仓库中,注意:仓库根路径必须有一个 index.html 文件
    • git add --all
  6. 接下来就可以通过 自己的github用户名.github.io 来访问你托管的那个静态网站仓库了,默认去找 index.html 页面

还可以通过创建不同名字的仓库用来托管别的静态网站项目,如果想要通过你的github域名来访问,就必须把你托管的文件放到一个叫做 gh-pages 的分支中。然后就可以通过 github用户名.github.io/拥有gh-pages分支的仓库名称来访问你的这个网站了。

  • 克隆

github 项目开源,协同开发

主动邀请 –> collaborators
fork –> 自己的项目下就会有一个一模一样的仓库
Pull requests –> new pull request
Issues –> 讨论问题

使用 Hexo 搭建自己的个人静态博客

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 文件夹名

感谢您的支持!