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

2019-11-12 16:24:16 +08:00
 yuankui
[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,但是感觉这样太绕了,有没有简单的办法?
4037 次点击
所在节点    程序员
31 条回复
rimutuyuan
2019-11-12 16:31:43 +08:00
JavaFirstMaster
2019-11-12 16:45:44 +08:00
你可能需要一个 JetBrain 系列中的一个,比如 IDEA:

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

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

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

反正用 git,不在 GUI 里先确认下图形化的分支 log 的话,我是不敢乱 push 代码的
KentY
2019-11-12 17:04:43 +08:00
@lancerliu @atbility platform-dependent tool.
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
2019-11-12 17:16:14 +08:00
不好意思,这个问题还真是命令行吊打 GUI

git log --oneline $filepath | awk '{print $1}'
git show $commitId:$filepath
tonytonychopper
2019-11-12 17:16:40 +08:00
@KentY 并不想记住那么多的 git 命令,所以大部分情况下还是用 intellij
chendy
2019-11-12 17:46:55 +08:00
用过的最舒服的 cvs 客户端还真就是 idea…
而且社区版就有全功能
CrazyRain0001
2019-11-12 17:55:52 +08:00
tig $filepath
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
2019-11-12 18:02:42 +08:00
@leo108 大佬,请问怎么根据$commitId:$filepath 查到这个文件版本的 object-id 呢?

ps:

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/618854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX