git曲线
git 更新牵涉到三个地方的内容: ??
(pull下来的) 正在编辑的目录, 即工作空间;
本地的仓库; (这个动作叫 : commit)
github.com上的服务器即 refs (这个动作叫: push)
----------------------------------------------------------------------
所有对仓库的操作,都要经过git来做...
rm是对本地仓库的文件和目录进-+行操作; commit也是对本地仓库的操作;
push才是对remote的refs服务器进行操作
add是将工作空间所做的修改(文件/目录的增删改)做一个标记, 在下一次commit时一并提交到本地repository.
-----------------------------------------------
原则上vim可以无限制地新开窗口, "这里所说的窗口"不是新的 程序窗口, 而是同一个窗口中的"窗格"
看vim在哪一个窗口, 主要是看它的"状态栏", 状态栏高亮显示的即为当前窗口; ctrl+WW是按顺时针方向轮转的
func! 加上感叹号, 是为了防止 vimrc这个配置文件重新载入时, 报错/出错
关闭其他窗口: ctrl+w o = :only
强制命令! 总是放在最后的: 如对多个文件都放弃保存并且退出: qa!
vim分割窗口, 在纵向方向上可以不同, 而在水平方向上要保持一致, 使用^W +/-, :res n/+n/-n, : vert res n/+n/-n,
所有这些操作都可以用鼠标来实现.
vim的多标签: 在高亮显示的/并且是凸起来的标签, 表示是当前活动的; 灰色(或灰色底子的) /凹陷下去的是inactive tab.自己设计程序界面的话,
也应该是这样的. 首选的是使用buffer, 其次才使用tab, 切换标签的快捷命令: gt, gT.
::: 让vim的工作目录自动切换到当前打开的文件所在的目录: set autochdir
vim中的大小写转换(是针对文章的字符而言的): great(大小写) u, U : gu, gU , ~翻转. 可以对gu gU 进行限定, 一般是在后面进行限定,对于行的操作, 把限定行号放在前面.同时vim命令中当前位置通常省略不写: guu, gUU, g~~, gU$, gu0, 3gUU, gggUG(全部转换为大写)
:vim的命令行实际上就是一个bash-like, 可以看成是一个bash, 完全支持bash的操作: ctrl+p/n, ctrl+h, 支持tab补齐, 支持ctrl+d:
ctrl+d将会把以当前字母开头的所有命令列出来, 如果直接type: ctrl+d, 将会把所有的命令行命令都列出来.(从而可以查看/学习)
:支持简写, 只要该简写没有其他模糊confused, 二义性的命令都可以直接执行,不用像bash那样一定补齐
-----------------------------------------------------
实际上git的操作和yum的操作类似: 他的一些操作和本地的操作如:rm, mv等类似:
git共涉及三个地方: working directory, staging index,
有三种vcs: local vcs, centralization vcs, distribution vcs> 本地化/集中/分布式控制系统
vcs 和cvs的区别?
vcs: version control system
cvs: con'current [k^n'k2r2nt] version system : 并行(同时发生)版本控制.
git的算法本质是每次版本保存一个文件快照snapshotA(a1,b,c) snapshotB(a2,b,c2)...
svn的算法本质是每次版本仅保存文件之间差异,delta1,....
git分支默认的是一个master, 每次提交时会将master指针指向当次commit的snapshot快照
git鼓励分支, 可以在不同的分支上开发下去, 形成几个方向:
git版本控制信息存储的原理: 是让当前分支的指针(用head指针来表示)指向所在的分支, 这个分支是和一个文件快照snapshot相对应的: : 创建一个分支实际上是创建一个文本文件, 里面只有40个字符(是
所指对象的sha-1校验码)...所以创建和删除一个分支的开销成本极小, 而且跳转到某个版本也极为快速...
创建分支: git branch brach2, 查看分支: git branch, 或git status.
git checkout的作用有两个: 一是获取分支的内容, 二是切换分支: git checkout another-branch.
-------------------------------------------------------------------
git commit -am "msg": 中的-a表示 --all: 表示: automatically add changes of all known files and remove files from the index that have been removed from the working tree
-a 会影响所有已经在index中的文件, 但不会影响没有加入到staging index中的文件...
gnu nano: 纳米: 是一个编辑器:
修改错误跟踪系统iss53的错误:
git checkout -b iss53: =git branch iss53 + git checkout iss53: 创建一个分支并切换到那个分支.(参数-b就是那个功能)
分支的合并:
git中的分支使用得非常频繁, 非常普通的, 每次在修改/修补, 进行新的动作之前, 最好都是在新建一个新的分支然后进行开发操作, 而不会
影响原来的版本:
git 合并: : 首先切换到master分支:git checkout master , 然后合并: git merge testing.
git merge合并其实就是指针(分支就是指针)的移动, 将master指针 fast-forward 快进移动到 testing指针上.
合并后,需要把非master分支删除(因为这个和master指针分支是相同的): git branch -d testing.
注意::: 对于没有共同祖先common ancestor的分支合并, git会自动寻找到一个合适的"最近"的共同祖先, 然后三方(祖先方/合并双方)
共同算法,得到一个合并后的分支... (就是要明白git的分支/版本的数据结构)...
--------------------------------------------------------------
以上都是在本地的仓库中进行的操作, 要在本地和远程仓库之间进行操作,需要用 git push (向上提交:从本地到远程), git pull(从远程到本地)
但是如果远程服务器上的文件被另外一个本地机器事先进行了push操作后, 再提交就会有冲突..
(git: gnu interactive tools: gnu交互工具):: 是取代bitkeeper, " stupid content tracker" , 最后由"主开发者"向"公共服务器"push代码...
git help some-command: :git commit...其中git是命令command, commit是子命令: sub-command,
git add 可以跟踪文件夹下的所有文件: git add ./path/to/your/path, git add -A....
git add 是脚本命令, 是git内核命令 update-index内部命令的"别名"
git reset HEAD <filename> 删除index中新增的文件...
git diff:是比较"当前工作目录" && "数据仓库"中的文件的内容的差别.... 用patch的格式给出:
通常建议使用 -d 参数来删除分支,以防无意的信息丢失
----------------------------------------------
查看git版本的世系变化:
git show-branch
git diff ver1 ver2
git whatchanged
git 合并冲突?
为了保存多个人的工作, 需要把每个人自己创建的分支进行合并, 以便保留多人合作开发的成绩和工作.
2-way 两路合并: 合并merge的方法是:
1, 切换到master, 然后,将其他分支中有的文件/而master中没有的文件记录在master中去,
2,, 如果被合并分支和master中都有的文件(文件名相同的两个文件): 将两个文件的内容进行比较,
- 先后的行合并,
- 但是当相同的行, 内容相同时, 取相同内容,
- 但是当相同的行上, 内容不同时, 则会发生"conflict"冲突.
(通常的解决方法是: 要么: 取其中的某一个patch, 抛弃另一个patch, 要么综合两个文件的patch都要都保留)
git commit -m "sss" -i hello???
git 中的refs: 是指git的索引或参考,保存的是 HEAD当前头指针指向的内容??
Git 中,我们称之为“引用”(references 或者 refs,译者注)。你可以在 .git/refs
目录下面找到这些包含 SHA-1 值的文件 (这个是明确肯定的说法了, refs 主要是用指针名称来代替具体的"提交/添加等操作"的标志字符串sha-1字串...
我认为你应该这样来理解分支的概念:它是用来标记特定的代码提交,每一个分支通过SHA1sum值来标识,所以对分支进行的操作是轻量级的--你改变的仅仅是SHA1sum值。
分支确实有些特殊的属性——其中最重要的是,如果你在一个分支进行作业并创建了一个新的提交(commits),该分支的顶端将前进到那个提交(commits)。这正是你所希望的。当用git merge 进行合并(merge)的时候,你只是指定了要合并到当前分支的那个并入分支,以及当前分支的当前进展