更改 code block

pull/11/head
Zhang Peng 2019-05-08 22:36:55 +08:00
parent 90910209fe
commit 0e20618e23
24 changed files with 235 additions and 235 deletions

View File

@ -24,7 +24,7 @@ docker image pull hello-world
2查看镜像
```sh
```bash
~ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB

View File

@ -62,7 +62,7 @@ Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容
### 客户端配置
```sh
```bash
# Setup autocomplete in bash; bash-completion package should be installed first
source <(kubectl completion bash)
@ -78,7 +78,7 @@ kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser -
### 查找资源
```sh
```bash
# List all services in the namespace
kubectl get services
@ -112,7 +112,7 @@ for i in 0 1; do kubectl exec foo-$i -- sh -c 'echo $(hostname) > /usr/share/ngi
### 资源管理
```sh
```bash
# Get documentation for pod or service
kubectl explain pods,svc
@ -143,7 +143,7 @@ kubectl delete -f ./my-manifest.yaml
### 监控和日志
```sh
```bash
# Deploy Heapster from Github repository
kubectl create -f deploy/kube-config/standalone/

View File

@ -107,7 +107,7 @@ Shell 的解释器种类众多,常见的有:
- 指定 sh 解释器
```sh
```bash
#!/bin/sh
```

View File

@ -59,7 +59,7 @@ tags:
示例:
```sh
```bash
# 查看 man 命令的简要说明
$ whatis man
@ -75,7 +75,7 @@ $ whatis -w "loca*"
示例:
```sh
```bash
# 查看 man 命令的详细说明
$ info man
```
@ -88,13 +88,13 @@ $ info man
示例:
```sh
```bash
which pwd # 查找命令的路径
```
说明which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!
```sh
```bash
[root@localhost ~]# which cd
cd: shell built-in command
```
@ -111,7 +111,7 @@ cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是
示例:
```sh
```bash
whereis git # 将相关的文件都查找出来
```
@ -123,7 +123,7 @@ whereis git # 将相关的文件都查找出来
示例:
```sh
```bash
$ man date # 查看 date 命令的帮助手册
$ man 3 printf # 查看 printf 命令的帮助手册中的第 3 类
$ man -k keyword # 根据命令中部分关键字来查询命令
@ -149,7 +149,7 @@ man 页面的分类(常用的是分类 1 和分类 3)
前面说到使用 whatis 会显示命令所在的具体的文档类别,我们学习如何使用它
```sh
```bash
$ whatis printf
printf (1) - format and print data
printf (1p) - write formatted output
@ -160,7 +160,7 @@ printf [builtins](1) - bash built-in commands, see bash(1)
我们看到 printf 在分类 1 和分类 3 中都有;分类 1 中的页面是命令操作及可执行文件的帮助;而 3 是常用函数库说明;如果我们想看的是 C 语言中 printf 的用法,可以指定查看分类 3 的帮助:
```sh
```bash
$ man 3 printf
```

View File

@ -57,7 +57,7 @@ linux 目录结构是树形结构,其根目录是 `/` 。一张思维导图说
Linux 系统是一种典型的多用户系统不同的用户处于不同的地位拥有不同的权限。为了保护系统的安全性Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
在 Linux 中我们可以使用 ll 或者 ls l 命令来显示一个文件的属性以及文件所属的用户和组,如:
```sh
```bash
$ ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
@ -91,7 +91,7 @@ dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
#### Linux 文件属主和属组
```sh
```bash
$ ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
@ -146,7 +146,7 @@ dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
示例:
```sh
```bash
cd # 切换到用户主目录
cd ~ # 切换到用户主目录
cd - # 切换到上一个工作目录
@ -162,7 +162,7 @@ cd ../.. # 切换到上两级目录
示例:
```sh
```bash
ls # 列出当前目录可见文件
ls -l # 列出当前目录可见文件详细信息
ls -la # 列出所有文件(包括隐藏)的详细信息
@ -186,7 +186,7 @@ ls --color=auto # 列出文件并标记颜色分类
示例:
```sh
```bash
# 在当前目录中创建 zp 和 zp 的子目录 test
mkdir -p zp/test
@ -202,7 +202,7 @@ mkdir -p -m 750 zp/test
示例:
```sh
```bash
# 删除子目录 test 和其父目录 zp
rmdir -p zp/test
```
@ -215,7 +215,7 @@ rmdir -p zp/test
示例:
```sh
```bash
# 列出目录 /private 第一级文件名
tree /private -L 1
/private/
@ -256,7 +256,7 @@ touch ex2
示例:
```sh
```bash
# 将目录 /usr/mengqc/mub1 下的文件 m2.c 链接到目录 /usr/liu 下的文件 a2.c
cd /usr/mengqc
ln /mub1/m2.c /usr/liu/a2.c
@ -274,7 +274,7 @@ ln -s /usr/mengqc/mub1 /usr/liu/abc
示例:
```sh
```bash
# 将 main1.c 重命名为 main.c
rename main1.c main.c main1.c
@ -292,7 +292,7 @@ rename "s//.txt//" * # 把所有以 .txt 结尾的文件名的.txt
示例:
```sh
```bash
stat myfile
```
@ -304,7 +304,7 @@ stat myfile
示例:
```sh
```bash
file install.log # 显示文件类型
file -b install.log # 不显示文件名称
file -i install.log # 显示 MIME 类型
@ -340,7 +340,7 @@ x=执行属性  //值= 1
示例:
```sh
```bash
chmod u+x,g+w f01  # 为文件f01设置自己可以执行组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01
@ -360,7 +360,7 @@ chmod -R 755 /home/wwwroot/*
示例:
```sh
```bash
# 将目录/usr/meng及其下面的所有文件、子目录的文件主改成 liu
chown -R liu /usr/meng
```
@ -375,7 +375,7 @@ chown -R liu /usr/meng
示例:
```sh
```bash
locate pwd # 查找和 pwd 相关的所有文件
locate /etc/sh # 搜索 etc 目录下所有以 sh 开头的文件
```
@ -386,7 +386,7 @@ locate /etc/sh # 搜索 etc 目录下所有以 sh 开头的文件
>
> 参考http://man.linuxde.net/find
```sh
```bash
# 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容
find . -type f -name "*" | xargs grep "140.206.111.111"
@ -428,7 +428,7 @@ find /home ! -name "*.txt"
示例:
```sh
```bash
# 将文件 file 复制到目录 /usr/men/tmp 下,并改名为 file1
cp file /usr/men/tmp/file1
@ -485,7 +485,7 @@ rm ~/.ssh/id_rsa.pub.tmp
示例:
```sh
```bash
mv file1.txt /home/office/ # 移动单个文件
mv file2.txt file3.txt file4.txt /home/office/ # 移动多个文件
mv *.txt /home/office/ # 移动所有 txt 文件
@ -509,7 +509,7 @@ mv -bv *.txt /home/office # 复制时创建备份
>
> 参考http://man.linuxde.net/rm
```sh
```bash
rm test.txt # 删除文件
rm -i test.txt test2.txt # 交互式删除文件
rm -r * # 删除当前目录下的所有文件和目录

View File

@ -49,7 +49,7 @@ tags:
示例:
```sh
```bash
cat m1 # 在屏幕上显示文件 ml 的内容
cat m1 m2 # 同时显示文件 ml 和 m2 的内容
cat m1 m2 > file # 将文件 ml 和 m2 合并后放入文件 file 中
@ -69,7 +69,7 @@ cat m1 m2 > file # 将文件 ml 和 m2 合并后放入文件 file 中
示例:
```sh
```bash
tail file # 显示文件file的最后10行
tail -n +20 file # 显示文件file的内容从第20行至文件末尾
tail -c 10 file # 显示文件file的最后10个字符
@ -92,7 +92,7 @@ tail -c 10 file # 显示文件file的最后10个字符
示例:
```sh
```bash
# 显示文件 file 的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。
more -dc file
@ -106,7 +106,7 @@ less 命令的作用与 more 十分相似,都可以用来浏览文字档案的
示例:
```sh
```bash
less /var/log/shadowsocks.log
```
@ -118,7 +118,7 @@ less /var/log/shadowsocks.log
示例:
```sh
```bash
# 替换文本中的字符串
sed 's/book/books/' file
@ -163,7 +163,7 @@ sed '/^test/'d file
示例:
```sh
```bash
# 在多级目录中对文本递归搜索(程序员搜代码的最爱):
$ grep "class" . -R -n

View File

@ -39,7 +39,7 @@ tags:
示例:
```sh
```bash
tar -cvf log.tar log2012.log # 仅打包,不压缩
tar -zcvf log.tar.gz log2012.log # 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log # 打包后,以 bzip2 压缩
@ -59,7 +59,7 @@ tar -zxvf log30.tar.gz log2013.log # 只将 tar 内的部分文件解压出
示例:
```sh
```bash
gzip * # 将所有文件压缩成 .gz 文件
gzip -l * # 详细显示压缩文件的信息,并不解压
gzip -dv * # 解压上例中的所有压缩文件,并列出详细的信息
@ -76,7 +76,7 @@ gzip -dr test/ # 递归地解压目录
示例:
```sh
```bash
# 将 /home/Blinux/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip
zip -q -r html.zip /home/Blinux/html
```
@ -89,7 +89,7 @@ zip -q -r html.zip /home/Blinux/html
示例:
```sh
```bash
unzip test.zip # 解压 zip 文件
unzip -n test.zip -d /tmp/ # 在指定目录下解压缩
unzip -o test.zip -d /tmp/ # 在指定目录下解压缩,如果有相同文件存在则覆盖

View File

@ -50,7 +50,7 @@ tags:
示例:
```sh
```bash
# 建立一个新组,并设置组 ID 加入系统
$ groupadd -g 344 jsdigname
```
@ -63,7 +63,7 @@ $ groupadd -g 344 jsdigname
示例:
```sh
```bash
$ groupadd damon # 创建damon用户组
$ groupdel damon # 删除这个用户组
```
@ -82,7 +82,7 @@ $ groupdel damon # 删除这个用户组
示例:
```sh
```bash
# 新建用户加入组
$ useradd g sales jack G company,employees # -g加入主要组、-G加入次要组
@ -100,7 +100,7 @@ $ useradd caojh -u 544
userdel 命令很简单,比如我们现在有个用户 linuxde其 home 目录位于`/var`目录中,现在我们来删除这个用户:
```sh
```bash
$ userdel linuxde # 删除用户linuxde但不删除其家目录及文件
$ userdel -r linuxde # 删除用户linuxde其 home 目录及文件一并删除;
```
@ -113,7 +113,7 @@ $ userdel -r linuxde # 删除用户linuxde其 home 目录及文件一并
示例:
```sh
```bash
# 将 newuser2 添加到组 staff 中
$ usermod -G staff newuser2
@ -135,7 +135,7 @@ $ usermod -U newuser1
示例:
```sh
```bash
# 如果是普通用户执行 passwd 只能修改自己的密码。
# 如果新建用户后,要为新用户创建密码,则用 passwd 用户名,注意要以 root 用户的权限来创建。
$ passwd linuxde # 更改或创建linuxde用户的密码
@ -180,7 +180,7 @@ Empty password. # 空密码,也就是没有密码;
示例:
```sh
```bash
# 变更帐号为 root 并在执行 ls 指令后退出变回原使用者:
$ su -c ls root
@ -199,7 +199,7 @@ $ su -test
示例:
```sh
```bash
# 指定用户执行命令
$ sudo -u userb ls -l
# 列出目前的权限

View File

@ -68,7 +68,7 @@ lsb_release 不是 bash 默认命令,如果要使用,需要先安装。
示例:
```sh
```bash
reboot # 重开机。
reboot -w # 做个重开机的模拟(只有纪录并不会真的重开机)。
```
@ -81,7 +81,7 @@ reboot -w # 做个重开机的模拟(只有纪录并不会真的重开机
示例:
```sh
```bash
# 退出当前 shell
[root@localhost ~]# exit
logout
@ -114,7 +114,7 @@ fi
示例:
```sh
```bash
# 指定现在立即关机
shutdown -h now
@ -130,7 +130,7 @@ shutdown +5 "System will shutdown after 5 minutes"
示例:
```sh
```bash
# 格式化输出
date +"%Y-%m-%d"
2009-12-07
@ -196,7 +196,7 @@ echo $difference seconds.
示例:
```sh
```bash
# 将 /dev/hda1 挂在 /mnt 之下
mount /dev/hda1 /mnt
@ -216,7 +216,7 @@ mount -o loop /tmp/image.iso /mnt/cdrom
示例:
```sh
```bash
# 通过设备名卸载
umount -v /dev/sda1
/dev/sda1 umounted
@ -234,7 +234,7 @@ umount -v /mnt/mymount/
示例:
```sh
```bash
# 按内存资源的使用量对进程进行排序
ps aux | sort -rnk 4
@ -250,7 +250,7 @@ ps aux | sort -nk 3
示例:
```sh
```bash
# 列出所有信号名称
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
@ -288,7 +288,7 @@ kill 3268
示例:
```sh
```bash
# 1.启动 nfs 服务
systemctl start nfs-server.service
@ -324,7 +324,7 @@ sudo systemctl disable firewalld.service
示例:
```sh
```bash
service network status
配置设备:
lo eth0
@ -347,7 +347,7 @@ service network restart
示例:
```sh
```bash
# 每 1 分钟执行一次 command
* * * * * command

View File

@ -64,7 +64,7 @@ tags:
示例:
```sh
```bash
# 下载文件
$ curl http://man.linuxde.net/text.iso --silent
@ -81,7 +81,7 @@ $ curl http://man.linuxde.net/test.iso -o filename.iso --progress
示例:
```sh
```bash
# 使用 wget 下载单个文件
$ wget http://www.linuxde.net/testfile.zip
```
@ -94,7 +94,7 @@ $ wget http://www.linuxde.net/testfile.zip
示例:
```sh
```bash
telnet 192.168.2.10
Trying 192.168.2.10...
Connected to 192.168.2.10 (192.168.2.10).
@ -115,7 +115,7 @@ Login incorrect
示例:
```sh
```bash
$ ip link show # 查看网络接口信息
$ ip link set eth0 upi # 开启网卡
$ ip link set eth0 down # 关闭网卡
@ -145,7 +145,7 @@ $ ip route delete 192.168.1.0/24 dev eth0 # 删除路由
示例:
```sh
```bash
$ hostname
AY1307311912260196fcZ
```
@ -158,7 +158,7 @@ AY1307311912260196fcZ
示例:
```sh
```bash
# 查看网络设备信息(激活状态的)
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:16:3E:00:1E:51
@ -186,7 +186,7 @@ lo Link encap:Local Loopback
示例:
```sh
```bash
# 查看当前路由
route
Kernel IP routing table
@ -284,7 +284,7 @@ systemctl 是 CentOS7 的服务管理工具中主要的工具,它融合之前
示例:
```sh
```bash
# 开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
@ -328,7 +328,7 @@ Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
示例:
```sh
```bash
[root@localhost ~]# host www.jsdig.com
www.jsdig.com is an alias for host.1.jsdig.com.
host.1.jsdig.com has address 100.42.212.8
@ -355,7 +355,7 @@ Received 54 bytes from 202.96.104.15#53 in 0 ms
示例:
```sh
```bash
[root@localhost ~]# nslookup www.jsdig.com
Server: 202.96.104.15
Address: 202.96.104.15#53
@ -374,7 +374,7 @@ Address: 100.42.212.8
示例:
```sh
```bash
# TCP 端口扫描
[root@localhost ~]# nc -v -z -w2 192.168.0.3 1-100
192.168.0.3: inverse host lookup failed: Unknown host
@ -394,7 +394,7 @@ Address: 100.42.212.8
示例:
```sh
```bash
[root@AY1307311912260196fcZ ~]# ping www.jsdig.com
PING host.1.jsdig.com (100.42.212.8) 56(84) bytes of data.
64 bytes from 100-42-212-8.static.webnx.com (100.42.212.8): icmp_seq=1 ttl=50 time=177 ms
@ -416,7 +416,7 @@ rtt min/avg/max/mdev = 174.068/176.916/178.182/1.683 ms
示例:
```sh
```bash
traceroute www.58.com
traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets
1 unknown (192.168.2.1) 3.453 ms 3.801 ms 3.937 ms
@ -441,7 +441,7 @@ traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets
示例:
```sh
```bash
# 列出所有端口 (包括监听和未监听的)
netstat -a #列出所有端口
netstat -at #列出所有tcp端口

View File

@ -42,7 +42,7 @@ tags:
示例:
```sh
```bash
# 查看系统磁盘设备,默认是 KB 为单位
[root@LinServ-1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
@ -80,7 +80,7 @@ none 0 0 0 - /proc/sys/fs/binfmt_misc
示例:
```sh
```bash
# 显示目录或者文件所占空间
root@localhost [test]# du
608 ./test6
@ -138,7 +138,7 @@ root@localhost [test]# du
示例:
```sh
```bash
free -t # 以总和的形式显示内存的使用信息
free -s 10 # 周期性的查询内存使用信息每10s 执行一次命令
@ -159,7 +159,7 @@ Swap: 4094 0 4094
示例:
```sh
```bash
Total DISK read: 0.00 B/s | Total DISK write: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> command
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init [3]

View File

@ -39,7 +39,7 @@ rpm -ivh xxx.rpm
这类软件包是包含了源代码的 rpm 包,在安装时需要进行编译
```sh
```bash
rpm -i xxx.src.rpm
cd /usr/src/redhat/SPECS
rpmbuild -bp xxx.specs #一个和你的软件包同名的specs文件
@ -53,7 +53,7 @@ make install
使用命令 `rpm -e 包名`,包名可以包含版本号等信息,但是不可以有后缀.rpm比如卸载软件包 proftpd-1.2.8-1可以使用下列格式
```sh
```bash
rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
@ -62,7 +62,7 @@ rpm -e proftpd
不可以是下列格式:
```sh
```bash
rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
@ -79,7 +79,7 @@ rpm -e proftpd-1
4查看与 rpm 包相关的文件和其他信息
```sh
```bash
rpm -qa # 列出所有安装过的包
```
@ -176,7 +176,7 @@ deb [web 或 ftp 地址][发行版名字] [main/contrib/non-free]
在修改 /etc/apt/sources.list 或者 /etc/apt/preferences 之后运行该命令。
```sh
```bash
# 更新 apt-get
apt-get update

View File

@ -143,7 +143,7 @@
- 使用括号扩展(`{`...`}`)来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用,例如 `mv foo.{txt,pdf} some-dir`(同时移动两个文件),`cp somefile{,.bak}`(会被扩展成 `cp somefile somefile.bak`)或者 `mkdir -p test-{a,b,c}/subtest-{1,2,3}`(会被扩展成所有可能的组合,并创建一个目录树)。
- 通过使用 `<(some command)` 可以将输出视为文件。例如,对比本地文件 `/etc/hosts` 和一个远程文件:
```sh
```bash
diff /etc/hosts <(ssh somehost cat /etc/hosts)
```
@ -180,7 +180,7 @@
- 考虑使用 [`mosh`](https://mosh.mit.edu/) 作为 ssh 的替代品,它使用 UDP 协议。它可以避免连接被中断并且对带宽需求更小,但它需要在服务端做相应的配置。
- 获取八进制形式的文件访问权限(修改系统设置时通常需要,但 `ls` 的功能不那么好用并且通常会搞砸),可以使用类似如下的代码:
```sh
```bash
stat -c '%A %a %n' /etc/timezone
```
@ -241,12 +241,12 @@
- 了解如何使用 `awk``sed` 来进行简单的数据处理。 参阅 [One-liners](#one-liners) 获取示例。
- 替换一个或多个文件中出现的字符串:
```sh
```bash
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
```
- 使用 [`repren`](https://github.com/jlevy/repren) 来批量重命名文件,或是在多个文件中搜索替换内容。(有些时候 `rename` 命令也可以批量重命名,但要注意,它在不同 Linux 发行版中的功能并不完全一样。)
```sh
```bash
# 将文件、目录和内容全部重命名 foo -> bar:
repren --full --preserve-case --from foo --to bar .
# 还原所有备份文件 whatever.bak -> whatever:
@ -256,7 +256,7 @@
```
- 根据 man 页面的描述,`rsync` 是一个快速且非常灵活的文件复制工具。它闻名于设备之间的文件同步,但其实它在本地情况下也同样有用。在安全设置允许下,用 `rsync` 代替 `scp` 可以实现文件续传,而不用重新从头开始。它同时也是删除大量文件的[最快方法](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html)之一:
```sh
```bash
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
```
@ -277,7 +277,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
- 制作二进制差分文件Delta 压缩),使用 `xdelta3`
- 使用 `iconv` 更改文本编码。需要更高级的功能,可以使用 `uconv`,它支持一些高级的 Unicode 功能。例如,这条命令移除了所有重音符号:
```sh
```bash
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
```
@ -290,7 +290,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
- 文件属性可以通过 `chattr` 进行设置,它比文件权限更加底层。例如,为了保护文件不被意外删除,可以使用不可修改标记:`sudo chattr +i /critical/directory/or/file`
- 使用 `getfacl``setfacl` 以保存和恢复文件权限。例如:
```sh
```bash
getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt
```
@ -346,7 +346,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
一些命令组合的例子:
- 当你需要对文本文件做集合交、并、差运算时,`sort` 和 `uniq` 会是你的好帮手。具体例子请参照代码后面的,此处假设 `a``b` 是两内容不同的文件。这种方式效率很高,并且在小文件和上 G 的文件上都能运用(注意尽管在 `/tmp` 在一个小的根分区上时你可能需要 `-T` 参数,但是实际上 `sort` 并不被内存大小约束),参阅前文中关于 `LC_ALL``sort``-u` 参数的部分。
```sh
```bash
sort a b | uniq > c # c 是 a 并 b
sort a b | uniq -d > c # c 是 a 交 b
sort a b b | uniq -u > c # c 是 a - b
@ -356,24 +356,24 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
- 计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍):
```sh
```bash
awk '{ x += $3 } END { print x }' myfile
```
- 如果你想在文件树上查看大小/日期,这可能看起来像递归版的 `ls -l` 但比 `ls -lR` 更易于理解:
```sh
```bash
find . -type f -ls
```
- 假设你有一个类似于 web 服务器日志文件的文本文件,并且一个确定的值只会出现在某些行上,假设一个 `acct_id` 参数在 URI 中。如果你想计算出每个 `acct_id` 值有多少次请求,使用如下代码:
```sh
```bash
egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn
```
- 要持续监测文件改动,可以使用 `watch`,例如检查某个文件夹中文件的改变,可以用 `watch -d -n 2 'ls -rtlh | tail'`;或者在排查 WiFi 设置故障时要监测网络设置的更改,可以用 `watch -d -n 2 ifconfig`
- 运行这个函数从这篇文档中随机获取一条技巧(解析 Markdown 文件并抽取项目):
```sh
```bash
function taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README-zh.md|
pandoc -f markdown -t html |

View File

@ -40,7 +40,7 @@ nameserver 8.8.8.8
firewalld 的基本使用
```sh
```bash
启动systemctl start firewalld
关闭systemctl stop firewalld
查看状态systemctl status firewalld
@ -148,7 +148,7 @@ systemctl restart crond.service
执行 `vim /etc/rc.local` 命令,输入以下内容:
```sh
```bash
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
@ -190,7 +190,7 @@ Linux 开机的时候,会加载运行 `/etc/rc.d/init.d` 目录下的程序,
2查看当前系统的启动级别
```sh
```bash
$ runlevel
N 3
```
@ -292,7 +292,7 @@ MAILTO=root
设置方法:
```sh
```bash
$ sed -i 's/id:5:initdefault:/id:3:initdefault:/' /etc/inittab
```

View File

@ -60,7 +60,7 @@ samba 服务的配置文件是 `/etc/samba/smb.conf`,如果没有则 samba 无
执行以下命令,编辑配置文件:
```sh
```bash
vim /etc/samba/smb.conf
```
@ -124,7 +124,7 @@ vim /etc/samba/smb.conf
创建的 samba 用户必须是 Linux 机器上实际存在的用户。
```sh
```bash
$ sudo smbpasswd -a root
New SMB password:
Retype new SMB password:
@ -140,14 +140,14 @@ Added user root.
CentOS 6
```sh
```bash
$ sudo service samba restart # 重启 samba
$ sudo service smb restart # 重启 samba
```
CentOS 7
```sh
```bash
$ sudo systemctl start smb.service # 启动 samba
$ sudo systemctl restart smb.service # 重启 samba
$ sudo systemctl enable smb.service # 设置开机自动启动
@ -441,7 +441,7 @@ guest ok = yes
1. 检查是否配置了防火墙规则
```sh
```bash
# 一种方法是强行关闭防火墙
$ sudo service iptables stop
@ -452,7 +452,7 @@ $ sudo firewall-cmd --reload
2. 关闭 selinux
```sh
```bash
# 将 /etc/selinux/config 文件中的 SELINUX 设为 disabled
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

View File

@ -208,7 +208,7 @@ filebeat 提供了一系列命令来完成各种功能。
执行命令方式:
```sh
```bash
./filebeat COMMAND
```
@ -224,7 +224,7 @@ filebeat 提供了一系列命令来完成各种功能。
>
> **示例** 指定配置文件启动
>
> ```sh
> ```bash
> ./filebeat run -e -c filebeat.yml -d "publish"
> ./filebeat -e -c filebeat.yml -d "publish" # run 可以省略
> ```

View File

@ -52,7 +52,7 @@ ELK 是 elastic 公司旗下三款产品 [ElasticSearch](https://www.elastic.co/
ELK 要求本地环境中安装了 JDK 。如果不确定是否已安装,可使用下面的命令检查:
```sh
```bash
java -version
```
@ -127,7 +127,7 @@ can not run elasticsearch as root
**解决方法:**使用非 root 权限账号运行 elasticsearch
```sh
```bash
# 创建用户组
groupadd elk
# 创建新用户,-g elk 设置其用户组为 elk-p elk 设置其密码为 elk

View File

@ -91,7 +91,7 @@ b. 键入命令: **java -version**、**java**、**javac** 几个命令,出现
2解压压缩包到本地
```sh
```bash
$ tar -zxf jdk-8u162-linux-x64.tar.gz
```
@ -99,7 +99,7 @@ $ tar -zxf jdk-8u162-linux-x64.tar.gz
执行 `/etc/profile` 命令,添加以下内容:
```sh
```bash
# JDK 的根路径
export JAVA_HOME=/opt/java/jdk1.8.0_162
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
@ -120,7 +120,7 @@ export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
2选择一个合适的版本安装
```sh
```bash
$ rpm -ivh jdk-8u181-linux-x64.rpm
```

View File

@ -101,7 +101,7 @@ nohup java -jar jenkins.war --httpPort=8080 >> nohup.out 2>&1 &
或者直接执行命令:
```sh
```bash
sed -i 's/www.google.com/www.baidu.com/g' /root/.jenkins/updates/default.json
```
@ -115,7 +115,7 @@ sed -i 's/www.google.com/www.baidu.com/g' /root/.jenkins/updates/default.json
或者直接执行命令:
```sh
```bash
sed -i '/^<url>/s/.*/<url>http:\/\/mirror.xmission.com\/jenkins\/updates\/update-center.json<\/url>/g' /root/.jenkins/hudson.model.UpdateCenter.xml
```

View File

@ -29,14 +29,14 @@
解压到本地:
```sh
```bash
> unzip rocketmq-all-4.2.0-source-release.zip
> cd rocketmq-all-4.2.0/
```
## 启动 Name Server
```sh
```bash
> nohup sh bin/mqnamesrv &
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
@ -44,7 +44,7 @@ The Name Server boot success...
## 启动 Broker
```sh
```bash
> nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf &
> tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...
@ -54,7 +54,7 @@ The broker[%s, 172.30.30.233:10911] boot success...
执行收发消息操作之前,不许告诉客户端命名服务器的位置。在 RocketMQ 中有多种方法来实现这个目的。这里,我们使用最简单的方法——设置环境变量 `NAMESRV_ADDR`
```sh
```bash
> export NAMESRV_ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
@ -65,7 +65,7 @@ ConsumeMessageThread_%d Receive New Messages: [MessageExt...
## 关闭服务器
```sh
```bash
> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
@ -113,7 +113,7 @@ brokerIP1 = 10.10.30.63
启动时需要指定配置文件
```sh
```bash
nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf &
```

View File

@ -21,13 +21,13 @@ Svn 是 Subversion 的简称,是一个开放源代码的版本控制系统,
### 1.1. 安装 svn
```sh
```bash
$ yum install -y subversion
```
### 1.2. 创建 svn 仓库
```sh
```bash
$ mkdir -p /share/svn
$ svnadmin create /share/svn
$ ls /share/svn
@ -42,7 +42,7 @@ conf db format hooks locks README.txt
### 1.3. 配置 svnserve.conf
```sh
```bash
$ vim /share/svn/conf/svnserve.conf
```
@ -58,7 +58,7 @@ realm = /share/svn # 认证空间名,版本库所在目录
### 1.4. 配置 passwd
```sh
```bash
$ vim /share/svn/conf/passwd
```
@ -73,7 +73,7 @@ user3 = 123456
### 1.5. 配置 authz
```sh
```bash
$ vim /share/svn/conf/authz
```
@ -89,7 +89,7 @@ user3 = rw
### 1.6. 启动关闭 svn
```sh
```bash
$ svnserve -d -r /share/svn # 启动 svn
$ killall svnserve # 关闭 svn
```
@ -102,13 +102,13 @@ $ killall svnserve # 关闭 svn
编辑 `/etc/rc.d/rc.local` 文件:
```sh
```bash
$ vi /etc/rc.d/rc.local
```
输入以下内容:
```sh
```bash
# 开机自动启动 svn默认端口是 3690
$ /usr/bin/svnserve -d -r /share/svn --listen-port 3690
```
@ -125,7 +125,7 @@ CentOS 7 中的 `/etc/rc.d/rc.local` 是没有执行权限的,系统建议创
找到 svn 的 service 配置文件 `/etc/sysconfig/svnserve` 编辑配置文件
```sh
```bash
$ vi /etc/sysconfig/svnserve
```

View File

@ -108,14 +108,14 @@ Git 是一个非常优秀的版本控制工具,但是在实际版本管理中
a. 创建develop分支
```sh
```bash
git branch develop
git push -u origin develop
```
b. 开始新Feature开发
```sh
```bash
git checkout -b some-feature develop
# Optionally, push branch to origin:
git push -u origin some-feature
@ -128,7 +128,7 @@ git commit
c. 完成Feature
```sh
```bash
git pull origin develop
git checkout develop
git merge --no-ff some-feature
@ -142,7 +142,7 @@ git push origin --delete some-feature
d. 开始Relase
```sh
```bash
git checkout -b release-0.1.0 develop
# Optional: Bump version number, commit
@ -151,7 +151,7 @@ git checkout -b release-0.1.0 develop
e. 完成Release
```sh
```bash
git checkout master
git merge --no-ff release-0.1.0
git push
@ -172,13 +172,13 @@ git push --tags
f. 开始Hotfix
```sh
```bash
git checkout -b hotfix-0.1.1 master
```
g. 完成Hotfix
```sh
```bash
git checkout master
git merge --no-ff hotfix-0.1.1
git push

View File

@ -65,13 +65,13 @@
如果你用 `git commit -a` 提交了一次变化(changes),而你又不确定到底这次提交了哪些内容。 你就可以用下面的命令显示当前`HEAD`上的最近一次的提交(commit):
```sh
```bash
(master)$ git show
```
或者
```sh
```bash
$ git log -n1 -p
```
@ -79,13 +79,13 @@ $ git log -n1 -p
如果你的提交信息(commit message)写错了且这次提交(commit)还没有推(push), 你可以通过下面的方法来修改提交信息(commit message):
```sh
```bash
$ git commit --amend
```
这会打开你的默认编辑器, 在这里你可以编辑信息. 另一方面, 你也可以用一条命令一次完成:
```sh
```bash
$ git commit --amend -m 'xxxxxxx'
```
@ -95,7 +95,7 @@ $ git commit --amend -m 'xxxxxxx'
如果这只是单个提交(commit),修改它:
```sh
```bash
$ git commit --amend --author "New Authorname <authoremail@mydomain.com>"
```
@ -105,7 +105,7 @@ $ git commit --amend --author "New Authorname <authoremail@mydomain.com>"
通过下面的方法,从一个提交(commit)里移除一个文件:
```sh
```bash
$ git checkout HEAD^ myfile
$ git add -A
$ git commit --amend
@ -117,7 +117,7 @@ $ git commit --amend
如果你需要删除推了的提交(pushed commits),你可以使用下面的方法。可是,这会不可逆的改变你的历史,也会搞乱那些已经从该仓库拉取(pulled)了的人的历史。简而言之,如果你不是很确定,千万不要这么做。
```sh
```bash
$ git reset HEAD^ --hard
$ git push -f [remote] [branch]
```
@ -135,7 +135,7 @@ $ git push -f [remote] [branch]
同样的警告:不到万不得已的时候不要这么做.
```sh
```bash
$ git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
$ git push -f [remote] [branch]
```
@ -144,7 +144,7 @@ $ git push -f [remote] [branch]
### 我尝试推一个修正后的提交(amended commit)到远程,但是报错:
```sh
```bash
To https://github.com/yourusername/repo.git
! [rejected] mybranch -> mybranch (non-fast-forward)
error: failed to push some refs to 'https://github.com/tanay1337/webmaker.org.git'
@ -156,7 +156,7 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
注意, rebasing(见下面)和修正(amending)会用一个**新的提交(commit)代替旧的**, 所以如果之前你已经往远程仓库上推过一次修正前的提交(commit),那你现在就必须强推(force push) (`-f`)。 注意 &ndash; *总是* 确保你指明一个分支!
```sh
```bash
(my-branch)$ git push origin mybranch -f
```
@ -166,13 +166,13 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
如果你意外的做了 `git reset --hard`, 你通常能找回你的提交(commit), 因为Git对每件事都会有日志且都会保存几天。
```sh
```bash
(master)$ git reflog
```
你将会看到一个你过去提交(commit)的列表, 和一个重置的提交。 选择你想要回到的提交(commit)的SHA再重置一次:
```sh
```bash
(master)$ git reset --hard SHA1234
```
@ -182,7 +182,7 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
### 我需要把暂存的内容添加到上一次的提交(commit)
```sh
```bash
(my-branch*)$ git commit --amend
```
@ -191,13 +191,13 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details.
一般来说, 如果你想暂存一个文件的一部分, 你可这样做:
```sh
```bash
$ git add --patch filename.x
```
`-p` 简写。这会打开交互模式, 你将能够用 `s` 选项来分隔提交(commit) 然而, 如果这个文件是新的, 会没有这个选择, 添加一个新文件时, 这样做:
```sh
```bash
$ git add -N filename.x
```
@ -211,7 +211,7 @@ $ git add -N filename.x
这个有点困难, 我能想到的最好的方法是先stash未暂存的内容 然后重置(reset)再pop第一步stashed的内容, 最后再add它们。
```sh
```bash
$ git stash -k
$ git reset --hard
$ git stash pop
@ -222,13 +222,13 @@ $ git add -A
### 我想把未暂存的内容移动到一个新分支
```sh
```bash
$ git checkout -b my-branch
```
### 我想把未暂存的内容移动到另一个已存在的分支
```sh
```bash
$ git stash
$ git checkout my-branch
$ git stash pop
@ -238,7 +238,7 @@ $ git stash pop
如果你只是想重置源(origin)和你本地(local)之间的一些提交(commit),你可以:
```sh
```bash
# one commit
(my-branch)$ git reset --hard HEAD^
# two commits
@ -251,7 +251,7 @@ $ git stash pop
重置某个特殊的文件, 你可以用文件名做为参数:
```sh
```bash
$ git reset filename
```
@ -261,14 +261,14 @@ $ git reset filename
签出(checkout)不需要的内容,保留需要的。
```sh
```bash
$ git checkout -p
# Answer y to all of the snippets you want to drop
```
另外一个方法是使用 `stash` Stash所有要保留下的内容, 重置工作拷贝, 重新应用保留的部分。
```sh
```bash
$ git stash -p
# Select all of the snippets you want to save
$ git reset --hard
@ -277,7 +277,7 @@ $ git stash pop
或者, stash 你不需要的部分, 然后stash drop。
```sh
```bash
$ git stash -p
# Select all of the snippets you don't want to save
$ git stash drop
@ -289,7 +289,7 @@ $ git stash drop
这是另外一种使用 `git reflog` 情况,找到在这次错误拉(pull) 之前HEAD的指向。
```sh
```bash
(master)$ git reflog
ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward
c5bc55a HEAD@{1}: checkout: checkout message goes here
@ -297,7 +297,7 @@ c5bc55a HEAD@{1}: checkout: checkout message goes here
重置分支到你所需的提交(desired commit):
```sh
```bash
$ git reset --hard c5bc55a
```
@ -309,7 +309,7 @@ $ git reset --hard c5bc55a
`git status` 会显示你领先(ahead)源(origin)多少个提交:
```sh
```bash
(my-branch)$ git status
# On branch my-branch
# Your branch is ahead of 'origin/my-branch' by 2 commits.
@ -319,7 +319,7 @@ $ git reset --hard c5bc55a
一种方法是:
```sh
```bash
(master)$ git reset --hard origin/my-branch
```
@ -327,13 +327,13 @@ $ git reset --hard c5bc55a
在master下创建一个新分支不切换到新分支,仍在master下:
```sh
```bash
(master)$ git branch my-branch
```
把master分支重置到前一个提交:
```sh
```bash
(master)$ git reset --hard HEAD^
```
@ -343,14 +343,14 @@ $ git reset --hard c5bc55a
例如, master分支想重置到的提交的hash为`a13b85e`:
```sh
```bash
(master)$ git reset --hard a13b85e
HEAD is now at a13b85e
```
签出(checkout)刚才新建的分支继续工作:
```sh
```bash
(master)$ git checkout my-branch
```
@ -358,7 +358,7 @@ HEAD is now at a13b85e
假设你正在做一个原型方案(原文为working spike (see note)), 有成百的内容,每个都工作得很好。现在, 你提交到了一个分支,保存工作内容:
```sh
```bash
(solution)$ git add -A && git commit -m "Adding all changes from this spike into one big commit."
```
@ -371,13 +371,13 @@ HEAD is now at a13b85e
我去可以通过把内容拿到你的分支里,来解决这个问题:
```sh
```bash
(develop)$ git checkout solution -- file1.txt
```
这会把这个文件内容从分支 `solution` 拿到分支 `develop` 里来:
```sh
```bash
# On branch develop
# Your branch is up-to-date with 'origin/develop'.
# Changes to be committed:
@ -394,7 +394,7 @@ Note: Spike solutions are made to analyze or solve the problem. These solutions
假设你有一个`master`分支, 执行`git log`, 你看到你做过两次提交:
```sh
```bash
(master)$ git log
commit e3851e817c451cc36f2e6f3049db528415e3c114
@ -420,21 +420,21 @@ Date: Tue Jul 21 01:12:48 2014 -0400
首先, 我们把`master`分支重置到正确的提交(`a13b85e`):
```sh
```bash
(master)$ git reset --hard a13b85e
HEAD is now at a13b85e
```
现在, 我们对 bug #21 创建一个新的分支:
```sh
```bash
(master)$ git checkout -b 21
(21)$
```
接着, 我们用 *cherry-pick* 把对bug #21的提交放入当前分支。 这意味着我们将应用(apply)这个提交(commit),仅仅这一个提交(commit)直接在HEAD上面。
```sh
```bash
(21)$ git cherry-pick e3851e8
```
@ -442,7 +442,7 @@ HEAD is now at a13b85e
再者, 我们为bug #14 创建一个新的分支, 也基于`master`分支
```sh
```bash
(21)$ git checkout master
(master)$ git checkout -b 14
(14)$
@ -450,14 +450,14 @@ HEAD is now at a13b85e
最后, 为 bug #14 执行 `cherry-pick`:
```sh
```bash
(14)$ git cherry-pick 5ea5173
```
### 我想删除上游(upstream)分支被删除了的本地分支
一旦你在github 上面合并(merge)了一个pull request, 你就可以删除你fork里被合并的分支。 如果你不准备继续在这个分支里工作, 删除这个分支的本地拷贝会更干净,使你不会陷入工作分支和一堆陈旧分支的混乱之中。
```sh
```bash
$ git fetch -p
```
@ -465,7 +465,7 @@ $ git fetch -p
如果你定期推送到远程, 多数情况下应该是安全的,但有些时候还是可能删除了还没有推到远程的分支。 让我们先创建一个分支和一个新的文件:
```sh
```bash
(master)$ git checkout -b my-branch
(my-branch)$ git branch
(my-branch)$ touch foo.txt
@ -475,7 +475,7 @@ README.md foo.txt
添加文件并做一次提交
```sh
```bash
(my-branch)$ git add .
(my-branch)$ git commit -m 'foo.txt added'
(my-branch)$ foo.txt added
@ -498,7 +498,7 @@ Date: Tue Jul 29 13:14:46 2014 -0400
现在我们切回到主(master)分支,‘不小心的’删除`my-branch`分支
```sh
```bash
(my-branch)$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
@ -519,7 +519,7 @@ oh noes, deleted my branch!
正如你所见我们有一个来自删除分支的提交hash(commit hash),接下来看看是否能恢复删除了的分支。
```sh
```bash
(master)$ git checkout -b my-branch-help
Switched to a new branch 'my-branch-help'
(my-branch-help)$ git reset --hard 4e3cd85
@ -534,19 +534,19 @@ README.md foo.txt
删除一个远程分支:
```sh
```bash
(master)$ git push origin --delete my-branch
```
你也可以:
```sh
```bash
(master)$ git push origin :my-branch
```
删除一个本地分支:
```sh
```bash
(master)$ git branch -D my-branch
```
@ -554,13 +554,13 @@ README.md foo.txt
首先, 从远程拉取(fetch) 所有分支:
```sh
```bash
(master)$ git fetch --all
```
假设你想要从远程的`daves`分支签出到本地的`daves`
```sh
```bash
(master)$ git checkout --track origin/daves
Branch daves set up to track remote branch daves from origin.
Switched to a new branch 'daves'
@ -576,7 +576,7 @@ Switched to a new branch 'daves'
你可以合并(merge)或rebase了一个错误的分支, 或者完成不了一个进行中的rebase/merge。 Git 在进行危险操作的时候会把原始的HEAD保存在一个叫ORIG_HEAD的变量里, 所以要把分支恢复到rebase/merge前的状态是很容易的。
```sh
```bash
(my-branch)$ git reset --hard ORIG_HEAD
```
@ -584,7 +584,7 @@ Switched to a new branch 'daves'
不幸的是,如果你想把这些变化(changes)反应到远程分支上,你就必须得强推(force push)。 是因你快进(Fast forward)了提交改变了Git历史, 远程分支不会接受变化(changes),除非强推(force push)。这就是许多人使用 merge 工作流, 而不是 rebasing 工作流的主要原因之一, 开发者的强推(force push)会使大的团队陷入麻烦。使用时需要注意,一种安全使用 rebase 的方法是,不要把你的变化(changes)反映到远程分支上, 而是按下面的做:
```sh
```bash
(master)$ git checkout my-branch
(my-branch)$ git rebase -i master
(my-branch)$ git checkout master
@ -597,20 +597,20 @@ Switched to a new branch 'daves'
假设你的工作分支将会做对于 `master` 的pull-request。 一般情况下你不关心提交(commit)的时间戳,只想组合 *所有* 提交(commit) 到一个单独的里面, 然后重置(reset)重提交(recommit)。 确保主(master)分支是最新的和你的变化都已经提交了, 然后:
```sh
```bash
(my-branch)$ git reset --soft master
(my-branch)$ git commit -am "New awesome feature"
```
如果你想要更多的控制, 想要保留时间戳, 你需要做交互式rebase (interactive rebase):
```sh
```bash
(my-branch)$ git rebase -i master
```
如果没有相对的其它分支, 你将不得不相对自己的`HEAD` 进行 rebase。 例如:你想组合最近的两次提交(commit), 你将相对于`HEAD\~2` 进行rebase 组合最近3次提交(commit), 相对于`HEAD\~3`, 等等。
```sh
```bash
(master)$ git rebase -i HEAD~2
```
@ -681,20 +681,20 @@ Newer, awesomer features
如果成功了, 你应该看到类似下面的内容:
```sh
```bash
(master)$ Successfully rebased and updated refs/heads/master.
```
#### 安全合并(merging)策略
`--no-commit` 执行合并(merge)但不自动提交, 给用户在做提交前检查和修改的机会。 `no-ff` 会为特性分支(feature branch)的存在过留下证据, 保持项目历史一致。
```sh
```bash
(master)$ git merge --no-ff --no-commit my-branch
```
#### 我需要将一个分支合并成一个提交(commit)
```sh
```bash
(master)$ git merge --squash my-branch
```
@ -702,7 +702,7 @@ Newer, awesomer features
有时候,在将数据推向上游之前,你有几个正在进行的工作提交(commit)。这时候不希望把已经推(push)过的组合进来,因为其他人可能已经有提交(commit)引用它们了。
```sh
```bash
(master)$ git rebase -i @{u}
```
@ -712,13 +712,13 @@ Newer, awesomer features
检查一个分支上的所有提交(commit)是否都已经合并(merge)到了其它分支, 你应该在这些分支的head(或任何 commits)之间做一次diff:
```sh
```bash
(master)$ git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll
```
这会告诉你在一个分支里有而另一个分支没有的所有提交(commit), 和分支之间不共享的提交(commit)的列表。 另一个做法可以是:
```sh
```bash
(master)$ git log master ^feature/120-on-scroll --no-merges
```
@ -742,7 +742,7 @@ noop
首先执行 `git status` 找出哪些文件有冲突:
```sh
```bash
(my-branch)$ git status
On branch my-branch
Changes not staged for commit:
@ -766,13 +766,13 @@ Changes not staged for commit:
有时候这些合并非常复杂,你应该使用可视化的差异编辑器(visual diff editor):
```sh
```bash
(master*)$ git mergetool -t opendiff
```
在你解决完所有冲突和测试过后, `git add` 变化了的(changed)文件, 然后用`git rebase --continue` 继续rebase。
```sh
```bash
(my-branch)$ git add README.md
(my-branch)$ git rebase --continue
```
@ -781,7 +781,7 @@ Changes not staged for commit:
任何时候你想结束整个rebase 过程回来rebase前的分支状态, 你可以做:
```sh
```bash
(my-branch)$ git rebase --abort
```
@ -789,19 +789,19 @@ Changes not staged for commit:
### 克隆所有子模块
```sh
```bash
$ git clone --recursive git://github.com/foo/bar.git
```
如果已经克隆了:
```sh
```bash
$ git submodule update --init --recursive
```
### 删除标签(tag)
```sh
```bash
$ git tag -d <tag_name>
$ git push <remote> :refs/tags/<tag_name>
```
@ -810,13 +810,13 @@ $ git push <remote> :refs/tags/<tag_name>
如果你想恢复一个已删除标签(tag), 可以按照下面的步骤: 首先, 需要找到无法访问的标签(unreachable tag):
```sh
```bash
$ git fsck --unreachable | grep tag
```
记下这个标签(tag)的hash然后用Git的 [update-ref](http://git-scm.com/docs/git-update-ref):
```sh
```bash
$ git update-ref refs/tags/<tag_name> <hash>
```
@ -832,13 +832,13 @@ $ git update-ref refs/tags/<tag_name> <hash>
### 我只想改变一个文件名字的大小写,而不修改内容
```sh
```bash
(master)$ git mv --force myfile MyFile
```
### 我想从Git删除一个文件但保留该文件
```sh
```bash
(master)$ git rm --cached log.txt
```
@ -875,12 +875,12 @@ $ git update-ref refs/tags/<tag_name> <hash>
你可能有一个仓库需要授权,这时你可以缓存用户名和密码,而不用每次推/拉(push/pull)的时候都输入Credential helper能帮你。
```sh
```bash
$ git config --global credential.helper cache
# Set git to use the credential memory cache
```
```sh
```bash
$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)
```
@ -891,7 +891,7 @@ $ git config --global credential.helper 'cache --timeout=3600'
这就是 `git reflog` 的目的, `reflog` 记录对分支顶端(the tip of a branch)的任何改变, 即使那个顶端没有被任何分支或标签引用。基本上, 每次HEAD的改变, 一条新的记录就会增加到`reflog`。遗憾的是,这只对本地分支起作用,且它只跟踪动作 (例如,不会跟踪一个没有被记录的文件的任何改变)。
```sh
```bash
(master)$ git reflog
0a2e358 HEAD@{0}: reset: moving to HEAD\~2
0254ea7 HEAD@{1}: checkout: moving from 2.2 to master
@ -902,7 +902,7 @@ c10f740 HEAD@{2}: checkout: moving from master to 2.2
如果事实证明你不小心回移(move back)了提交(commit), reflog 会包含你不小心回移前master上指向的提交(0254ea7)。
```sh
```bash
$ git reset --hard 0254ea7
```

View File

@ -117,7 +117,7 @@ Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值
如果你使用的系统是 Debian/Ubuntu 安装命令为:
```sh
```bash
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
> libz-dev libssl-dev
$ apt-get install git-core
@ -129,7 +129,7 @@ git version 1.8.1.2
如果你使用的系统是 Centos/RedHat ,安装命令为:
```sh
```bash
$ yum install curl-devel expat-devel gettext-devel \
> openssl-devel zlib-devel
$ yum -y install git-core
@ -196,7 +196,7 @@ $ git config --global user.email johndoe@example.com
#### 克隆一个已创建的仓库
```sh
```bash
# 通过 SSH
$ git clone ssh://user@domain.com/repo.git
@ -206,7 +206,7 @@ $ git clone http://domain.com/user/repo.git
#### 创建一个新的本地仓库
```sh
```bash
$ git init
```
@ -214,7 +214,7 @@ $ git init
#### 添加修改到暂存区
```sh
```bash
# 把指定文件添加到暂存区
$ git add xxx
@ -227,7 +227,7 @@ $ git add -A
#### 提交修改到本地仓库
```sh
```bash
# 提交本地的所有修改
$ git commit -a
@ -244,7 +244,7 @@ $ git commit -m 'commit message'
官方称之为储藏,但我个人更喜欢称之为存草稿。
```sh
```bash
# 1. 将修改作为当前分支的草稿保存
$ git stash
@ -263,7 +263,7 @@ $ git stash apply stash@{0}
#### 撤销本地修改
```sh
```bash
# 移除缓存区的所有文件i.e. 撤销上次git add
$ git reset HEAD
@ -288,7 +288,7 @@ $ git checkout HEAD <file>
##### 删除添加`.gitignore`文件前错误提交的文件
```sh
```bash
$ git rm -r --cached .
$ git add .
$ git commit -m "remove xyz file"
@ -298,13 +298,13 @@ $ git commit -m "remove xyz file"
#### 创建一个新的提交,并回滚到指定版本
```sh
```bash
$ git revert <commit-hash>
```
#### 彻底删除指定版本
```sh
```bash
# 执行下面命令后commit-hash 提交后的记录都会被彻底删除,使用需谨慎
$ git reset --hard <commit-hash>
$ git push -f
@ -314,7 +314,7 @@ $ git push -f
#### 更新
```sh
```bash
# 下载远程端版本但不合并到HEAD中
$ git fetch <remote>
@ -327,7 +327,7 @@ $ git pull --rebase <remote> <branch>
#### 推送
```sh
```bash
# 将本地版本推送到远程端
$ git push remote <remote> <branch>
@ -343,19 +343,19 @@ $ git push --tags
#### 显示工作路径下已修改的文件
```sh
```bash
$ git status
```
#### 显示与上次提交版本文件的不同
```sh
```bash
$ git diff
```
#### 显示提交历史
```sh
```bash
# 从最新提交开始显示所有的提交记录显示hash 作者信息,提交的标题和时间)
$ git log
@ -368,7 +368,7 @@ $ git log -p <file>
#### 显示搜索内容
```sh
```bash
# 从当前目录的所有文件中查找文本内容
$ git grep "Hello"
@ -380,7 +380,7 @@ $ git grep "Hello" v2.5
#### 增删查分支
```sh
```bash
# 列出所有的分支
$ git branch
@ -402,7 +402,7 @@ $ git branch -D <branch>
#### 切换分支
```sh
```bash
# 切换分支
$ git checkout <branch>
@ -412,7 +412,7 @@ $ git checkout -b <branch>
#### 标签
```sh
```bash
# 给当前版本打标签
$ git tag <tag-name>
@ -430,14 +430,14 @@ $ git tag -a <tag-name>
#### 合并
```sh
```bash
# 将分支合并到当前HEAD中
$ git merge <branch>
```
#### 重置
```sh
```bash
# 将当前HEAD版本重置到分支中请勿重置已发布的提交
$ git rebase <branch>
```