Git 常用命令
库管理
克隆库
1 | git clone https://github.com/php/php-src.git |
历史管理
查看历史
1 | git log --pretty=oneline filename # 一行显示 |
标签功能
1 | git tag # 显示所有标签 |
回滚操作
1 | git reset 9fceb02 # 保留修改 |
取消文件的修改
1 | git checkout -- a.php # 取消单个文件 |
删除文件
1 | git rm a.php # 直接删除文件 |
移动文件
1 | git mv a.php ./test/a.php |
查看文件修改
1 | git diff # 查看未暂存的文件更新 |
暂存和恢复当前staging
1 | git stash # 暂存当前分支的修改 |
修改 commit 历史纪录
1 | git rebase -i 0580eab8 |
分支管理
创建分支
1 | git branch develop # 只创建分支 |
合并分支
1 | git checkout master # 切换到 master 分支 |
克隆远程分支
1 | git branch -r # 显示所有分支,包含远程分支 |
修复develop上的合并错误
- 将merge前的commit创建一个分之,保留merge后代码
- 将develop
reset --force
到merge前,然后push --force
- 在分支中rebase develop
- 将分支push到服务器上重新merge
强制更新到远程分支最新版本
1 | git reset --hard origin/master |
Submodule使用
克隆带submodule的库
1 | git clone --recursive https://github.com/chaconinc/MainProject |
clone主库后再去clone submodule
1 | git clone https://github.com/chaconinc/MainProject |
Git设置
Git的全局设置在~/.gitconfig
中,单独设置在project/.git/config
下。
忽略设置全局在~/.gitignore_global
中,单独设置在project/.gitignore
下。
设置 commit 的用户和邮箱
1 | git config user.name "xx" |
或者直接修改config文件
1 | [user] |
查看设置项
1 | git config --list |
设置git终端颜色
1 | git config --global color.diff auto |
MySQL常用语法
常用语法
登录数据库
mysql -h localhost -uroot -p
导出数据库
mysqldump -uroot -p db > db.sql
导入数据库
mysql -uroot -p db < db.sql
// or
mysql -uroot -p db -e “source /path/to/db.sql”
开启远程登录
grant all privileges on ss.* to ‘root’@’%’ indentified by ‘passoword’ with grant option;
// or
update user set Host=”%” and User=”root”
// 注意%是不包含localhost的
flush privileges;
创建用户
CREATE USER ‘test’@’localhost’ IDENTIFIED BY ‘password’;
grant all privileges on . to test@’localhost’ identified by ‘test’;
创建表
CREATE SCHEMA testdb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
赋予数据库权限
GRANT ALL ON testdb.* TO ‘test’@’localhost’;
查看表结构
desc 表名;
修改表名
alter table t_book rename to bbb;
添加列:
alter table 表名 add column 列名 varchar(30);
删除列:
alter table 表名 drop column 列名;
清空mysql表中的记录有以下两种方法:
delete from 表名; 不删除id?没实验
truncate table 表名; 删除主键id
复制表结构
create table b select * from users where 0;
create table a like users;
create table b select * from users limit 0;
复制表
create table c select * from users;
删除表名为MyClass 的表
drop table MyClass; //删除表名为MyClass 的表
SELECT
SELECT * FROM table LIMIT 5;
select * from issu_info limit 7,6; 从第8条开始取,取6条
SELECT name,LENGTH(name)
FROM world
WHERE LENGTH(name)=5 AND region=’Europe’
between
SELECT name, population
FROM world
WHERE population BETWEEN 1000000 AND 1250000
like
SELECT name FROM world
WHERE name LIKE ‘%a’ OR name LIKE ‘%l’
and
SELECT name, area, population
FROM world
WHERE area > 50000 AND population < 10000000
and not
SELECT name,population,area FROM world
WHERE (area>3000000 or population>250000000) and not (area>3000000 and population>250000000)
in
SELECT name, population/area
FROM world
WHERE name IN (‘China’, ‘Nigeria’, ‘France’, ‘Australia’)
case when … then …else…end
SELECT name,
CASE WHEN continent=’Oceania’ THEN ‘Australasia’
ELSE continent END
FROM world
WHERE name LIKE ‘N%’
多个when
SELECT name,
CASE WHEN continent in (“Europe”,”Asia”) THEN “Eurasia”
WHEN continent in (“North America”,”South America”,”Caribbean”) THEN “America” ELSE continent END
FROM world WHERE name LIKE “A%” OR name LIKE “b%”
ORDER BY .. DESC 由大到小排序
SELECT winner,yr,subject FROM nobel
where winner like ‘Sir%’ ORDER BY yr DESC, winner
复合查询
SELECT DISTINCT yr
FROM nobel
WHERE subject=’Medicine’
AND yr NOT IN(SELECT yr FROM nobel
WHERE subject=’Literature’)
AND yr NOT IN (SELECT yr FROM nobel
WHERE subject=’Peace’)
Round
ROUND(7253.86, 0) -> 7254
ROUND(7253.86, 1) -> 7253.9
ROUND(7253.86,-3) -> 7000
CONCAT 将字符连在一起
SELECT CONCAT(region,name)
FROM bbc
select name,CONCAT(ROUND(100*population/(select population from world where name = ‘Germany’),0),’%’) from world
where continent = ‘Europe’
ALL
SELECT name
FROM world
WHERE gdp >ALL(SELECT gdp
FROM world
WHERE gdp>0 and continent=’Europe’)
每一个地区中面积最大的国家,引进x,y做对比
SELECT continent, name, area FROM world x
WHERE x.area >= ALL
(SELECT y.area FROM world y
WHERE y.continent=x.continent
AND area>0)
列出每个大洲和国家的名字第一个字母顺序排列。
SELECT continent,name FROM world x
WHERE x.name = (SELECT y.name FROM world y
WHERE y.continent= x.continent order by name limit 1
)
计算函数
SUM, COUNT, MAX and AVG
distinct去重
SELECT DISTINCT region FROM bbc
ORDER BY
ASC or DESC for ascending (smallest first, largest last) //小,大
GROUP BY 相同分为一组
SELECT continent, COUNT(name)
FROM world
GROUP BY continent
having
可以筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。
SELECT continent, SUM(population)
FROM world
GROUP BY continent
HAVING SUM(population)>500000000
JOIN … ON 多表关联查询
SELECT games.yr, city.country
FROM games JOIN city
ON (games.city = city.name)
SELECT goal.player,goal.teamid,game.stadium,game.mdate
FROM game JOIN goal ON (game.id=goal.matchid) WHERE goal.teamid = ‘GER’
CASE WHEN
SELECT name, population
,CASE WHEN population<1000000
THEN ‘small’
WHEN population<10000000
THEN ‘medium’
ELSE ‘large’
END
FROM bbc
LEFT JOIN … ON … 可以包含左表空值
SELECT games.yr, city.country
FROM games LEFT JOIN city
ON (games.city = city.name)
INSERT
INSERT INTO games(yr,city)
VALUES (2012,’London’);
INSERT SELECT
INSERT INTO games(yr,city)
SELECT yr+12, city FROM games;
UPDATE 更新已经存在的
UPDATE games SET city=’Paris’ WHERE yr = 2004;
DELETE
DELETE FROM games WHERE yr=2000;
CREATE并存入
CREATE TABLE games
(yr INT NOT NULL PRIMARY KEY
,city VARCHAR(20)
);
INSERT INTO games(yr,city) VALUES (2004,’Athens’);
INSERT INTO games(yr,city) VALUES (2008,’Beijing’);
INSERT INTO games(yr,city) VALUES (2012,’London’);
SELECT * FROM games;
auto-increment 自动存入
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
PRIMARY KEY
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)
FOREIGN KEY
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
CREATE INDEX
CREATE INDEX index_name
ON table_name (column_name)
在表上创建一个唯一的索引。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
DROP INDEX
ALTER TABLE table_name DROP INDEX index_name
ALTER 修改,增加表的列
ALTER TABLE games ADD season VARCHAR(6);
UNIQUE约束
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)
update
清空表
清空mysql表中的记录有以下两种方法:
delete from 表名; 不删除id?没实验
truncate table 表名; 删除主键id
导出建表语句
show create table tablename;
复制表结构
create table b select * from users where 0; //复制表结构
create table a like users; //复制表结构
create table b select * from users limit 0; //复制表结构
create table c select * from users; //复制表的sql
排序
ORDER BY .. DESC 由大到小排序
SELECT winner,yr,subject FROM nobel
where winner like ‘Sir%’ ORDER BY yr DESC, winner
复合查询
SELECT DISTINCT yr
FROM nobel
WHERE subject=’Medicine’
AND yr NOT IN(SELECT yr FROM nobel
WHERE subject=’Literature’)
AND yr NOT IN (SELECT yr FROM nobel
WHERE subject=’Peace’)
Round
ROUND(7253.86, 0) -> 7254
ROUND(7253.86, 1) -> 7253.9
ROUND(7253.86,-3) -> 7000
CONCAT 将字符连在一起
SELECT CONCAT(region,name)
FROM bbc
select name,CONCAT(ROUND(100*population/(select population from world where name = ‘Germany’),0),’%’) from world
where continent = ‘Europe’
distinct去重
SELECT DISTINCT region FROM bbc
having
having 可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。
SELECT continent, SUM(population)
FROM world
GROUP BY continent
HAVING SUM(population)>500000000
JOIN … ON 多表关联查询
SELECT games.yr, city.country
FROM games JOIN city
ON (games.city = city.name)
mysql设置权限命令
GRANT ALL PRIVILEGES ON . TO ‘root’@‘%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION;
flush privileges;刷新权限
创建聚合索引
CREATE INDEX index_name
ON table_name ( column1, column2,…);
查询索引
SHOW INDEX FROM table_name
JavaScript 笔记
常用代码
交互
alert();
prompt();
result = prompt(title[, default]);
浏览器会显示一个带有文本消息的模态窗口,还有 input 框和确定/取消按钮。
confirm
result = confirm(question);
confirm 函数显示一个带有 question 和两个按钮的模态窗口:确定和取消。
点击确定返回 true,点击取消返回 false。
多个条件:“else if”
if (year < 2015) {
alert( 'Too early...' );
} else if (year > 2015) {
alert( 'Too late' );
} else {
alert( 'Exactly!' );
}
三元运算符 ‘?’
let result = condition ? value1 : value2
计算条件结果,如果结果为真,则返回 value1,否则返回 value2。
逻辑运算符:|| (或), && (与), ! (非)。
while
while (condition) {
// 代码
// 所谓的“循环体”
}
“do…while” 循环
do {
// 循环体
} while (condition);
循环首先执行循环体,然后检查条件,当条件为真时,重复执行循环体。
“for” 循环
for (begin; condition; step) {
// ... loop body ...
}
通过示例来了解这部分的含义。下述循环运行从 i 等于 0 到 3(但不包括 3)的 alert(i):
for (let i = 0; i < 3; i++) { // 结果为 0、1、2
alert(i);
}
跳过
for 循环的任何部分都可以被跳过。
let i = 0; // 我们已经声明并分配了
for (; i < 3; i++) { // "begin" 部分不再需要
alert( i ); // 0, 1, 2
}
也可以移除 step 部分:
let i = 0;
for (; i < 3;) {
alert( i++ );
}
实际上我们可以删除所有内容,从而创建一个无限循环:
for (;;) {
// 无限循环
}
请注意 for 的两个 ; 必须存在,否则会出现语法错误。
continue; break;
跳到标签
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let input = prompt(`Value at coords (${i},${j})`, '');
// 如果是空字符串或已取消,则中断这两个循环。
if (!input) break outer; // (*)
// 做些有价值的事
}
}
“switch” 语句
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
函数声明
function showMessage(text = "no text given") {
alert( 'Hello everyone!' );
return;
}
命名技巧
showMessage(..) // 显示信息
getAge(..) // 返回 age (gets it somehow)
calcSum(..) // 计算求和并返回结果
createForm(..) // 创建表格 (通常会返回它)
checkPermission(..) // 检查权限并返回 true/false
PS:当 JavaScript 准备运行脚本或代码块时,它首先在其中查找函数声明并创建函数。我们可以将其视为“初始化阶段”.
因此,声明为函数声明的函数可以比定义的更早调用。
pow(x,n)
将 x 与自身相乘 n 次,然后返回结果。
函数表达式
let sayHi = function() {
alert( "Hello" );
};
回调函数&匿名函数
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
ask(
"Do you agree?",
function() { alert("You agreed."); },
function() { alert("You canceled the execution."); }
);
箭头函数
let func = function(arg1, arg2, ...argN) {
return expression;
}
let sum = (a, b) => a + b;
/* 箭头函数更短:
let sum = function(a, b) {
return a + b;
};*/
let double = n => n * 2; 只有一个参数,那么括号可以省略
let sayHi = () => alert("Hello!"); 没有参数,括号应该是空的
编码风格

if (condition) {
// do this
// ...and that
// ...and that
}
“for…in” 循环
为了使用对象所有的属性,就可以利用 for..in 循环。这跟 for(;;) 是完全不一样的东西。
let user = {
name: "John",
age: 30,
isAdmin: true
};
for(let key in user) {
// keys
alert( key ); // name, age, isAdmin
// 属性键的值
alert( user[key] ); // John, 30, true
}
Symbol 是唯一标识符的基本类型
Symbol 使用 Symbol() 创建的,调用带有一个可选的描述。
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
Symbol 总是不同的值,即使它们有相同的名称。如果我们希望同名 Symbol 相等,那么我们应该使用全局注册表:Symbol.for(key) 返回(如果需要的话创建)一个以 key 作为名称的全局 Symbol。Symbol.for 的多次调用完全返回相同的 Symbol。
方法中的 “this”
对象方法需要访问对象中的存储的信息来完成其工作。为了访问该对象,方法中可以使用 this 关键字。
let user = {
name: "John",
age: 30,
sayHi() {
alert(this.name);
}
};
user.sayHi(); // John
this 的值就是在点之前的这个对象,即调用该方法的对象
构造函数
构造函数在技术上是常规函数。不过有两个约定:
他们首先用大写字母命名。
它们只能用 "new" 操作符来执行。这样的调用意味着在开始时创建空的 this,并在最后返回填充的对象。
例如:
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Jack");
alert(user.name); // Jack
alert(user.isAdmin); // false
当一个函数作为 new User(...)执行时,它执行以下步骤:
一个新的空对象被创建并分配给 this。
函数体执行。通常它会修改 this,为其添加新的属性。返回 this 的值。
字符串
字符串可以包含在单引号、双引号或反引号中.
单引号和双引号本质上是一样的。但是,反引号允许我们将任何表达式嵌入到字符串中,包括函数调用.
反引号的另一个优点是它们允许字符串跨行
alert( `My\n`.length ); //length 属性有字符串长度
let str = `Hello`;
alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (an empty string)
数组
let arr = new Array();
let arr = [];
push 在末端添加一个元素.pop 从末端取出一个元素.
shift取出数组的第一个元素并返回它.unshift在数组的前端添加元素
性能push/pop 方法运行的比较快,而 shift/unshift 比较慢。
遍历
let fruits = ["Apple", "Orange", "Plum"];
// 迭代数组元素
for (let fruit of fruits) {
alert( fruit );
}
let arr = ["Apple", "Orange", "Pear"];
for (let i = 0; i < arr.length; i++) {
alert( arr[i] );
}
alert( arr.length );
delete
元素被删除,但数组长度不变
splice
arr.splice(index[, deleteCount, elem1, ..., elemN])
索引,删除个数,替换。并且返回删除的元素
slice
arr.slice(start, end)
它从所有元素的开始索引 "start" 复制到 "end" (不包括 "end") 返回一个新的数组。
concat
arr.concat(arg1, arg2...)
查询数组
这些是在数组中查询某些内容的方法。
indexOf/lastIndexOf 和 includes
arr.indexOf、arr.lastIndexOf 和 arr.includes 方法与字符串操作具有相同的语法,只不过这里是对数组元素而不是字符进行操作:
arr.indexOf(item, from) 从索引 from 查询 item,如果找到返回索引,否则返回 -1。
arr.lastIndexOf(item, from) — 和上面相同,只是从尾部开始查询。
arr.includes(item, from) — 从索引 from 查询 item,如果找到则返回 true。