今天追了个几年前留下来的坑, 在 git 里追溯修改过程坑死个爹, 具体方法估计没多久又会忘, 还是记下来以后有的参考
大部分教程都会告诉大家使用 git log
来查看对应文件的修改记录, 就像这样
git log ./foo/bar.py
但是这样默认是只显示提交信息摘要, 你也不知道具体哪里改了, 所以需要加上 -p
参数来显示具体修改内容. 如果这个文件改动频繁, 那么可能只想看最近几次的修改, 再加上一个 -[Num]
的参数来显示最近几次. 要想指定从某个版本往前, 直接指定版本号
git log -p ./foo/bar.py git log -p -2 ./foo/bar.py git log -p -2 74f6c40c ./foo/bar.py
但是如果是追一个不知道什么时候埋下的坑, 可能更需要知道某一行到底是啥时候改的, 这时候应该用 git blame
来看每一行的最后提交是哪一个, 像这样
git blame ./foo/bar.py
执行后进入像 less
一样的操作环境, 类 VIM 的翻页操作, 也可以用 /
或 ?
来查找, 不过这么看还是有点乱, 整个文件都标出来了, 如果我们只是想知道确定的某几行的历史呢? 祭出 -L n,m
参数
git blame -L 5,10 ./foo/bar.py git blame -L 5,+5 ./foo/bar.py
这样可以定位到某一行最后一次修改是哪个提交, 如果还要想继续往前找? 那么找到上一次修改的提交, 看在上次提交里的行数, 以上一次修改的提交号, 加上上一次修改对应的行数去继续往前
> git blame -L 8,+1 ./foo/bar.py 74f6c40c (Wen YE 2015-06-17 12:17:55 +0800 8) import StringIO > git blame 74f6c40c ./foo/bar.py 74f6c40c (Wen YE 2015-06-17 12:17:55 +0800 1) # coding: utf8 74f6c40c (Wen YE 2015-06-17 12:17:55 +0800 2) 74f6c40c (Wen YE 2015-06-17 12:17:55 +0800 3) from bson import ObjectId 8b569399 (Wen YE 2015-06-17 12:17:32 +0800 4) import collections be417d12 (Wen YE 2012-09-25 15:03:00 +0800 5) from datetime import datetime, timedelta 299e78b7 (Wen YE 2013-08-26 20:11:59 +0800 6) import json 74f6c40c (Wen YE 2015-06-17 12:17:55 +0800 7) import logging 8b569399 (Wen YE 2015-06-17 12:17:32 +0800 8) import os 74f6c40c (Wen YE 2015-06-17 12:17:55 +0800 9) import StringIO # 到头了, 那就是这个提交引入的, 看看改了什么 > git log -p -1 74f6c40c ./foo/bar.py
当然, 期间配合 Source Tree 之类的图形化工具来对比提交的 diff 比用 git log
这样的命令行查看更方便, git blame
也只是看某行的最后修改, 并不能很直观的看出来那一次提交到底修改了什么, 而且没有代码高亮和对比
我用的 git blame
定位到上一次提交, 在 Source Tree 里去看那个提交的具体修改内容, 如果还要往前追溯, 按 Source Tree 里看到的上一次提交里的行号, 带版本号继续 git blame
, 再到 Source Tree 里看对应版本的修改, 直到尽头