文章目录
一、版本控制
1.1 集中式与分布式
集中式:svn,cvs
- 优点:代码存放在单一的服务器上 便于项目管理
- 缺点:中央服务器的单点故障
a. 服务器宕机:代码无保障
b.服务器故障:丢失整个项目历史记录
分布式:git,bitkeeper
1.2 git与svn
git | svn | |
---|---|---|
本质 | 分布式 | 集中式 |
存储方式 | 元数据 | 文件 |
分支 | 支路 | 文件目录 |
全局版本号 | 无 | 有 |
完整性 | 强(SHA-1哈希算法) | 弱 |
工作方式 | 将每个版本独立保存 | 记录的是每一次版本变动的内容 |
二、git原理简介
三棵树:
git提交流程:
- 在工作区添加,修改文件
- 将需要进行版本管理的文件放入暂存区
- 将暂存区的文件提交到git仓库
git管理的文件有三种状态:
- 已修改(modified)
- 已暂存(staged)
- 已提交(committed)
- add:把工作区的文件放入暂存区
- commit:把暂存区文件提交到git仓库
- reset:把git仓库的文件还原到暂存区
- checkout:把暂存区的文件还原到工作区
三、基本操作
3.1 设置
签名:
仓库级别:
设置用户名:git config user.name 名字
设置邮箱:git config user.email 邮箱
系统级别:
git config --global user.name 名字
git config --global user.email 邮箱
git初始化:git init
git状态:git status
查看历史记录:git log
暂存区文件覆盖工作区文件:git checkout – xx.xxx
3.2 文件操作
3.2.1 提交文件
- 创建文件 touch 文件名(加后缀)
- 添加到暂存区 git add 文件名(加后缀)
- 提交到仓库 git commit -m 版本描述(必写)
3.2.2 修改文件
- 修改文件内容:vi xx.xxx
- 保存:先按esc进入Command模式,输入:wq
- 添加到暂存区,再次提交
修改最后一次提交:git commit --amend
重命名文件:git mv 旧名 新名
3.2.3 删除文件
git rm xx.xxx(文件名):
该命令删除的只是工作区和暂存区的文件,也就是取消跟踪,在下次提交时不纳入版本管理
git rm -f xx.xxx(文件名):强制删除暂存区和工作区
git rm --cached xx.xxx(文件名):只删除暂存区文件,保留工作区
3.2.4 回滚
git reset HEAD~:
- 移动HEAD的指向,将其指向上一个快照
- 将HEAD移动后指向的快照回滚到暂存区
git reset --soft HEAD~:
- 移动HEAD的指向,将其指向上一个快照
git reset --hard HEAD~:
- 移动HEAD的指向,将其指向上一个快照
- 将HEAD移动后指向的快照回滚到暂存区
- 将暂存区的文件还原到工作目录
回滚到指定快照(不仅往回滚,还能往前滚):git reset 快照id(哈希值)
往前第n个快照:git reset HEAD~n
回滚个别文件:git reset 快照 文件名/路径
3.2.5 版本对比
比较暂存区与工作区:git diff
比较暂存区和git仓库快照:git diff --cached
比较两个历史快照:git diff 快照id1 快照id2
注释:
diff --git a/xx.xxx b/xx.xxx(a是暂存区 b是工作区)
+++新文件;—旧文件
+:对应新加的内容_绿色 -:减少的内容_红色 没有改变_白色
F向下翻页 G向上翻页 Q退出
搜索:/关键词 从上往下?关键词 从下往上
eg:@@ -1,20 +1,28 @@(旧文件显示连续20行,新文件28行)
四、分支
4.1 基本操作
创建分支:git branch 分支名
切换分支:git checkout 分支名
合并分支:git merge 分支名
当想合并的分支与主分支有文件内容不一致时,会发生冲突,需要修改冲突文件
删除分支:git branch -d 分支名
查看带有分支的记录:git log --decorate(可见HEAD指向) --oneline(精简形式) --graph(图形化) --all(所有分支)
4.2 匿名分支
git checkout HEAD~:
创建分支没有名字,当把HEAD指针切换到master上且继续不命名时,匿名分支上的东西将会被丢弃,可用来做测试
4.3 checkout命令
- 从历史快照(或暂存区)中拷贝文件到工作目录(同时覆盖)
- 切换分支
checkout与reset区别:
- 恢复文件
- 共同点:
checkout与reset都可以用于恢复指定快照的指定文件,并且它们都不会改变HEAD指针的指向 - 区别:
reset只将指定文件恢复到暂存区,而checkout命令是同时覆盖暂存区和工作目录;
在恢复文件方面,reset比checkout更安全 - 恢复快照:
- 共同点:
reset:用来"回到过去"的,根据选项的不同,reset命令将移动HEAD指针(–soft)->覆盖暂存区(–mixed,默认)->覆盖工作区(–hard)
checkout:checkout虽然是用于切换分支,但事实上也是通过移动HEAD指针和覆盖暂存区,工作区来实现的 - 区别:
(1)对于reset–hard来说,checkout更安全:checkout在切换分支前会检查当前工作状态,如果不是"clean",无法操作;而reset --hard则是直接覆盖所有数据
(2)更新HEAD指向的方式:reset会移动HEAD所在分支的指向,而checkout只会移动HEAD自身来指向另一个分支
五、github
5.1 功能介绍
- 仓库(repository):存放项目代码,每个项目对应一个仓库,多个开源项目则有多个仓库
- 复制项目(fork):复制出一个独立存在的项目,forked from xxx/xxx
- 发起请求(pull request):向项目原作者提出更改代码的建议
- 事务卡片(issue):发现代码bug,问题
- 收藏(star):收藏当前文档
- 关注(watch):订阅此文档动态
issue与pull request的区别和联系:
- 共同点:
都可以向作者提出问题 - 区别:
issue:指出问题,提供思路_作者修改
pull request:复制项目,修复bug_作者采纳
5.2 git管理远程仓库
克隆工程到本地:git clone http://xxx (url地址)
将本地仓库同步到git远程仓库:git push
5.3 github pages 搭建个人网站
url:https://用户名.github.io
搭建步骤:
- 创建个人站点 ->新建仓库 (仓库名必须是:用户名.github.io)
- 在仓库下新建index.html
注意:
- github pages 仅支持静态网页
- 仓库里只能是.html文件