git 状态基础

我们本地的git目录下, 其实分为三种类型的文件: working tree、index file和native repository;
working tree就是我们当前修改的文件;
在使用"git add"命令后, git就会把diff合入index file(通过“git diff”来查看working tree与index file的差别);
再使用"git commit"命令, 把修改合入native repository("git commit -a"相当于"git add" + "git commit"; 在commit之前, 可以通过""git diff --cached"来查看index file与commit的差别);

其实, 还可以使用"git reset"命令来还原git节点.
"git reset --hard patch-hash-name" 可以使working tree、index file以及native repository彻底回复到指定的节点;
"git reset --mixed patch-hash-name" 可以使index  file和native repository被还原;
"git reset --soft patch-hash-name" 可以使native repository被还原;
git 工作区 和暂存区 各个分支用的是同一个,仅仅提交的时候由于指针指的地方不同,令我们感觉似乎在不同区间上面工作,且git限定我们 工作区间被修改(如 index.jsp 被修改或被git add但是未 commit) 此时 git是不允许git checkout (切换分支的)

git push策略

  • nothing 什么都不干(估计只是测试用的)
  • matching 本地所有的分支都Push上去, 这个并不好, Git 1.x的默认策略
  • upstream/tracking 当本地分支有upstream(也就是有对应的远程分支)时Push到对应的远程分支, tracking是upstream的别名, 但已经被标记为deprecated。
  • simple 和upstream一样, 但不允许将本地分支提交到远程不一样名字的分支, 在Git 2.0之后simple会成为新的默认策略
  • current 把当前的分支Push到远程的同名分支

参考: http://blog.angular.in/git-pushmo-ren-fen-zhi/

  • **nothing** - push操作无效,除非显式指定远程分支,例如git push origin develop(我觉得。。。可以给那些不愿学git的同事配上此项)。
  • **current** - push当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支。
  • **upstream** - push当前分支到它的upstream分支上(这一项其实用于经常从本地分支push/pull到同一远程仓库的情景,这种模式叫做central workflow)。
  • **simple** - simple和upstream是相似的,只有一点不同,simple必须保证本地分支和它的远程 upstream分支同名,否则会拒绝push操作。
  • **matching** - push所有本地和远程两端都存在的同名分支。

gf和grb之后为什么权限变掉了

理解linux的权限 - ls -l列出权限
ll #会有列出来.
1. 第一组10个字符:
 - 第一列代表文件类型, - 文件, d 目录, l 软连接.
 - 然后9位权限码, 拥有者, 组, 所有人
2. 第二列, 然后是硬连接数
3. 第三列, 拥有者
4. 第四列, 所属的组
5. 第五列, 稳健的字节数
6. 第六列, 修改时间.
7. 第七列, 文件名.
改变权限
chgrp 组名  文件或目录 #改变所诉用户组.
chgrp users a.txt
chown 账号名称 文件或目录 #改变文件所有者.
chown 账号名称:组名 文件或目录
chown root:root a.txt
chmod 770 a.txt #改变文件权限
owner, group, other顺序

默认权限

umask #查询权限默认情况.
umask 022 #改变权限的默认情况.
#系统会对比命令要求和默认权限限制之间的关系, 决定给文件什么权限.