linux基础命令
find
find / -name targetfilename 查找文件
按时间查找也有参数 -atime 访问时间
—ctime 改变状态时间
-mtime 修改时间
find ./ -mtime 0:返回最近24小时内修改过的文件。
find ./ -mtime 1 : 返回的是前48~24小时修改过的文件。而不是48小时以内修改过的文件。
那怎么返回10天内修改过的文件?find还可以支持表达式关系运算,所以可以把最近几天的数据一天天的加起来:
find ./ -mtime 0 -o -mtime 1 -o -mtime 2 ……虽然比较土,但也算是个方法了。
宣传语
历经两个半月的准备,三次大改版,十七次小改版。le1024终于要和大家见面了。
le1024每天推荐1~3段,有趣、有爱、有故事的视频。
为您工作、学习、生活之余增加一点快乐的感觉。程序员必看的快乐视频网站
ls -la
(1)将文件按从新到旧排列,取第一个。
ls -t *.cpp | head -1
(2)将文件按从旧到新排列,取最后一个。
ls -rt *.cpp | tail -1
history
# export HISTTIMEFORMAT='%F %T '
# history | more
使用Ctrl + R 搜索历史的一个快键键
如果想执行 第4条命令,那么可以执行!4
!ps 输入!ps 并回车,将执行以ps打头的命令
history | tail -4
http://hi.baidu.com/linkage121/item/032729f5d30502c9521c2630
sudo
su是切换用户的命令,常用的方法是su - username
mkdir
linux mkdir 命令用来创建指定的名称的目录,
要求创建目录的用户在当前目录中具有写权限,
并且指定的目录名不能是当前目录中已有的目录。
mkdir -p test2/test22 递归地创建多个目录
rm -rf test2/test22 递归的删除创建的目录
mkdir -m 777 test3 创建权限为777的目录
touch
-r 统一修改文件的修饰的日期
528 touch zz.txt
529 touch -r zz.txt log2012.log log2013.log
touch -t 201211142234.50 log.log
-a 或--time=atime或--time=access或--time=use 只更改存取时间。
-c 或--no-create 不建立任何文档。
-d 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify 只更改变动时间。
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t 使用指定的日期时间,而非现在的时间。
chmod
http://www.cnblogs.com/peida/archive/2012/11/29/2794010.html
每一个文件或目录的访问权限都有三组,每组用三位来表示,
分别为文件作者的读,写和执行权限
作者同组的用户的读,写和执行权限
系统中其他用户的读,写和执行权限
-rw-r--r-- 1 root root 296k 11-12 06:03 log2012.log
第一个字符指定了文件类型.
在普通意义上一个目录也是一个文件
第一个字符是横线,表示是一个非目录的文件
如果为d表示是一个目录,从第二字符开始到第十个字符,3个字符一组,
分别表示了3组用户对文件或者目录的权限.权限字符用横线代表空许可
r代表只读,w代表写,x代表可执行
上述文件
表示作者有读写权限
作者同组的用户只有读权限
其他用户只有读权限
权限范围
u 目录或者文件的当前用户
g 目录或者文件的当前群组
o 除了目录或者文件的当前用户或群组之外的用户或者群组
a 所有的用户及群组
r : 读权限, 用数字4表示
w : 写权限, 用数字2表示
x : 执行权限,用数字1表示
- : 删除权限,用数字0表示
chmod u=rwx,g=rw,o=r zz (注意逗号的后面不能有空格)
chmod 764 zz
chmod ug+x,o-x log2012.log
chmod g=x log2012.log 把g的权限赋值为x
chown
http://www.cnblogs.com/peida/archive/2012/12/04/2800684.html
http://wenson.iteye.com/blog/212739
通过chown改变文件的拥有者和群组.普通用户不能将自己的文件该变成其他的拥有者,
其操作权限一般为管理员.
chown mail:mail log2012.log
chown [选项]...[所有者][:[组]]文件...
若
chown root: log2012.log
那么改变之后 root 的所选组也就变成root了
sudo chown -R -v root:root
改变指定目录以及其子目录下的所有文件的拥有者和群组
-R 处理制定目录以及其子目录下的所有文件
-v 显示详细的处理信息
apt-get apt-cache
apt-cache search package 搜索包
apt-cache show package 获取包的相关信息,如说明、大小、版本等
apt-cache depends package 了解使用依赖
apt-cache rdepends package 是查看该包被哪些包依赖
sudo apt-get install package 安装包
sudo apt-get install package - - reinstall 重新安装包
sudo apt-get -f install 修复安装"-f = ——fix-missing"
sudo apt-get remove package 删除包
sudo apt-get remove package - - purge 删除包,包括删除配置文件等
sudo apt-get update 更新源
sudo apt-get upgrade 更新已安装的包
sudo apt-get dist-upgrade 升级系统
apt-get source package 下载该包的源代码
sudo apt-get clean && sudo apt-get autoclean 清理无用的包
sudo apt-get check 检查是否有损坏的依赖
tar
弄清两个概念:
打包和压缩.
打包是指将一大堆的文件或目录变成一个总的文件
压缩是将一个大的文件通过一些压缩算法变成一个小文件
这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩
一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)
http://www.cnblogs.com/peida/archive/2012/11/30/2795656.html
用来压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的
3.命令参数:
必要参数有如下:
-c 建立新的压缩文件
-x 从压缩的文件中提取文件
-t 显示压缩文件的内容
-z 支持gzip解压文件
-j 支持bzip2解压文件
-v 显示操作过程
-f 指定压缩文件
tar -cvf log.tar log2012.log 仅打包,不压缩!
tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩
在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar包; 如果加 j 参数,则以 .tar.bz2 来作为tar包名。
tar -zxvf /opt/soft/test/log.tar.gz 将tar包解压缩
http://www.cnblogs.com/peida/archive/2012/11/30/2795656.html
tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.b
date
date '+This date noew is =>%x, time is now =>%X, thank you!'
This date noew is =>2013年12月23日, time is now =>21时40分15秒, thank you!
sudo date -s 991128
[root@Gman root]# date -d next-day +%Y%m%d
20060328
[root@Gman root]# date -d last-day +%Y%m%d
20060326
[root@Gman root]# date -d yesterday +%Y%m%d
20060326
[root@Gman root]# date -d tomorrow +%Y%m%d
20060328
[root@Gman root]# date -d last-month +%Y%m
200602
[root@Gman root]# date -d next-month +%Y%m
200604
[root@Gman root]# date -d next-year +%Y
2007
sudo date -s '131223 21:59:00'
date -d '20131212 13:13:00'
date 设置时间格式
命令中各选项的含义分别为:
-d datestr, --date datestr 显示由datestr描述的日期
-s datestr, --set datestr 设置datestr 描述的日期
-u, --universal 显示或设置通用时间
cat
1.一次显示整个文件。
$ cat filename
2.从键盘创建一个文件。
$ cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件。
$cat file1 file2 > file
-n 或 –number 由 1 开始对所有输出的行数编号
-b 或 –number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 –squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 –show-nonprinting
范例:
把 linuxfile1 的档案内容加上行号后输入 linuxfile2 这个档案里
cat -n linuxfile1 > linuxfile2
把 linuxfile1 和 linuxfile2 的档案内容加上行号(空白行不加)之后将内容附加到 linuxfile3 里。
cat -b linuxfile1 linuxfile2 >> linuxfile3
cat /dev/null > /etc/test.txt 此为清空/etc/test.txt档案内容
cp
cp -i file1 file2 1、将文档 file1复制成file2,复制后名称被改file2
cp -i file1 dir1 2、将文档 file1复制到dir1目录下,复制后名称仍未file1
cp -r dir1 dir2
将目录dir1 复制到dir2 目录下,复制结果目录改名为dir2
mv
-b :若需覆盖文件,则覆盖前先行备份。
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新(update)
-t : --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定mv的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后。
mv test.log test1.txt 文件改名
mv test1.txt test3 移动文件
mv log1.txt log2.txt log3.txt test3 实例三:将文件log1.txt,log2.txt,log3.txt移动到目录test3中。
mv -i log1.txt log2.txt 将文件file1改名为file2已经存在,则询问是否覆盖
mv -f log3.txt log2.txt 将文件file1改名为file2,即使file2存在,也是直接覆盖掉
mv dir1 dir2 目录的移动
mv * ../ 移动当前文件夹下的所有文件到上一级目录
pwd
目录连接链接时,pwd -P 显示出实际路径,而非使用连接(link)路径;pwd显示的是连接路径
cd
cd /
cd ~
grep
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
$ grep ‘test’ d*
显示所有以d开头的文件中包含 test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]{5}’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ‘w(es)t.\1′ aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了
man
man bash | col -b > bash.txt
ps aux|grep
aux 分别代表
显示其他用户启动的进程(a)
查看系统中属于自己的进程(x)
启动这个进程的用户和它启动的时间(u)
kill/pkill
linux 中的kill命令用来种植指定的进程(terminate a process)
的运行,是Linux下进程管理的常用的命令,通常
终止一个前台进程可以使用Ctrl+C键,但是对于一个后台进程
就须用kill命令来终止。
http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html
whereis
find是最常见和最强大的查找命令
find . -name "my" 搜索当前目录(含有子目录) 所有文件名以my开头的文件
find . -name "my" -ls 搜索当前目录中,所有文件名以my开头的文件,并显示他们的详细信息
find . -type f -mmin -10 搜索当前目录中,所有过去10分钟更新过的普通文件
如果不加-type f 参数,则搜索普通文件+特殊文件+目录
locate命令其实是“find -name”的另一种写法,但是要比后者快得多,
原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),
这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
wget
Linux系统中的 wget 是一个下载文件的工具。
它用在命令行下,对于Linux用户是必不可少的工具,
我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。
wget支持HTTP HTTPS和FTP协议,可以使用HTTP代理
所谓的自动下载是指,wget可以在用户退出系统之后在后台执行
这意味你可以登录系统,启动一个wget下载任务,
然后退出系统,wget将在后台执行,直到任务完成。
相对于其他大部分浏览器在下载大量数据时,需要用于一直的参与,这省去了极大的麻烦。
使用wget下载单个文件
wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip
使用wget- O 下载并以不同的文件名保存
wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080
限制下载的速度
wget --limit-rate=300k http://www.minjieren.com/wordpress-3.1-zh_CN.zip
使用wget -c 断点续传
wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip
使用wget-c 重新启动下载中断的文件,对于我们下载大文件时很有帮助
service
service命令,顾名思义,就是用于管理Linux操作系统中服务的命令
1 声明, 这个命令不是在所有的linux发行版都有
2 此命令位于/sbin 目录下,用file命令查看他就是一个脚本命令
3 去/etc/init.d目录下寻找相应的服务,进行开启和关闭等操作
4 开启httpd服务器: service httpd start
start 可以换成restart 表示重新启动,stop表示关闭,reload表示重新载入配置
关闭mysql服务器: service mysqld stop
强烈建议大家将service命令替换为/etc/init.d/mysqld stop
alias
用户可以利用alias,自定指令的别名。若输入alias,则可以列出所有的别名设置
alias的效力仅及与该次登录的操作。
可以在/etc/profile或自己的~/.bashrc 中设定指定的别名
还有,如果你想给每一位用户都生效的别名,请把alias la='ls -al' 一行加在/etc/bashrc最后面
/etc/bashrc 设置给全系统的
~/.bashrc 一个是设置给单用户使用的
df/du
df -h 可以显示目前所有档案的最大可用空间及使用
-h表示使用[Human-readable]的输出 也就是在档案系统大小使用GB, MB等
易读的格式
我们可以使用参数-i 来查看目前档案系统inode的使用情形
所谓的 inode 是用来存放档案及目录的基本信息 (metadata),
包含时间、档名、使用者及群组等。在分割扇区时,系统会先做出一堆
inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。
du
显示每个文件和目录的磁盘使用情况
du -h --max-depth=1 |sort -rh| more
输出每个目录的使用情况,并且按照空间大小,倒序排列
rm
-i 删除 删除前询问是否需要删除;
-f 强制删除,无需确认。
-r 或-R 或--recursive 将目录以及目录下的文件或者目录逐一删除。
-d 或--directory 删除目录
1,实践中发现除了-r外,其他的单个参数都不能够对目录(不管是否为空)进行删除操作。
echo
利用 echo $PATH echo ${PATH}
diff
diff命令能比较单个文件或目录内容,如果制定比较的是文件,则只有当输入为文本文件时才有效.
以逐行的方式,比较文本文件的异同之处.
如果指定比较的是目录的时候,diff命令会比较两个目录下名字相同的文件,列出不同的二进制
公共子目录和只在一个目录出现的文件
diff 的 normal 显示格式有三种提示
a - add
c - change
d - delete
www.cnblogs.com/peida/archive/2012/12/12/2814048.html
wget
ifconfig
Linux 下网卡命令
ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx
配置网卡的IP地址
ifconfig eth0 192.168.0.1 netmask 255.255.255.0
若在eth0上配置了192.168.0.1 的IP地址及24位掩码, 若想在eth0上在配置一个
可以使用下面的方法
ifconfig eth0:0 192.168.1.1 netmask 255.255.255.0
netstat
netstat 可以用来显示网络链接,路由表,接口统计,伪链接和组播成员
netstat -a -> ss 网络连接
netstat -r -> ip route 路由表
netstat -i -> ip -s link 统计接口
netstat -M -> ss 伪链接
netstat -g -> ip maddr 组播成员
top
top命令是Linux下常用的性能分析工具,
能够实时显示系统中各个进程的资源占用状况,
类似于Windows的任务管理器。
下面详细介绍它的使用方法。top是一个动态显示过程,
即可以通过用户按键来不断刷新当前状态.
如果在前台执行该命令,它将独占前台,
直到用户终止该程序为止.比较准确的说,
top命令提供了实时的对系统处理器的状态监视.
它将显示系统中CPU最“敏感”的任务列表.
该命令可以按CPU使用.内存使用和执行时间对任务
进行排序;而且该命令的很多特性都可以通过
交互式命令或者在个人定制文件中进行设定.
http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html
cron
crond 是linux 用来定期执行程序的命令.当安装完成系统之后,
默认便会启动此任务调度命令.crond命令每分钟会定期检查是否有要执行的工作
如果有要执行的工作便会自动执行该工作.
1 系统执行的工作: 系统周期性所要执行的工作, 如备份系统数据, 清理缓存
2 个人执行的工作: 某个用户定期要做的工作, 例如每隔10分钟检查邮件服务器是否有新邮件
-e 执行文件编辑器来设定时程表
-r 删除目前的时称表
-l 列出目前的时程表
/etc/init.d/cron restart
说明 取值范围
第一段 代表分钟 0~59
第二段 代表小时 0~23
第三段 代表日期 1~31
第四段 代表月份 1~12
第五段 代表星期 0~6 其中 0 表示星期日
第六段 要执行的命令 命令
前五个可以全写 *
1 * * * * date>>$HOME/test.txt
每个小时的第一分钟执行一段命令
*/1 * * * * data>>$HOME/test.txt
每隔一分种执行一段命令
3 * * * * root /home/meng/hello.sh
每小时的第3分钟执行
在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
*/20 6-12 * 12 * /usr/bin/backup
git
git和 svn区别
1
Git是分布式的
SVN 是非分布式的
2
GIT把内容按元数据方式存储,而SVN是按文件
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs
等的文件夹里。如果你把.git目录的体积大小跟.svn比较,
你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,
它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
3 GIT没有一个全局的版本号,而SVN有
4 GIT的内容完整性要优于SVN
创建git远程仓库并在本地下载
git remote -v 查看远程的对应克隆的地址
git clone git://github.com/ibugs/sample_app.git
添加一个新的远程库,可以指定一个简单的名字,以便将来引用,运行
git remote add [shortname] [url]
$ git remote add pb git://github.com/paulboone/ticgit.git
当远程创建了一个仓库
git remote add origin https://github.com/ibugs/job.git
git push -u origin master
我们现在在rspec-test的库,我需要新添加一个远程的库
git remote add tt https://github.com/ibugs/job.git
git push -u tt master
添加完远程的库之后,我就可以把远程的库中的内容pull 下来
git pull tt master
重命名
git remote rename tt zz
删除这个远程仓库
git remote rm paul
创建分支,修改文件,上传文件
git flow feature start rm
git add zzz.txt
git commmit -m ""
git push origin rm
你想添加一个目录,但是目录里面所有的文件你都不想上传。
假如: web/upload 这个目录吧。
在上面这个目录下添加 .gitignore ,内容如下:
Ignore everything in this directory
Except this file
!.gitignore
保存后,然后:
git add web/upload
git remote update -p
git diff/checkout/reset
工作区,暂存区,版本库区别
工作区 --> :电脑能看到的目录
版本库 --> :工作区中的.git文件就是版本库
暂存区 --> :通过git add把文件放入的区域叫做暂存区.最后通过commit统一进行提交
git checkout -- file.txt 撤销修改,返回到最后依次commit或者add状态
场景1
当你改乱了工作区某个文件的内容, 想直接丢弃工作去的修改时,用命令git checkout -- file
场景2
当你不但该乱了工作区某个文件的内容,还添加了暂存区时,想丢弃修改,分两步
第一步用命令git reset HEAD file 就回到了场景1, 然后按照场景1的操作
从远程到克隆到本地仓库
git clone https://github.com/name/gitskills.git
标签的管理,我们通常现在版本库中打上标签,这样,就唯一确定了打标签时候的版本.
将来无论什么时候,某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,
标签也是版本库的一个快照.
git tag v1.0
git tag 查看标签
git tag v1.0 master 如果再历史记录中忘记了标签,可以先从log中查看历史,然后对应的id打标签
git tag -d v0.1 删除标签
git push origin :refs/tags/v1.0 删除远程的tag
工作区:--> 就是你电脑里能看到的目录
版本库:--> Git的版本库中存了很多东西,其中最重要的称为stage(或者叫indexde 暂存区),还有Git为我们自动创建的第一个分支
master 以及执行master的一个指针叫HEAD
版本库中包含了 叫做 暂存区的东西
[ Working Directory ] -> (git add file ) -> [ Stage(index) ] -> ( git commit ) -> [History]
[ History ] -> ( git reset -- files ) -> [ Stage ] -> ( git checkout --file ) -> [ Working Directory ]
特殊的情况
git checkout HEAD -- files 回滚到复制最后一次提交
git规范:不能使用 commit -a,上传前一定要diff
git log的各种参数和用法
git log
git log -2 查看两次提交
git log --graph 以图形的方式来显示提交日志
git log --oneline --decorate 显示所有的提交,只显示提交 前面只有7个字符的编码
git log --pretty = oneline 文件名
git log --stat -2 查看近两次提交修改得文件
git merge --squash解析
在 my_branch 上执行 git merge --squash [otherbranch]
会把otherbranch 上的所有修改放在my_branch的暂存区上.
然后进行提交,提交之后,会在my_branch 分支上生成一个commit信息,可以保留suqsh_branch的提交信息
git flow
开发分支的
git flow feature start <your feature>
git flow feature finish <your feature>
git flow feature publish <name>
git push origin <name>
开发一个release的过程
git flow release start <release>
git flow release finish <release>
develop, master, feature, release, hotfix的区别,画图表示
git flow命令和git命令的对应关系
git flow feature start <your feature>
--相等于
git checkout -b myfeature develop
git flow feature finish <your feature>
--相等于
git checkout develop
git merge --no--ff myfeature
git branch -d myfeature
git push origin develop
git flow feature publish <xxx>
git push origin featureAdd
git config “branch.featureAdd.remote” “origin”
git config “branch.featureAdd.merge” “refs/heads/featureAdd”
git checkout “featureAdd”
http://yakiloo.com/getting-started-git-flow/
git flow release start <xxx>
$ git checkout -b release-1.2 develop
$ git commit -a -m "Bumped version number to 1.2"
git flow release finish <xxx>
$ git checkout master
$ git merge --no-ff release-1.2
$ git tag -a 1.2
$ git checkout develop
$ git merge --no-ff release-1.2
$ git branch -d release-1.2
git flow hotfix start <release>
git flow hotfix finish <release>
修补bug
git flow hotfix start <release>
$ git checkout -b hotfix-1.2.1 master
$ git commit -a -m "Bumped version number to 1.2.1"
$ git commit -m "Fixed severe production problem"
git flow hotfix finish <release>
$ git checkout master
$ git merge --no-ff hotfix-1.2.1
$ git tag -a 1.2.1
$ git checkout develop
$ git merge --no-ff hotfix-1.2.1
$ git branch -d hotfix-1.2.1
http://nvie.com/posts/a-successful-git-branching-model/
start,finish,publish操作
从git和git flow角度,通过命令尽可能详尽地述一个redmine工单(#12345)从开发到上线到服务器的全过程。
lite 上线过程
git flow release start 29339
git flow release finish 29339
git push origin master
git push origin develop
git push --tags
git checkout master
git remote update --prune
git pull origin master
上线 过程
git checkout develop
git pull origin develop
git flow feature start <12345>
git checkout rm12345_wh_20132222_xxxx
git merge develop
git flow feature publish 分支
git flow feature finish rm12345_20131011_wh_xxxx
git checkout master