..

git命令的使用

介绍

只记录一些有用,但是比较少使用到的 git 用例。一些 git 的日常使用不做记录。

用例

列出已删除文件的 commit 历史

IDE 虽然能方便的查看某个文件的 commit 历史,但是如果这个文件已经被删除,那这个功能就不方便使用了。

实际上,无论是现存文件,还是历史上曾经存在但是当前版本已经删除的文件,都是可以通过 git log 命令来列出相关 commit 的。参见,How to find a deleted file in the project commit history?

具体使用分为两步。第一步,先找出相关的所有 commit:

# 如果不记得被删除文件的具体路径、名字,可以用通配符 * 来进行搜索。
# 例如下面这个命令,其作用是列出所有路径下,文件名匹配 *-utils.* 
# 的文件的所有 commit 记录。
$ git log --all --full-history -- "**/*-utils.*"

# 如果准确的知道文件的路径,那也可以直接传一个准确的路径
$ git log --all --full-history -- package.json

找到所有相关 commit 之后,可以用 git show 命令查看 commit 具体做了什么事情。

# 可以直接 show 一个 commit hash,这样会展示这个 commit 的所有改动。
$ git show 754bf12da62e6b0d530e6d4603fae4b04a61b6ce

# 当然,我们关心的是目标文件的修改,那就可以加上路径过滤
$ git show 754bf12da62e6b0d530e6d4603fae4b04a61b6ce -- package.json
实践例子 – 搜索某一行是何时被删除的

某日发现一个文件有一行代码不知道何时被删除了。即便 PyCharm 有 Show History 可以查看此文件的相关 commit 历史(相当于上面的 git log),但是依然要逐个查看排查。如果改动太久了,查起来就很麻烦。

假设我要定位的文件名是 home.py,实践过程如下:


# 使用 --pretty 参数,只输出 commit 的 hash
$ git log --all --full-history --pretty=format:"%h" -100 -- home.py > hash.txt

# 再组合 git show 命令,把每个相关 commit 的相关改动,都输出到 changes.txt 文件里
$ cat hash.txt  | xargs -n 1 -I {} git show {} -- home.py > changes.txt

# 然后打开 changes.txt 进行搜索被删除行,很快即可定位到改动的 commit
$ vim changes.txt

如果上面的过程没有找到,修改下 commit 的数量,也就是第一步的那个 -100。它表示只输出 100 个 commit。然后重复 1~3 的过程。