再谈git和github-深入理解-2
github中的 sloc是什么意思?
sloc: source lines of code: 代码行数, 源代码行.
要向仓库中 create file/upload file/edit file等操作, 你需要在某个分支上才行: you must be on a certain branch.
在github上 创建/修改/删除 一个文件都是一个 commit
一个节点的 父节点(parent version 父版本) 是指比他 更早的 那个提交 节点. 所以 git节点的表示方法是: a <- b <-c (current HEAD)
一次提交/commit等 就是 一个新的节点, 一个新的版本.
git/github的 commitID为什么是7个数字
- (工作树/版本库 的版本号是 5 ~ 7 个数字, 是 commitID的前面几个数字, 完整的commitID是40个字符).
- commitID是一个sha1的160bit, 40个16进制数字, 在 .git/objects中, 根据commitID 进行了目录划分: 一个 commitID的 前两位数字 就是目录名, 剩余的38位数字 组成该目录下的一个文件.
command-line 命令行(是 一个完整的 "单词")
git rm 怎样用?
- git rm : to remove files from the working tree and from the index
- git rm 的用法: git rm [options] [--] ...
- git rm的选项: -f = --force, -q = --quiet, -r 递归删除
- git rm --cached: 只是 从删除 暂存区删除, 而工作树 中的对应文件并不变, 因此, git rm 总是要从index 区删除的, 要用 git rm删除的文件 必须是已经 被 git add 添加到 staged 区域了的. 否则就会报错...
- git命令中的 "通用"选项 [--] 两个横线, 它是一种 "分隔符" 用来分隔 前面的命令行选项options 和 后面的文件列表(因为linux下文件名称可以是 类似 --cached 这样的), 以免文件名被误认为 是 选项 : it can be used to separate the command-line options from the list of files. (useful when files might be mistaken for command-line options)
be mistaken for:
被误解(成....)
git 中的工作树和 工作区?
两者其实是一样的: 都是用户编辑/工作的目录, 叫工作树 working tree可以, 叫 工作区 working space 也可以
同样的, 本地仓库 也叫: 版本库, 数据库 都是它
git的index/stage 暂存区是git高效 的关键所在, 是git设计的关键点.
git rm 删除 '--cached' 文件?
- 如果要删除 以 横线- 或 双横线开头 的文件, 不能直接
rm -file/ --filename
因为会把这些当做是 命令的选项, 应该要指明 其路径,比如:rm ./-file 或 rm ./--filename
- git rm 'file' 不能删除文件, 但是 直接用 rm就能删除? 报错: fatal pathspec 'fielname...' did not match any files? 是因为, git rm (或 git rm --cached) 总是要从 stage区删除文件, 如果文件没有被 git add, 处于 untracked 状态, git没有对该文件进行管理/索引/跟踪的话, git就会 "视而不见" 说找不到这个文件了, 因此, 如果确实要用 git rm来删除的话, 就一定要先 git add...
在shell中, $str是表示变量 的引用, 如果要对字符串进行 处理/运算, 要使用 花括号, 比如: ${...}
有哪些运算符:
- 只有当 # 在字符串前面 , 表示求长度
${#str}
- 其余的都是 运算符都在字符串后面 , 比如
${str#*/}
字符串截取方法
有3种截取符号, 用# 截取; 用 % 截取; 用冒号截取
${str#/} ${str##/}: # 表示从左边截取, 保留右边; 通配符 * 在 截止字符的左边, 实际上, 常常有这样的需求: 要截取取的范围是: 第一个和最后一个截止符: 两个##表示匹配最后一个 截止符;
${str% /} ${str%% /} % 表示从右边截取, 保留左边; 所以通配符 * 在截止符的右边; 两个%% ...
${str:0:7} ${str:0} ${str:0-4:3} ${str:0-4} 表示从 ? 位置开始, 截取多少个字符.
如何指定css文件的字符编码?
- 当css文件中, 出现"非ascii"字符时,比如:
font-family: venda, '宋体',...
时, 才需要指定编码 - 指定方法是: 在css文件的开头写上"标记" : @charset 'utf8'
- 如果没有指明 @charset , css文件将使用对应的html中的字符编码.
- html4中的 link标签有 charset这个属性, 但是h5中则废弃.
git status -s?
-s = --short 是指 用剪短/简洁方式 列出 staged/but uncommitted的文件和 untracked文件. 其中的A是 是已经 added的 , ?问号是没有 被tracked的文件
每次提交前, 用 status命令查看, 是一个 好习惯!
- 已经 committed的文件用 log命令查看.
- 如果文件已经被add到 index区了, 即 have been staged. 要从暂存区删除, 即unstaged, 使用 : git rm --cached -- ...
关于git 中的 checkout 命令: 这是一个 非常 "危险的命令", 是对("未提交到 暂存区的") 工作区/或 暂存区中的 文件的 修改/编辑/ 你前面所做的 工作的 放弃/cancle/discard! 差不多相当于 对文件的 rm命令. 所以要 小心使用!
同时也可以看出, 在使用 git 的过程中, 要及时 使用 git add命令! 这样 才能把 你的所做的修改等工作 提交到 暂存区( 更新暂存区的虚拟目录树, 同时修改内容 也被 存储到 objects 对象库中). (相当于 在 word中 编辑文档的时候 要时常记得 ctrl+s保持)
参考: http://www.worldhello.net/2010/11/30/2166.html
感觉这个里面讲得很好, 很通俗易懂! 特别是那个图很明了!
git为什么设计 index暂存区? stage的作用? 是为了便于 跟踪工作区的文件, 通过检测 工作树中文件的 时间戳/文件size等来判断文件是否发生了 changes, 从而提示用户提交和保持更改.
当执行 "git status" 命令扫描工作区改动的时候,先依据 .git/index 文件中记录的(工作区跟踪文件的)时间戳、长度等信息判断工作区文件是否改变。如果工作区的文件时间戳改变,说明文件的内容 可能 被改变了,需要要打开文件,读取文件内容,和更改前的原始文件相比较,判断文件内容是否被更改。如果文件内容没有改变,则将该文件新的时间戳记录到 .git/index 文件中。因为判断文件是否更改,使用时间戳、文件长度等信息 (文件的元信息) 进行比较要比通过文件内容比较要快的多,所以 Git 这样的实现方式可以让工作区状态扫描更快速的执行,这也是 Git 高效的因素之一。
文件 .git/index 实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的 内容并不存储其中,而是 " 文件的真实内容 和 修改" 保存在 Git 对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。
github上 添加文件 New file, 通过分支来添加??? 测试pull?
content可以用作复数, 也可以用作单数
- 复数时,表示 "包含的内容物"
- 单数时, 表示 抽象的含义, "要旨, 含义"等
通常用作复数的形式要多一些
ls / ll 默认的情况下, 是显示 目录中的内容.
有时候, 我们只是想查看目录本身, 那么 同样的命令, 要使用 -d 或 --directory 选项.
比如: ll -d [DV]* /home
关于shell中的字符颜色表示方法?
- 在shell中, 中括号是有特殊含义的, 表示的是 多个字符中的其中之一, 如果要表示 中括号的本义, 就要 用转义: [ ]
- shell表示字符颜色, 转义符可以用 \e 或 \033 来表示, 要注意 \033一定要加上最前面的数字0, 表示 是 8进制数字?? 如果写成 \33是不会被转义的.
表示颜色的转义字符串, 要放在 [和m之间. [表示起点,m表示 终点. 所以echo -e '\e[1;32m abc' 或者: echo -e '\033[1;32m abc'
将输出绿色的abc. - 表示颜色不需要在颜色前后 加上 中括号的!
git的remote操作?
git remote: 显示 远程仓库的简短信息(名称)
git remote -v 显示远程仓库的 简短名称 和 详细地址(包括fetch抓取 + merge合并)
git remote add shortName repos_addr 添加远程仓库: shortname: 简短名称(简名/别名) 后面是远程仓库的详细地址
- 默认的clone的远程仓库, 的 简名叫做 orign, 只有这个你才可以 push上的
git的push和pull?
- push是将本地仓库 (的 修改) 推送到 /提交到 远程 仓库
- pull 则是 将远程仓库的内容 拉取到 本地机器的 工作树. 主要是在 当远程仓库有更新了, 而本地仓库还没有这些更新; 或者是 当从本地仓库 push到远程仓库时 发生 conflict冲突了, 说明 远程仓库上 (的某个同名文件) 有 本地仓库 所没有的更新了, 也就是 本地仓库 :out-of -date了. 这个时候, 就要将远程仓库 pull到本地 机器的工作区, pull的时候, 会报错, 有冲突
push 失败的原因?
error: failed to push some refs to 'https://github.com/onprinciple/onprinciple.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. (因为别人做了的工作, 事先push到远程仓库了, 你当然不能直接push了, 因为如果可以直接push的话, 就会将别人的工作给覆盖掉, cancel掉了) You may want to first integrate the remote changes (所以需要 整合 远程的 更改, 整合就是 先pull下来, 然后消除conflict, 然后再push)
hint: (e.g., 'git pull ...') before pushing again.
在push的时候 注意两个问题:
- 当你要push时, 如果别人(的仓库)已经 push过一次代码到远程仓库了, 那么这时候 即使 是 你的本地工作区中的文件代码 (内容) 跟远程仓库上的 同名文件的内容 完全一样的, 也会报上面的错. 这时候, 仍然要先 pull一次(integrate 整合一次)
- 当pull时, 自动成功的进行merge时, 只有三种情况:
- 那就是你工作区的同名文件的内容 跟远程仓库中的 同名文件的内容完全一致,
- 或者前面的完全相同, 而另一个文件(不管是本地仓库的还是远程仓库的)的内容 更多一些;
两者在对应位置的行, 一个文件的..为空, 另一个文件的...不为空, 有内容...
什么叫冲突: 就是本地仓库跟要push到的目标 远程仓库 中, 有 同一个名称的 文件: 在相同位置处的内容 不同. 当pull的时候 "本地仓库的同名文件会自动的和 远程仓库的同名文件 合并: merge (当merge的时候,如果发生了冲突) :会将冲突记录到 一个同名文件中, 这时候, 只要 将同名文件中 冲突的内容 处理后, 就可以再add, 再commit, 再push了.
什么时候会冲突? 并不一定两个文件 的内容不同 , 合并时就一定会发生冲突, 所谓冲突是指: 两个同名文件, 在同一个位置处 (同一行, 同一列的位置处) 两者的内容不同. 因为合并后 在同一位置处的内容 只能有一个样, 只能保留 其中一个内容.
但是 在不同位置, 不同行中的内容可以不同 , 实际上内容是 可以 "互补的"
git status -s(--short简短输出)的结果输出中, M(= modified)表示 该文件有内容的修改! 如果是新增 的untracked文件, 会显示 两个红色 的问号??
git的好处之一是: 每操作一步, 后面都会有相应的提示, 提示你下一步该怎样做/做什么. 比如 committed后, 会提示你 " use 'git push' to publish your local commits"
username or password is hidden intentionally: (故意隐藏的)intent: 目的, 意图; intention 目的/意图; intentional 有意的, 故意的; intentionally: 故意地, 有意地.
commit时 message是必须的 , 否则单是 git commit
命令的话, 会打开vim编辑器提示你输入 commit msg. 如果msg为空, 将放弃提交: Aborting commit due to empty commit message
history : historian: 历史学家
'annotate 重音在最前面: vt. 注释, 注解
关于 git tag命令
- git tag [-l]
再谈git和github-深入理解-2的更多相关文章
- 再谈git和github-深入理解-3
git tag -a 和 -m的区别? -a是 注解 是单词 "annotate"的意思 , 表示 "给标签一个名字, 标签名 -m 是创建标签时的消息备注 git ta ...
- 再谈git和github-深入理解
git中的 objects 和 refs 是什么? 目录objects是仓库的 "对象库" , 是包含 代码, 提交, 日志, 信息, 索引等信息的关键所在 refs是一些 sha ...
- 再谈git的http服务-权限控制gitweb版(未成功)
截至目前,对gitweb的掌握还没达到最终目标,仅仅实现了通过浏览器来浏览项目,通过git命令仍然未能clone项目.但仍然要记录下来,主要是因为打算暂时放弃这条路,而所收获的一些经验还是要记录下来. ...
- 再谈git的http服务-权限控制hooks版
通过git-http-backend方法提供的http服务基本上可以做到认证用户才能使用,但只能控制到服务器路径访问,而且无法区分读写.经过不懈努力,找到了方法,相关脚本及配置见后. 基本思路就是利用 ...
- 再谈git的http服务
因为git服务器搬迁,需要重新安装git服务器,在网上搜索了下,发现之前的方法太复杂,复杂到自己都没彻底弄明白.其实通过git自带的git-http-backend脚本配合apache2的http服务 ...
- 透过SourceTree再谈Git
初出茅庐之基础篇 1. Download SourceTree from: https://www.sourcetreeapp.com/ 2.Complete the installation. 3. ...
- 谈对“Git”的认识与理解
自诞生于2005年以来,Git日臻完善,在高度易用的同时,仍然保留着初期设定的目标.它的速度飞快,及其适合管理大项目,它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求.接着说说 ...
- git和github入门指南(6)
6.交作业的流程 以下内容是螺钉课堂在线就业班提交作业的要求,非螺钉课堂在线就业班学员不用学习 螺钉课堂作业全程采用git管理,希望在日常使用中,加深对git和github的理解 具体流程: 1.注册 ...
- git和github的关系以及简单易懂的理解
git和github的关系 写在前面:我身边好多人问我git和github的区别,想必对于好多人没学过的大佬们恐怕也是一脸懵逼,但是不知道也是不行的,所以我今天就来讲一讲这二者的区别和联系. 用一 ...
随机推荐
- Date类型与字符串之间的转换
Java中Date类型与字符串转化 (一)Date与字符串的转化 Date.String.Timestamp之间的转换! public static void main(String[] ...
- 前端上传 base64 编码图片到七牛云存储
参考文档 如何上传base64编码图片到七牛云 调试过程 文档中分别有 java 和 html 的 demo,可以根据文档示例调试. 下面是我调试的过程,可以作为参考,特别注意的是,如果需要给文件起名 ...
- 关于histry的pushstate 和 popstate事件的应用
这篇文章是基础:http://www.cnblogs.com/kaituorensheng/p/3776527.html: histry的单页面应用有两个写法:哈希值和?: 哈希值例子: 实现效果:点 ...
- Oracle课程档案,第三天
count(*):有多少行,对行做统计 count(x):列.... sum:和 avg:平均值 min:求最小值 max:求最大值 distinct:取出重复的值 count:计数 group by ...
- IIS多个应用程序共享Session
在应用程序目录下面添加一个Global.asax文件,在文件中添加以下代码: public override void Init() { base.Init(); foreach (string mo ...
- python-获取当前工作路径
1.sys.argv[0] import sys print sys.argv[0]#获得的是当前执行脚本的位置(若在命令行执行的该命令,则为空) 运行结果(在python脚本中执行的结果): F:/ ...
- consul服务配置维护
1.命令参数 -advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,默认情况下-bind地址就是展现地址,然而也存在一些路由地址是不能受约束的,这时候会激活一个不同的地址来供应, ...
- linux安装jdk mysql
mysql 安装进入到mysql官网 点击archives 选择版本下载tar linux 安装mysql数据库——tar.gz包解压安装法 mysql数据库有多种安装方式,本文只介绍在Linux服务 ...
- 关于Oracle归档的一些操作
1.查看日志模式archive log list,或者select name,log_mode from v$database; 2.数据库非归档模式改为归档模式: 关闭数据库:shutdown im ...
- Django基本配置与URLconf
what's the Django python的框架主要有:Django.Flask.Tornado Django是一个开放源代码的Web应用框架,由Python写成.它的主要特点是大而全,我们需要 ...