0%

Linux 之 last 登陆信息

Linux last 命令用于显示用户最近的登录信息。

官方定义为:

last, lastb - show listing of last logged in users

通过读取/var/log/wtmp文件来获取这些信息。

语法

1
$ last [-R] [-num] [ -n num ] [-adFiowx] [ -f file ] [ -t YYYYMMDDHHMMSS] [name...]  [tty...]

参数

  • -R 省略 hostname 的栏位

  • -n 展示前 num 个

  • username 展示 username 的登入讯息

  • tty 限制登入讯息包含终端机代号

一般使用方法

1
2
3
4
5
6
7
8
9
10
11
12
$ last
username2 pts/17 192.168.100.123 Wed Mar 23 22:14 still logged in
username3 pts/20 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/23 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/4 192.168.100.125 Thu Jun 10 18:37 - 22:57 (04:20)
username5 pts/4 192.168.100.125 Thu Jun 10 18:21 - 18:21 (00:00)
username6 pts/9 192.168.100.126 Thu Jun 10 18:11 - 18:20 (00:09)
username7 pts/15 192.168.100.122 Thu Jun 10 18:04 - 23:44 (1+05:40)
username8 pts/14 192.168.100.121 Thu Jun 10 17:59 - 07:50 (13:50)
username9 pts/9 192.168.100.126 Thu Jun 10 17:59 - 18:03 (00:04)

wtmp begins Thu Jun 10 17:33:14 2013

查看最近登陆的三个用户

1
2
3
4
5
6
7
$ last -3

username2 pts/17 192.168.100.123 Wed Mar 23 22:14 still logged in
username3 pts/20 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/23 localhost:11.0 Wed Mar 23 14:26 - 15:48 (01:21)

wtmp begins Thu Jun 10 17:33:14 2013

省略hostname

1
2
3
4
5
6
$ last -3 -R
username2 pts/17 Wed Mar 23 22:14 still logged in
username3 pts/20 Wed Mar 23 14:26 - 15:48 (01:21)
username4 pts/23 Wed Mar 23 14:26 - 15:48 (01:21)

wtmp begins Thu Jun 10 17:33:14 2013

显示最后一列显示主机IP地址

1
2
3
4
5
6
7
8
$ last -n 5 -a -i
username3 pts/17 Wed Mar 23 22:14 still logged in 192.168.100.123
username5 pts/20 Wed Mar 23 14:26 - 15:48 (01:21) 0.0.0.0
username6 pts/23 Wed Mar 23 14:26 - 15:48 (01:21) 0.0.0.0
username7 pts/19 Wed Mar 23 13:46 - 15:48 (02:01) 192.168.100.123
username8 pts/17 Wed Mar 23 13:18 - 15:47 (02:29) 192.168.100.123

wtmp begins Thu Jun 10 17:33:14 2013

​ Last searches back through the file /var/log/wtmp (or the file desig‐
​ nated by the -f flag) and displays a list of all users logged in (and
​ out) since that file was created. Names of users and tty’s can be
​ given, in which case last will show only those entries matching the
​ arguments. Names of ttys can be abbreviated, thus last 0 is the same
​ as last tty0.

When last catches a SIGINT signal (generated by the interrupt key, usu‐
ally control-C) or a SIGQUIT signal (generated by the quit key, usually
control-), last will show how far it has searched through the file; in
the case of the SIGINT signal last will then terminate.

   The pseudo user reboot logs in each time the system is rebooted.   Thus
   last  reboot will show a log of all reboots since the log file was cre‐
   ated.

   Lastb is the same as last, except that by default it shows a log of the
   file /var/log/btmp, which contains all the bad login attempts.

OPTIONS
-f file
Tells last to use a specific file instead of /var/log/wtmp.

   -num   This is a count telling last how many lines to show.

   -n num The same.

   -t YYYYMMDDHHMMSS
          Display  the  state of logins as of the specified time.  This is
          useful, e.g., to determine easily who was logged in at a partic‐
          ular  time  --  specify  that  time  with -t and look for "still
          logged in".

   -f file
          Specifies a file to search other than /var/log/wtmp.

   -R     Suppresses the display of the hostname field.

   -a     Display the hostname in the last column. Useful  in  combination           with the next flag.

   -d     For non-local logins, Linux stores not only the host name of the
          remote host but its IP number as well.  This  option  translates
          the IP number back into a hostname.

   -F     Print full login and logout times and dates.

   -i     This  option is like -d in that it displays the IP number of the
          remote host, but it displays the IP number  in  numbers-and-dots
          notation.

   -o     Read  an  old-type  wtmp  file  (written by linux-libc5 applica‐
          tions).

   -w     Display full user and domain names in the output.

   -x     Display the system shutdown entries and run level changes.

NOTES
The files wtmp and btmp might not be found. The system only logs infor‐
mation in these files if they are present. This is a local configura‐
tion issue. If you want the files to be used, they can be created with
a simple touch(1) command (for example, touch /var/log/wtmp).

FILES
/var/log/wtmp
/var/log/btmp

AUTHOR
Miquel van Smoorenburg, miquels@cistron.nl

SEE ALSO
login(1), init(8)

Python导入模块

使用import

1
2
3
4
import math

print(math.pi)
print(math.sin(math.pi))

使用from

1
2
3
4
5
from math import pi,sin,cos

print(pi)
print(sin(123))
print(cos(123))

定义别名

1
2
3
4
5
from math import sin as mysin
from math import cos as mycos

print(mysin(123))
print(mycos(123))

Python 模块的搜索路径

设置PYTHONPATH环境变量

1
$ export PYTHONPATH=$PYTHONPATH:/new/path/

通过sys.path来设置

1
2
3
4
5
import sys

print (sys.path)
print (sys.path.append('/new/path'))
print (sys.path)

通过IDE来设置

根据不用的IDE,有不同的方法,一般在setting那里,
比如Pycharm或者VS code。

获取文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
print("获取当前文件路径——" + os.path.realpath(__file__))  # 获取当前文件路径

parent = os.path.dirname(os.path.realpath(__file__))
print("获取其父目录——" + parent) # 从当前文件路径中获取目录

garder = os.path.dirname(parent)
print("获取父目录的父目录——" + garder)
print("获取文件名" + os.path.basename(os.path.realpath(__file__))) # 获取文件名

# 当前文件的路径
pwd = os.getcwd()
print("当前运行文件路径" + pwd)

# 当前文件的父路径
father_path = os.path.abspath(os.path.dirname(pwd) + os.path.sep + ".")
print("运行文件父路径" + father_path)

# 当前文件的前两级目录
grader_father = os.path.abspath(os.path.dirname(pwd) + os.path.sep + "..")
print("运行文件父路径的父路径" + grader_father)
1
2
3
4
5
6
7
8
9
10
11
12
13
import os

curpath = os.path.realpath(__file__) # 获取当前文件绝对路径
print(curpath)

dirpath = os.path.dirname(curpath) # 获取当前文件的文件夹路径
print(dirpath)

casespath = os.path.join(dirpath, "cases") # 拼接文件路径
print(casespath)

report = os.path.join(dirpath, "report", "result.html") # 拼接文件夹路径
print(report)

如何安装dspsr – how to install dspsr

如果只是使用,那么可以使用下面一个命令来获取Tempo的运行环境(需要安装docker):

1
$ docker run -it shaoguangleo/ubuntu-pulsar

如果希望运行图形界面,运行下述命令:

1
$ docker run -it -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix shaoguangleo/ubuntu-pulsar

如果希望体验一下Tempo,安装如下所示,配置参考[ASTROSOFT_CONFIG][astrosoft_config]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tar zxvf tempo.tar.gz
$ cd tempo
$ ./prepare
$ ./configure --prefix=/usr/local/tempo
$ make
$ make install
$ cp -rv clock ephem tzpar util /usr/local/tempo
$ cp tempo.hlp /usr/local/tempo
$ cp obsys.dat /usr/local/tempo
$ echo "export PATH=$PATH:/usr/local/tempo/bin" >> ~/.bashrc
$ echo "export TEMPO=/usr/local/tempo" >> ~/.bashrc
$ echo "export CLKDIR=/usr/local/tempo/clock" >> ~/.bashrc
$ echo "export PARDIR=/usr/local/tempo/tzpar" >> ~/.bashrc
$ echo "export EPHDIR=/usr/local/tempo/ephem" >> ~/.bashrc
$ echo "export OBSYS=/usr/local/tempo/obsys.dat" >> ~/.bashrc

Enjoy~
[^ astrosoft_config]: https://github.com/shaoguangleo/AstroSoft

如何安装Tempo – how to install Tempo

如果只是使用,那么可以使用下面一个命令来获取Tempo的运行环境(需要安装docker):

1
2
3
$ docker run -it shaoguangleo/ubuntu-tempo
# or
$ docker run -it shaoguangleo/centos-tempo

如果希望运行图形界面,运行下述命令:

1
2
3
$ docker run -it -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix shaoguangleo/ubuntu-tempo
# or
$ docker run -it -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix shaoguangleo/centos-tempo

如果希望体验一下Tempo,安装如下所示,配置参考[ASTROSOFT_CONFIG][astrosoft_config]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tar zxvf tempo.tar.gz
$ cd tempo
$ ./prepare
$ ./configure --prefix=/usr/local/tempo
$ make
$ make install
$ cp -rv clock ephem tzpar util /usr/local/tempo
$ cp tempo.hlp /usr/local/tempo
$ cp obsys.dat /usr/local/tempo
$ echo "export PATH=$PATH:/usr/local/tempo/bin" >> ~/.bashrc
$ echo "export TEMPO=/usr/local/tempo" >> ~/.bashrc
$ echo "export CLKDIR=/usr/local/tempo/clock" >> ~/.bashrc
$ echo "export PARDIR=/usr/local/tempo/tzpar" >> ~/.bashrc
$ echo "export EPHDIR=/usr/local/tempo/ephem" >> ~/.bashrc
$ echo "export OBSYS=/usr/local/tempo/obsys.dat" >> ~/.bashrc

如何安装Tempo2 – how to install Tempo2

如果只是使用,那么可以使用下面一个命令来获取Tempo的运行环境(需要安装docker):

1
2
3
$ docker run -it shaoguangleo/ubuntu-tempo2
# or
$ docker run -it shaoguangleo/centos-tempo2

如果希望运行图形界面,运行下述命令,配置参考[ASTROSOFT_CONFIG][astrosoft_config]:

1
2
3
$ docker run -it -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix shaoguangleo/ubuntu-tempo2
# or
$ docker run -it -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix shaoguangleo/centos-tempo2

如果希望体验一下Tempo2,安装如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ source astrosoft_config.sh

$ git clone $TEMPO2_WEBSITE tempo2_src

$ cd tempo2_src

$ ./bootstrap
$ cp -r T2runtime $ASTROSOFT/tempo2/
$ export TEMPO2=$ASTROSOFT/tempo2
$ echo "export TEMPO2=$ASTROSOFT/tempo2" >> ~/.bashrc

$ ./configure --prefix=$ASTROSOFT/tempo2

$ make
$ make install

$ make plugins
$ make plugins-install
#make temponest-instal

Linux 强大的网络工具 ethtool

ethtool 命令主要用于查询配置网卡参数, 但是它的功能超出你的想象。

比如有很多网口,不知道哪个对应哪一个,so easy,直接

1
$ ethtool -p ethN # Show visible port identification (e.g. blinking)

此时就可以看到ethN的灯在闪了

而具体的查看网卡类型,可以使用

1
2
3
4
5
6
7
8
9
10
11
$ ethtool -i ethN
driver: bnxt_en
version: 1.10.0
firmware-version: 214.0.253.1/pkg 21.40.25.31
expansion-rom-version:
bus-info: 0000:18:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: no
supports-priv-flags: no

此时可以通过modinfo来查看网卡驱动的详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ modinfo bnxt_en

ilename: /lib/modules/4.18.0-147.5.1.el8_1.x86_64/kernel/drivers/net/ethernet/broadcom/bnxt/bnxt_en.ko.xz
version: 1.10.0
description: Broadcom BCM573xx network driver
license: GPL
rhelversion: 8.1
srcversion: 2E74274561578E7E250F661
alias: pci:v000014E4d0000D800sv*sd*bc*sc*i*
alias: pci:v000014E4d00001807sv*sd*bc*sc*i*
......
depends:
intree: Y
name: bnxt_en
vermagic: 4.18.0-147.5.1.el8_1.x86_64 SMP mod_unload modversions
sig_id: PKCS#7
signer: CentOS Linux kernel signing key
sig_key: 6C:E4:44:06:AD:56:56:1C:FE:E9:7E:99:45:F8:69:0F:DF:1E:EA:FA
sig_hashalgo: sha256
signature: 39:1D:A1:0F:56:8A:BB:20:44:2B:B0:6B:6E:6D:89:DD:15:BC:A2:19:...

如果涉及到在多个系统里面操作,有可能会不经意间修改了文件的权限。

如果是使用git版本管理软件来管理的话,明明文件没有修改,也会因为文件权限而导致需要解决这些冲突,为什么呢,因为git把文件权限也算作文件差异的一部分。

如果权限的更改不纳入到版本可中,解决办法如下:

1
$ git config core.filemode false

这时候再更新代码就OK了。

处理权限

Unix系统对拥有者、组、其他几种用户都有明确的读写执行权限,这些在windows上没有对应的机制,这个问题在使用git时表现为没有修改文件却出现很多modified的文件,git status显示 typechange。一般出现在增加可执行权限的文件上。git对此也有一定的策略,可以设置core.filemode为false,这样就会忽略文件权限带来的改变。

1
$ git config --add core.filemode false

这样设置后就可以避免下面的问题出现

1
2
3
diff --git a/a.py b/a.py
old mode 100755
new mode 100644

如果clone前没有设置,导致已经进行了修改,可以用下面的命令来批量恢复这些修改。

1
2
$ git status | grep typechange | awk '{print $2}' | xargs git checkout

gitbook 转换为pdf文件

  1. 确保全局安装gitbook-cli:**npm install gitbook-cli -g**
  2. 安装**Calibre**
  3. 运行**gitbook pdf ./..path../BookFloder ./..path../xxx.pdf**
  4. 运行**gitbook epub ./..path../BookFloder ./..path../xxx.pdf**
  5. 运行**gitbook mobi ./..path../BookFloder ./..path../xxx.pdf**

使用node.js制作书籍

  1. 安装node.js
  2. npm install gitbook -g
  3. npm install gitbook-cli -g
  4. gitbook init
  5. 新建章节文件夹,在SUMMARY.md里建立映射关系
  6. 创建book.json,设置参数
  7. gitbook serve 会编译书籍并建立一个临时服务器,可以再浏览器浏览
  8. git来commit和push

InstallRequiredError: “ebook-convert” is not installed.

1
ln -s /Applications/calibre.app/Contents/MacOS/ebook-convert /usr/local/bin

起步

版本控制

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

大多数人使用的方法就是本地文件改名,然后加上时间,好处是比较简单,坏处就是一旦混淆所在的工作目录,或者一旦丢失弄错了文件就没有办法撤销了。

所以出现了下面的版本控制系统:

  • 本地版本控制系统:rcs,工作原理就是保存并管理文件补丁patch,根据每次的补丁,计算出各个版本的文件内容
  • 集中化的版本控制系统:CVS/SVN等,有一个单一的集中管理的服务器,保存所有文件的修订版本,协同工作的人们通过客户端连接到这台服务器,取出最新的文件或者提交更新
  • 分布式版本控制系统,Git/Mercurial等,客户端把代码仓库完整地镜像下来,每次都是对代码仓库的完整备份

Git 基础

直接记录快照,而非差异比较

Git和其他其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

近乎所有操作都是本地执行

在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。

时刻保持数据完整性

在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。

文件的三种状态

对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。

  • 已提交表示该文件已经被安全地保存在本地数据库中了;
  • 已修改表示修改了某个文件,但还没有提交保存;
  • 已暂存表示把已修改的文件放在下次提交时要保存的清单中。

由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

初次运行 Git 前的配置

一般在新的系统上,我们都需要先配置下自己的 Git 工作环境。配置工作只需一次,以后升级时还会沿用现在的配置。当然,如果需要,你随时可以用相同的命令修改已有的配置。

Git 提供了一个叫做 git config 的工具(译注:实际是 git-config 命令,只不过可以通过 git 加一个名字来呼叫此命令。),专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件。
  • 当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

用户信息

第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

1
2
$ git config --global user.name "Your name"
$ git config --global user.email youremail@example.com

如果用了 –global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 –global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

文本编辑器

接下来要设置的是默认使用的文本编辑器。Git 需要你输入一些额外消息的时候,会自动调用一个外部文本编辑器给你用。默认会使用操作系统指定的默认编辑器,一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置:

1
$ git config --global core.editor emacs

差异分析工具

还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

1
$ git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。当然,你也可以指定使用自己开发的工具,具体怎么做可以参阅第七章。

查看配置信息

要检查已有的配置信息,可以使用 git config –list 命令:

1
$ git config --list

Git 基础

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff

若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff –staged,效果是相同的,但更好记些。

跳过使用暂存区域

尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 –cached 选项即可:

1
$ git rm --cached readme.txt

移动文件

运行 git mv 就相当于运行了下面三条命令:

1
2
3
$ mv README.txt README
$ git rm README.txt
$ git add README

查看提交历史

在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看。

我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新。

在做代码审查,或者要快速浏览其他协作者提交的更新都作了哪些改动时,就可以用这个选项。此外,还有许多摘要选项可以用,比如 –stat,仅显示简要的增改行数统计。

每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计。还有个常用的 –pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。比如用 oneline 将每个提交放在一行显示,这在提交数很大时非常有用。另外还有 short,full 和 fuller 可以用,展示的信息或多或少有些不同。

但最有意思的是 format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:

1
$ git log --pretty=format:"%h - %an, %ar : %s"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明

用 oneline 或 format 时结合 –graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。

git log 支持的命令选项

选项 说明
-p 按补丁格式显示每个更新之间的差异。
–stat 显示每次更新的文件修改统计信息。
–shortstat 只显示 –stat 中最后的行数修改添加移除统计。
–name-only 仅在提交信息后显示已修改的文件清单。
–name-status 显示新增、修改、删除的文件清单。
–abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
–relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
–graph 显示 ASCII 图形表示的分支合并历史。
–pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

限制输出长度

除了定制输出格式的选项之外,git log 还有许多非常实用的限制输出长度的选项,也就是只输出部分提交信息。之前我们已经看到过 -2 了,它只显示最近的两条提交,实际上,这是 - 选项的写法,其中的 n 可以是任何自然数,表示仅显示最近的若干条提交。不过实践中我们是不太用这个选项的,Git 在输出所有提交时会自动调用分页程序(less),要看更早的更新只需翻到下页即可。

另外还有按照时间作限制的选项,比如 –since 和 –until。下面的命令列出所有最近两周内的提交:

1
$ git log --since=2.weeks

你可以给出各种时间格式,比如说具体的某一天(“2008-01-15”),或者是多久以前(“2 years 1 day 3 minutes ago”)。

还可以给出若干搜索条件,列出符合的提交。用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。(请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用 –all-match 选项。否则,满足任意一个条件的提交都会被匹配出来)

另一个真正实用的git log选项是路径(path),如果只关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。因为是放在最后位置上的选项,所以用两个短划线(–)隔开之前的选项和后面限定的路径名。

撤消操作

任何时候,你都有可能需要撤消刚才所做的某些操作。接下来,我们会介绍一些基本的撤消操作相关的命令。请注意,有些撤销操作是不可逆的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果。

修改最后一次提交

有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 –amend 选项重新提交:

1
$ git commit --amend

此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。

启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 –amend 提交:

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

取消已经暂存的文件

1
$ git reset HEAD <filename>

取消对文件的修改

1
$ git checkout -- <filename>

这个命令将丢弃所有的修改,特别危险,所有对文件的修改都没有了,所以只有百分比确定的时候,在使用该命令。

远程仓库的使用

查看当前的远程库

可以使用git remote命令来列出当前的远程库,或者git remove -v来显示对应的克隆地址。

推送数据到远程仓库

1
git push [remote-name] [branch-name]

查看远程仓库信息

1
$ git remote show origin

远程仓库的删除和重命名

1
$ git remote rename old new

碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,可以运行 git remote rm 命令:

1
$ git remote rm [remote-name]