1.1 SVN 总结以及使用建议
- 每一次保存历史记录实际上就是一次提交
- 什么时候去保存历史记录?
- 完成了一个具体的功能模块
- 代码运行没有bug
- 当天工作结束提交一次
- 没有 bug 的前提下去提交一次
- 关于历史记录版本
- 只要想要保存历史记录就必须通过服务器
- SVN 使用数字作为版本的唯一标识
- 即便同时有多人提交,也是按照顺序的版本号增长
-
关于版本冲突
- 例如服务器中的最新版本是 4, a.txt文件中有一段内容:
hello
- 张三 4 和服务器同步的版本
- 修改了 a.txt :
hello world
- 提交变动,保存历史记录,服务器直接就接受,版本升级为 5
- 修改了 a.txt :
- 李四 4 和服务器同步的版本
- 修改了 a.txt:
hello lisi
- 提交变动,保存历史记录,服务器会告诉你先和服务器上的版本更新同步然后再提交
- 更新:
- 5:a.txt :
hello world
- 4:a.txt :
hello list
- 5:a.txt :
- 修改了 a.txt:
- 解决冲突:
- 冲突的地方:
- 使用别人的
- 使用你自己的
- 使用别人和你自己的
- 冲突的地方:
- 例如服务器中的最新版本是 4, a.txt文件中有一段内容:
使用建议
- 每次提交之前,先更新
- 更新如果遇到冲突,先解决冲突,再提交
- 由于解决冲突很耗时,多跟你的同事口头交流
- 例如你改这个文件的时候,告诉被人不要改
- 或者别人改这个文件的时候,你不要改
- 就是这样的方式可以最大程度的避免冲突
1.2 SVN 弊端
集中式版本控制就是集中的把源代码放到一个线上的仓库中,任何提交都围绕着*服务器进行。
这种方式最大的好处就是模式简单,可以很快上手使用版本控制,但是也带来了一些问题:
- 每一次提交都必须联网
- 很耗时
- 例如 Git 就可以本地保存历史记录,不需要联网
- 一旦服务器宕机或挂掉
- 没法保存历史记录了(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
或者 konsole
、gnome-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
- CLI(Command Line Interface) 程序:命令行应用程序
常用工具型命令
- 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 作为自己的版本控制系统
学习资源
- http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- git - 简明指南
- 猴子都能懂的Git入门
- 菜鸟教程:Git 教程
安装与配置
通过在命令台输入 git --version
查看是否有 Git 环境。
git config --global user.name "你的名字
git config --global user.email "你的邮箱
上面的配置用来配置执行 commit 的时候,记录提交者的一些基本的信息(名字+邮箱)。
原理模型
基本操作
以后所有的项目文件,都使用 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
工作区、暂存区、本地仓库
工作区就是当前你所能看到的工作目录,你的任何添加、修改删除默认都是在工作区。
暂存区起到两个作用:
- 可以分批次的进行提交
假设你很长时间没有做过版本记录提交,例如你修复了某一个功能模块的 bug、开发了某个功能模块、
修改了某些功能模块代码,这个时候就可以利用暂存区分批次的进行提交。
- 可以作为一个临时版本存储
例如可以将暂存区指定文件恢复到工作区。
本地仓库就是最终用来存储历史版本的地方,每一次 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 插件