SVN 、Git、Github的使用

时间:2023-12-05 18:10:08

1.1 SVN 总结以及使用建议

  1. 每一次保存历史记录实际上就是一次提交
  • 什么时候去保存历史记录?
    • 完成了一个具体的功能模块
    • 代码运行没有bug
  • 当天工作结束提交一次
    • 没有 bug 的前提下去提交一次
  1. 关于历史记录版本
  • 只要想要保存历史记录就必须通过服务器
  • SVN 使用数字作为版本的唯一标识
  • 即便同时有多人提交,也是按照顺序的版本号增长
  1. 关于版本冲突

    • 例如服务器中的最新版本是 4, a.txt文件中有一段内容:hello
    • 张三 4 和服务器同步的版本
      • 修改了 a.txt :hello world
      • 提交变动,保存历史记录,服务器直接就接受,版本升级为 5
    • 李四 4 和服务器同步的版本
      • 修改了 a.txt:hello lisi
      • 提交变动,保存历史记录,服务器会告诉你先和服务器上的版本更新同步然后再提交
      • 更新:
        • 5:a.txt :hello world
        • 4:a.txt :hello list
    • 解决冲突:
      • 冲突的地方:
        • 使用别人的
        • 使用你自己的
        • 使用别人和你自己的
  2. 使用建议

  • 每次提交之前,先更新
  • 更新如果遇到冲突,先解决冲突,再提交
  • 由于解决冲突很耗时,多跟你的同事口头交流
    • 例如你改这个文件的时候,告诉被人不要改
    • 或者别人改这个文件的时候,你不要改
    • 就是这样的方式可以最大程度的避免冲突

1.2 SVN 弊端

集中式版本控制就是集中的把源代码放到一个线上的仓库中,任何提交都围绕着*服务器进行。

这种方式最大的好处就是模式简单,可以很快上手使用版本控制,但是也带来了一些问题:

  1. 每一次提交都必须联网
  • 很耗时
  • 例如 Git 就可以本地保存历史记录,不需要联网
  1. 一旦服务器宕机或挂掉
  • 没法保存历史记录了(Git 可以)
  • 整个项目的历史记录可能丢失
    • Git 不会,每一个客户端本地都会有一个克隆仓库
  • 无法协同

2. 命令行

学习命令行最好的方式是学习 Linux 上的 shell、bash。

2.1 GUI VS CLI

现在,大多数的计算机用户只是熟悉图形用户界面(GUI),并且产品供应商和此领域的学

者会灌输给用户这样的思想,命令行界面(CLI)是过去使用的一种很恐怖的东西。这就很不

幸,因为一个好的命令行界面,是用来和计算机进行交流沟通的非常有效的方式,正像人类社

会使用文字互通信息一样。人们说, 图形用户界面让简单的任务更容易完成,而命令行界面

使完成复杂的任务成为可能
,到现在这句话仍然很正确。

2.2 shell

一说到命令行,其实真正指的是 shell

shell 就是一个程序,它接受从键盘输入的命令,然后把命令传递给操作系统去执行。

几乎所有的 Linux 发行版都提供一个名为 bash 的 shell 程序。

bash 是 Bourne Again SHell 的首字母缩写,所指的是这样一个事实。

2.3 终端仿真器

当使用图形用户界面时,我们需要另一个和 shell 交互的叫做终端仿真器的程序。

在 Windows 上,一般使用操作系统自带的 cmd 或者 powershell

在 Linux 上,如果是图形用户界面,那么可以使用 terminal 或者 konsolegnome-terminal 之类

的终端仿真器,但基本上,它们都完成同样的事情,让我们能访问 shell,

你可能会因为附加的一些花俏功能而喜欢上某个终端。

关于名字,如果有人提到:控制台、终端、bash、shell、terminal 等,一般都是指上面这些。

一般在 Linux 上,都会提供一个 bash 或者 terminal 之类的工具,让你来使用 shell

学习 shell 最正确的方式就是学习 Linus 上的 shell。

Linus 上的 shell,或者说 Bash 是最强大的。

学 Linus 上的 shell 命令基本上切换到 Mac 上可以很快过度。

所以,安装 git 的时候,自带了一个 git bash , 是一个 Linus shell 仿真器。

也就是说 git Bash 上可以体验到绝大多数的 Linus 终端命令。

2.4 安装 Git for Windows 客户端体验 shell

Git for Windows 客户端自带了一个终端仿真器:git bash

下载地址:https://git-for-windows.github.io/

git for Windows - github 托管地址

,然后找到 Realease 模块,找到下载的对应版本即可。

注意:虽然在 Windows 上可以通过 cmd 或 powershell 体验终端的使用,

但是学习终端最正确的方式是学习 Linux 上的命令行,要更纯正,更强大。

所以,我们这里通过使用 Git for Windows 客户端(自带了一个 bash)可以供我们学习 shell。

打开和退出终端

命令提示符

命令的分类

  • 控制台自带命令

    • 工具型
      • ping
      • ipconfig
      • shutdown
      • winver
      • ......
    • 文件系统型
      • cd
      • pwd
      • ls
      • mkdir
      • cp
      • mv
      • ......
  • 第三方应用程序命令

    • CLI(Command Line Interface) 程序:命令行应用程序
      • 没有图形界面,直接在终端中运行,由第三方应用程序执行
        • 接收用户通过终端输入的字符
        • 处理执行用户通过终端输入的字符
        • 终端会对你输入的相应的参数或者命令解析执行实现相应的功能
        • 如果有提示信息,直接将提示信息或者说操作信息,输出到终端中
    • GUI 程序:图形界面应用程序
      • feiq

常用工具型命令

  • ping
  • ipconfig

使用终端操作文件系统

  • 绝对路径和相对路径
  • pwd(print working directory)
  • ls(list files)
    • ls 列出当前目录文件
    • ls 目录路径 列出指定路径文件
    • ls -a 列出文件并显示隐藏文件或目录
  • cd(change directory)
    • 切换到指定路径(相对路径或绝对路径)
    • 在 cmd 或 powershell 中切盘符:盘符: 回车即可
  • cp(copy)
    • cp 源路径 目标路径
    • cp 在复制目录的时候,不会复制里面的子文件或子目录
    • -r (recursive)递归复制
  • mv(move):移动文件或者目录,还可以重命名文件或目录
  • mkdir(make directory):创建目录
  • rmdir 目录名称
    • 只能删除空目录
  • rm(remove):删除文件或目录
    • -rf 递归删除:直接将整个目录包括里面的内容都删掉
    • 在cmd、powershell 不支持
  • clear:清屏
    • cmd 中无法使用 clear
    • cmd 中是 cls
  • touch 文件名
    • 根据文件名创建新的文件
  • cat 文件名
    • 查看指定的文本文件

使用 less 命令浏览文件内容

less 命令是一个用来浏览文本文件的程序。

less 命令是这样使用的:less 文本文件名

一旦 less 程序运行起来,我们就能浏览文件内容了。

如果文件内容多于一页,那么我们可以上下滚动文件。按下 q 键,退出 less 程序。

下表列出了 less 程序最常使用的键盘命令:

命令               行为
h 显示帮助屏幕
Page UP or b 向上翻滚一页
Page Down or space 向下翻滚一页
UP Arrow 向上翻滚一行
Down Arrow 向下翻滚一行
G 移动到最后一行
g 移动到开头一行
/charaters 向前查找指定的字符串
n 向前查找下一个出现的字符串,这个字符串是之前所指定查找的
q 退出 less 程序

命令行文本编辑器:VI

Visual Interface

命令模式

插入模式

通过从命令模式按 i 进入编辑模式。

保存:

从编辑模式退出到命令模式,:w 保存该文件。

  • :q 退出
    • 如果没有保存会提示让你保存再退出
    • :q! 强制退出
  • :wq 保存并退出

PATH 环境变量

目的就是为了可以在终端中的任意目录中使用该可执行文件。


介绍

  • Git 是一个类似于 SVN 的一个版本控制系统VCS(Version Control System)
    • 相同点:都是版本控制系统
      • 历史记录
      • 多人协作
    • SVN 是集中式版本控制系统
    • Git 是分布式版本控制系统
  • 关于名字:Git:饭桶,无用的人
    • Angular:有角的、生硬的
  • 作者:林纳斯·托瓦兹(Linus Torvalds)
    • Linux 之父,创建了 Linux 操作系统的人
    • 一个神话
  • Git 是为了更好的管理 Linux 源代码而设计开发的

Git 的诞生

  • 关于 Git 的作者:Linus Torvalds
    • 创造了 Linux
    • 创造了开源世界
    • Ubuntu
  • 2002 年,林纳斯托瓦兹使用 BitKeeper 作为 Linus 项目的版本控制系统软件
  • 2005 年,大神一怒之下,就短短几个星期之内就诞生了 Git 的最初版本
  • 真正的大规范被开发人员使用大概在 2013 年左右
    • 2013 年之前大部分都是 SVN
    • 目前绝大多数,百分之70-80的公司都在使用 Git 作为自己的版本控制系统

学习资源

安装与配置

通过在命令台输入 git --version 查看是否有 Git 环境。

  • git config --global user.name "你的名字
  • git config --global user.email "你的邮箱

上面的配置用来配置执行 commit 的时候,记录提交者的一些基本的信息(名字+邮箱)。

原理模型

SVN 、Git、Github的使用

基本操作

以后所有的项目文件,都使用 utf8 编码,如果你的文件就是 gbk 编码文件,

你使用 git bash 提交的时候,应该是可以自动转码然后提交的。

建议:以后所有的文件都使用 utf8 编码。

# 在本地当前项目初始化一个空的 git 仓库
$ git init
# 当前当前版本管理状态:未被版本管理的,已修改的、以删除的等文件
$ git status
# 将指定的文件添加到暂存区
$ git add
$ git add .
$ git add --all
$ git add file file [file]
$ git commit -m "提交注释"
# 查看提交日志
$ git log
# 比对文件变动差异
$ git diff

工作区、暂存区、本地仓库

SVN 、Git、Github的使用

工作区就是当前你所能看到的工作目录,你的任何添加、修改删除默认都是在工作区。

暂存区起到两个作用:

  1. 可以分批次的进行提交

假设你很长时间没有做过版本记录提交,例如你修复了某一个功能模块的 bug、开发了某个功能模块、

修改了某些功能模块代码,这个时候就可以利用暂存区分批次的进行提交。

  1. 可以作为一个临时版本存储

例如可以将暂存区指定文件恢复到工作区。

本地仓库就是最终用来存储历史版本的地方,每一次 commit 都会形成一个历史版本保存到本地仓库中。

撤销(时光穿梭机)

使用 Git 强大的撤销功能,可以让你在工作区、暂存区、本地仓库之间来回的穿梭自如,

例如恢复某个误删除的文件,或是恢复某个误修改的文件,

甚至是将整个项目都恢复到指定的历史版本都是可以的。

下面是一些常用的撤销命令,可以自行测试一下:

# 恢复暂存区的指定文件到工作区
$ git checkout [file] # 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file] # 恢复暂存区的所有文件到工作区
$ git checkout . # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file] # 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit] # 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit] # 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit] # 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

总结:Git 提供了很多强大的命令供开发者来使用,并不一定都会用到,以理解交互模型为主,

这些撤销命令可以自行设定场景然后一一进行测试,没有必要全部都记住,真正用到的时候再去查询文档即可。

只要大概有个模糊的映像即可(知道有哪些功能),对于常用的命令,使用多了就记住了,不需要单独记忆。

Git 练习

假设你现在写一个教程类的 Demo,没完成一步小功能或者小模块,你希望能保存一次历史记录方便回顾查看

整个 Demo 的演变进程,例如第一步搭建好了项目骨架,则可以提交一次,第二步完成了首页相关功能,

则再提交一次,依次这样下去,就会形成一步一步的步骤,之后想要查看当初某一步的代码情况,

则可以通过 git reset --hard [commit] 进行查看。

*分支

# 列出所有本地分支
$ git branch # 列出所有远程分支
$ git branch -r # 列出所有本地分支和远程分支
$ git branch -a # 新建一个分支,但依然停留在当前分支
$ git branch [branch-name] # 新建一个分支,并切换到该分支
$ git checkout -b [branch] # 新建一个分支,指向指定commit
$ git branch [branch] [commit] # 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch] # 切换到指定分支,并更新工作区
$ git checkout [branch-name] # 切换到上一个分支
$ git checkout - # 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch] # 合并指定分支到当前分支
$ git merge [branch] # 选择一个commit,合并进当前分支
$ git cherry-pick [commit] # 删除分支
$ git branch -d [branch-name] # 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

推送和获取远程仓库

$ git remote add
$ git push
$ git clone
$ git pull

Github

准备

  • 创建账户

基本使用

  • 创建仓库
  • 连接仓库
  • 公开代码

Pull Request


扩展

  • 环境变量
  • Sublime 插件