更改 code block
parent
90910209fe
commit
0e20618e23
|
@ -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
|
||||
|
|
|
@ -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/
|
||||
|
||||
|
|
|
@ -107,7 +107,7 @@ Shell 的解释器种类众多,常见的有:
|
|||
|
||||
- 指定 sh 解释器
|
||||
|
||||
```sh
|
||||
```bash
|
||||
#!/bin/sh
|
||||
```
|
||||
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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 * # 删除当前目录下的所有文件和目录
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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/ # 在指定目录下解压缩,如果有相同文件存在则覆盖
|
||||
|
|
|
@ -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
|
||||
# 列出目前的权限
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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端口
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 可以省略
|
||||
> ```
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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 &
|
||||
```
|
||||
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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`)。 注意 – *总是* 确保你指明一个分支!
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
|
|
|
@ -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>
|
||||
```
|
||||
|
|
Loading…
Reference in New Issue