git命令之reset
reset命令用于重置到某个状态。
常用的命令如下
git reset
将所有add到缓存区的操作撤销,如果需要对某个文件撤销,可以使用git reset 文件名git reset –hard
撤销所有的修改,可以在–hard后添加版本后,表示reset到某个版本
参考资料:
reset命令用于重置到某个状态。
常用的命令如下
git reset
将所有add到缓存区的操作撤销,如果需要对某个文件撤销,可以使用git reset 文件名
git reset –hard
撤销所有的修改,可以在–hard后添加版本后,表示reset到某个版本
参考资料:
在使用git时,checkout也是一个常用的命令。
git checkout -b <branch> --track <remote>/<branch>git branch foo和git checkout foo两条命令git fetch origin feature-name进行拉取。参考资料:
理解了fetch和merge后,之后再来看git pull就容易多了。在git的官方文档上,有git pull is shorthand for git fetch followed by git merge FETCH_HEAD,也就是说git pull是git fetch和git merge的结合,只是这里的merge是fast-forward方式。
依然在test-git仓库上进行测试,
使用`git log –graph –pretty=oneline –abbrev-commit`查看log,
1 | * dee871e Merge remote-tracking branch 'origin/master' |
git pull直接拉取远程分支的变化得到的git fetch origin master和git merge --no-ff origin/master两个命令后的结果。从上面的结果可以看出,使用git fetch和git merge --no-ff更能保存仓库版本变化的轨迹,推荐使用这种方式。
参考资料:
分支操作是一个常见的操作。当在某一分支开发完新功能后,需要合并到master分支,此时就需要使用merge命令。
merge有两种方式,一种是fast-forward, 一种是非fast-forward方式。
这两种方式的差别在于是否保留分支合并的信息。为此特意在github上建了一个test-git仓库。
使用git log --graph在master分支上查看log时,可以很方便的看出两种方式的区别。这里添加了一些参数,使结果更简洁
`git log –graph –pretty=oneline –abbrev-commit`
1 | * 6ce6fab Merge branch 'feature-noff-merge' |
参考资料:
在开发新功能时,需要创建分支,此时branch命令派上用场了。branch的一些常用命令如下
git branch foo 创建foo分支
git branch -d foo 删除foo分支
当只是想拉取远程分支时,则需要添加参数, git branch foo --track origin/foo 同步远程foo分支。但是,拉取远程分支有更常用的命令git checkout foo
git branch -r却看不到这个分支,这是因为还没有拉取这个分支到本地,此时使用git fetch origin feature_name拉取分支后,再次执行git branch -r即可看到分支参考资料:
有些时侯我们想知道一个文件的某一行在哪一个版本里被谁修改的,此时git blame就派上用场了。
官方文档里描述如下1
git-blame - Show what revision and author last modified each line of a file
参考资料:
在使用git的过程中经常遇到这个问题。明明使用git status看到Your branch is up-to-date with 'origin/dev'. , 但添加自己的修改,提交之后,发现远程分支已经有了修改。这是为何?现在终于明白这个原因。
这里设计到三个概念,本地的dev, 本地的origin/dev, 远程的dev。上面提示中的origin/dev指的是本地的origin/dev,而不是远程的dev. 虽然本地的dev is up-to-date with本地的origin/dev但,origin/dev并没有与远程的dev同步。所以当我们向远程dev push时,才会提示有冲突。
要想让本地的origin/dev与远程的dev同步,可以执行 git fetch origin dev, 发现有了更新
1 | * branch dev -> FETCH_HEAD |
此时再次执行git status, 就会提示已经落后了, Your branch is behind 'origin/dev' by 8 commits, and can be fast-forwarded.
之后使用merge命令将本地的origin/dev合并到本地的dev中git merge --no-ff origin/dev
参考资料:
当你在一个分支中进行修改时,想切换到另外一个分支,但你目前的修改还不能commit, 因为是不完整的,此时stash命令就可以派上用场。
使用git stash操作将目前的操作保持起来,然后切换到另外一个分支,干活完成后再切回来。此时使用git stash apply将之前的操作恢复。
此外还有一些stash操作如
有一个需要注意的是,在一个分支中stash起来的修改,也可以应用于其它分支。所以git stash apply时一定要注意分支是否匹配。
其实这也隐藏了stash的一个功能。当你在一个分支上进行修改时,发现你想修改的是另外一个分支,此时你不想reset掉修改。stash派上用场了,先git stash将修改保存起来,然后切换到另外一个分支,之后git stash apply, 这样修改就应用与另外一个分支了。
参考资料:
在公司的代码里见到下面两个正则,我认为可以进行优化,所以拿出来说说。
url(r'^api/(?P<model>(sku|hiring|news|enterprisenews)+)/?$')这个正则的目的主要是匹配sku,hiring,news等模块,然而它也可以匹配skusku,skuhiring等等,这并不是我想要的。虽然最终不影响代码执行,但能够精确的就应该精确,因为计算机如此精确。所以把+号去掉是最好的写法。
var reg = /^.+\/(activitydocument\/.+)$/;这里正则的目的是将http://.../activitydocument/...等链接替换成activitydocument/..., 因为+号是贪婪的,所以它会一直匹配到末尾,然后开始往回退,这样会影响性能。正确的做法是使用非贪婪。即改成/^.+?\/(activitydocument\/.+)$/;
在《正则指引》中,P305页有一个匹配HTML tag的例子,</?[a-z][-a-z0-9_:.]*(?=[\s>])('[^']*'|"[^"]*"|[^'">])*>,但它不能匹配
等标签,以及不能匹配HTML注释,需要另外处理。
自从写了Elasticsearch从MySQL到数据,收到几位同学的来信,主要是问如何使用elasticsearch-jdbc进行增量数据导入,这里还是写写具体操作。这里以从Wordpress导数据为例。
curl -XPUT ‘localhost:9200/article?pretty’
curl -XPUT ‘localhost:9200/article/_mappings/blog’ -d ‘@mapping.json’
mapping.json内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25{
"_all": {
"enabled" : true,
"analyzer": "ik_max_word_syno",
"search_analyzer": "ik_smart"
},
"properties": {
"id": {
"type": "string",
"index": "not_analyzed",
"include_in_all": false
},
"title": {
"type": "string",
"analyzer": "ik_max_word_syno",
"search_analyzer": "ik_smart",
"boost": 2
},
"content": {
"type": "string",
"analyzer": "ik_max_word_syno",
"search_analyzer": "ik_smart"
}
}
}
分词配置可参看
Elatcissearch中ik添加同义词
到elasticsearch-jdbc的bin目录下,查看mysql-blog.sh文件, 内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#!/bin/sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
bin=${DIR}/../bin
lib=${DIR}/../lib
echo '
{
"type" : "jdbc",
"jdbc" : {
"url" : "jdbc:mysql://localhost:3306/blog",
"statefile" : "statefile.json",
"schedule" : "0 0-59 0-23 ? * *",
"user" : "blog",
"password" : "12345678",
"sql" : [{
"statement": "select id as _id, id, post_title as title, post_content as content from wp_posts where post_status = ? and post_modified > ? ",
"parameter": ["publish", "$metrics.lastexecutionstart"]}
],
"index" : "article",
"type" : "blog",
"metrics": {
"enabled" : true
},
"elasticsearch" : {
"cluster" : "elasticsearch",
"host" : "localhost",
"port" : 9300
}
}
}
' | java \
-cp "${lib}/*" \
-Dlog4j.configurationFile=${bin}/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter
这里主要看两个配置, statefile和schedule,
其中statefile这个配置对于增量导数据一定不能少。因为只有配置了statefile,elasticsearch-jdbc才知道将上次抓取时间存在哪里,才可以做增量索引。
schedule的作用与crontab类似,用来固定时间执行增量导数据,具体用法参看文档活着crontab。
http://localhost:9200/article/blog/_search?q=test
在配置elasticsearch-jdbc的过程中,查看日志很重要。日志文件在bin目录下的logs里,可以修改log4j2.xml文件,把日志等级改为debug以查看更多日志。