V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuankui
V2EX  ›  程序员

[git]如何查看一个文件的历史

  •  
  •   yuankui · 2019-11-12 16:24:16 +08:00 · 4014 次点击
    这是一个创建于 1844 天前的主题,其中的信息可能已经有所发展或是发生改变。
    [git]如何查看一个文件的历史,通过 git 命令行

    第一步,获取该文件的对应所有的 object 的 version
    $cmd $filepath =>

    920bd276459c16b99387a0112ab9c9c5604531b9
    920bd276459c16b99387a0112ab9c9c5604531b9
    920bd276459c16b99387a0112ab9c9c5604531b9

    第二部,根据该 object 的 version,查看该文件内容
    git cat-file -p 920bd276459c16b99387a0112ab9c9c5604531b9

    目前第二部没有问题,至于第一步,如果获取该文件所有历史的版本号呢?

    ===========
    有个笨办法,可以通过 git log -- $filename
    获取所有的 commit_id

    然后根据 commit,获取 tree,然后逐级获取对应路径的 file

    最后得到$filename 的 object-id,但是感觉这样太绕了,有没有简单的办法?
    第 1 条附言  ·  2019-11-12 17:58:20 +08:00
    因为这个操作需要自动化,所以 gui 暂时不考虑。
    31 条回复    2019-11-13 18:46:03 +08:00
    JavaFirstMaster
        2
    JavaFirstMaster  
       2019-11-12 16:45:44 +08:00
    你可能需要一个 JetBrain 系列中的一个,比如 IDEA:

    ![image.png]( https://i.loli.net/2019/11/12/XiRNWZJ2HjAsnPU.png)
    atbility
        3
    atbility  
       2019-11-12 16:50:30 +08:00
    推荐 source tree
    JavaFirstMaster
        4
    JavaFirstMaster  
       2019-11-12 16:53:03 +08:00
    KentY
        5
    KentY  
       2019-11-12 16:58:04 +08:00   ❤️ 4
    如果你强调的命令行, 那么试试这个:
    git log --follow -p -- /path/to/file

    其实看单一文件 history, 图形界面交互起来方便点, 但是也用不着为这个装个什么 intellij/ vscode ..etc.,
    gitk 就胜任了:
    gitk /path/to/file

    具体要求你可以看 gitk 文档, 加入更多选项,比如--full-history, --follow and so on.
    lancerliu
        6
    lancerliu  
       2019-11-12 16:58:46 +08:00
    同意 source tree
    hakono
        7
    hakono  
       2019-11-12 17:03:37 +08:00 via iPhone
    这需求你需要的是 GUI 而不是命令行,或者有 ide 的话装个插件就行

    反正用 git,不在 GUI 里先确认下图形化的分支 log 的话,我是不敢乱 push 代码的
    KentY
        8
    KentY  
       2019-11-12 17:04:43 +08:00
    @lancerliu @atbility platform-dependent tool.
    KentY
        9
    KentY  
       2019-11-12 17:12:18 +08:00
    @hakono
    这个是跟个人习惯有关的. 我平时也用 intellij, 但是几乎不用 intellij 的 git 插件, 个别情况的手动 merge, 特别是跟同事 pair 的时候, 会打开, 极少. 都是同事口述该点哪, 我来操作. 我自己都是 vimdiff merge, 可能是习惯了.
    gitconfig 里按自己的习惯有很多 alias 跟自己设好的 functions, 比如你说图形化分支, 我这里 git gl 就 ok 了.
    不用 intellij 不是因为他不好用, 是因为我不知道我点了什么后面他都做了什么. 我用命令行, 任何操作都是我自己输入的, 我知道会发生什么. 所有的提交, merge, rebase ... 都在命令行里比 intellij 放心. 而且搭配命令行那么多其它丰富的命令, 想截取那段就截那段
    leo108
        10
    leo108  
       2019-11-12 17:16:14 +08:00   ❤️ 1
    不好意思,这个问题还真是命令行吊打 GUI

    git log --oneline $filepath | awk '{print $1}'
    git show $commitId:$filepath
    tonytonychopper
        11
    tonytonychopper  
       2019-11-12 17:16:40 +08:00
    @KentY 并不想记住那么多的 git 命令,所以大部分情况下还是用 intellij
    chendy
        12
    chendy  
       2019-11-12 17:46:55 +08:00
    用过的最舒服的 cvs 客户端还真就是 idea…
    而且社区版就有全功能
    CrazyRain0001
        13
    CrazyRain0001  
       2019-11-12 17:55:52 +08:00
    tig $filepath
    passerbytiny
        14
    passerbytiny  
       2019-11-12 17:59:20 +08:00
    V2EX 是论坛 /社区,不是个人博客,block 送上——如果我没多看一眼,就是这个回复。楼主需要好好组织一下发言顺序,上来直接无标记复制粘贴一段,最后才提问题,玩人呢。

    GIT 一定要混用命令行和 GUI,单用哪个都很傻,你这个功能,我从来都是用 GUI 界面。这个功能是个 IDE 都会提供,如果不用 IDE 的话,VS Code 有扩展,https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory
    yuankui
        15
    yuankui  
    OP
       2019-11-12 18:02:42 +08:00
    @leo108 大佬,请问怎么根据$commitId:$filepath 查到这个文件版本的 object-id 呢?

    ps:

    回头我再好好研究下 git 底层。。
    yuankui
        16
    yuankui  
    OP
       2019-11-12 18:03:50 +08:00
    @passerbytiny 大佬息怒
    leo108
        17
    leo108  
       2019-11-12 18:30:11 +08:00
    @yuankui #15 git show $commitId:$filepath | git hash-object --stdin
    hakono
        18
    hakono  
       2019-11-12 18:44:04 +08:00 via iPhone
    @KentY 问题是我也不用 jetbrains 的 git 功能啊。。。 他家的 git 在解决代码合并冲突的时候倒是很好用。。。

    而且说真的用 gui 哪里禁止你用命令行了。。。我说的也是 不确认下图形化的 log 和分支树我不敢随便乱 push 代码。你说看 log,就凭 git log 那简陋的一堆文字,连个分支树都没有反正我是敬谢不敏的。没个图形的分支树有时候你连乱七八糟的分支发生了什么都搞不清楚
    spadger
        19
    spadger  
       2019-11-12 19:13:13 +08:00
    svn 直接在那个文件上 show log 就行了。
    janus77
        20
    janus77  
       2019-11-12 19:16:46 +08:00 via iPhone
    还是 idea gui 插件舒服,直接右键 git-show history 就完了
    momocraft
        21
    momocraft  
       2019-11-12 19:19:00 +08:00
    `git log -p -M --follow --stat -- FILES`

    git log 也可以画图的, 只要你会
    KentY
        22
    KentY  
       2019-11-12 20:46:56 +08:00
    @hakono 你在 git log 的时候加上 --graph 就有你说的的树了.
    Rwing
        23
    Rwing  
       2019-11-12 21:12:41 +08:00
    gitkranken 非常棒
    Solace202
        24
    Solace202  
       2019-11-12 21:22:07 +08:00 via iPhone
    没人用 git-tortoise?一直在用这个
    sadhen
        25
    sadhen  
       2019-11-12 21:26:11 +08:00
    tig
    cccy0
        26
    cccy0  
       2019-11-12 21:36:25 +08:00
    jb
    大法好
    guanhui07
        27
    guanhui07  
       2019-11-13 09:09:09 +08:00
    tig
    FaceBug
        28
    FaceBug  
       2019-11-13 12:02:22 +08:00
    附议 source tree
    hakono
        29
    hakono  
       2019-11-13 13:15:52 +08:00 via iPhone
    @KentY 所以你这是抬杠还是什么?我说的一直都是 git log 好不好看懂。
    就 git log --graph 那用纯字符画出的东西我是没看出哪里方便阅读了,还不如 git 自带的大老粗的 gitk 来的好懂
    KentY
        30
    KentY  
       2019-11-13 16:03:10 +08:00 via iPhone
    @hakono 对不起
    hakono
        31
    hakono  
       2019-11-13 18:46:03 +08:00 via iPhone
    @KentY。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2640 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:37 · PVG 23:37 · LAX 07:37 · JFK 10:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.