如何在Git中查看单个文件的更改历史记录,以及更改内容的完整详细信息?
我已经做到了:
它向我展示了文件的提交历史记录,但是如何获取每个文件更改的内容?
我正试图从MS SourceSafe过渡到以前简单的right-click→show history。
- 上述链接不再有效。此链接今天有效:Git社区手册
- 上面的链接(由Chris发布)不再有效。这个链接今天有效:git-scm.com/book/en/v2
为此,我将使用:
或者在重命名之前跟踪文件名
1
| gitk --follow [filename] |
- 但是我甚至有一个工具,将上面的内容与"git责备"结合起来,允许我在文件随时间变化时浏览它的源代码…
- GitWeb就是答案。
- 不幸的是,这并不是按照文件的历史记录重命名的。
- 我还在查找以前重命名过的文件的历史记录,并首先找到了这个线程。解决方案是使用"git-log--follow",正如Phil在这里指出的。
- 作者正在寻找命令行工具。虽然Gitk附带Git,但它既不是命令行应用程序,也不是特别好的GUI。
- 漂亮的小费。在我的机器(Gitv1.7.10)中,我不得不使用gitk -- [filename]。
- 他在找命令行工具吗?"右键单击->显示历史记录"当然并不意味着它。
- 警告Windows用户…文件名路径区分大小写
- @danmolding:gitk --follow [filename]显示了文件过去重命名的历史。不过,它不会在重命名之前显示文件内容的更改。看看这个答案。
- 如果此文件被删除,并且您想查找删除者,则应使用git log -- [filename]。
- -1,如果这是Gitk,那么它不是Git?
- 除了git之外,不需要其他任何东西,这不应该是公认的答案。
- gitk不是基本git包的一部分。您需要下载tk包才能使用gitk。@沃尔卡的回答更好,git log -p filename没有任何依赖性。
- 问题是"使用git版本控制查看文件的更改历史"。这正是Gitk所做的。它查找Git提交历史记录中的更改。我不在乎它是否是基本Git包的一部分,只要它以快速和简单的方式完成工作。
- @亨利奎德索萨:因为提问者认为这个答案对他最有帮助。
- 吉特的工作很有魅力。它帮助我检查单个文件的历史记录,这正是我需要的。
- bash:gitk:找不到命令
- 接受的答案应该使用git,而不是gitk。
- 使用Gitgui有什么方法可以做到这一点吗?
- downvote由于使用了另一个工具,最好使用stackoverflow.com/a/278242/1700569中的标准CLI
- 接受的答案应该考虑到不是每个人都在他们的系统上安装了Gitk。如果我在一个只有cli的环境中,就没有可用的GUI。OP要求使用"git"命令。使用GitWeb、GitK或其他类似于"去GitHub查看历史记录"的工具。
- 在我看来,这个答案不应该是公认的。我个人使用的是Gitx,而不是Gitk,但我也不想得到特定于Gitx的答案。下面的git log -p答案更适用于大多数用户。
- 与公认的答案无关,+1有助于Gitk疯狂行动
- 获取命令没有找到任何线索吗?
- 什么是gitk?
- 这不管用。这是一个糟糕的论点。
- @Jimaho Git可视化工具
- 如果建议使用第三方实用程序,为什么这个答案会被认为是正确的?正确答案如下(@danmolding是作者)
你可以使用
让Git为每个日志条目生成补丁。
见
对于更多的选项-它实际上可以做很多好事情:)为了获得特定提交的差异,您可以
或任何其他标识符修订。或使用
以直观方式浏览更改。
- Git Show Head显示所有文件,您知道如何跟踪单个文件吗(就像Richard要求的那样)?
- 您可以使用:git show--filename,它将显示该版本的差异,以防存在差异。
- --stat也很有用。你可以和-p一起使用。
- 这太好了。当指定不再存在的路径时,Gitk的行为不好。我使用了git-log-p-path。
- 另外,Gitk看起来像是由布吉怪物建造的。这是一个很好的答案,最适合原始问题。
- 添加--follow也将考虑文件重命名。
- 在这个问题上有一个更好的答案,它使用了--follow标志。
- 我喜欢@ghayes'的答案:p和+1;我觉得一个好的终端可以比可视化工具更清楚地显示差异。
- git log--follow-p file_path should be accepted应答
- -p=Generate patch=show diff,commit description除外
git log --follow -p -- path-to-file
这将显示文件的整个历史记录(包括重命名之外的历史记录以及每次更改的差异)。
换言之,如果名为bar的文件曾经命名为foo,那么git log -p bar(没有--follow选项)将只显示文件的历史,直到它被重命名为止——它不会显示文件被称为foo时的历史。使用git log --follow -p bar将显示文件的整个历史记录,包括文件名为foo时对该文件所做的任何更改。-p选项确保每次更改都包含差异。
- 我觉得有点奇怪,但是你不能用-CC标记log --follow file,否则它什么也找不到(git 1.7.0.4)。
- --stat也很有用。你可以和-p一起使用。
- 我同意这是真正的答案。(1.)--follow确保看到文件重命名(2.)-p确保看到文件如何更改(3.)它只是命令行。
- 在你的file前面加一个--,这绝对是最好的答案!
- 真的。它对我有用。stackoverflow.com/a/1321962/3034747和stackoverflow.com/a/5493663/3034747不是。我不知道为什么……我使用的是Ubuntu和Git版本2.0.2
- "致命:不明确的参数‘我的文件名’:未知修订或路径不在工作树中。"
- @我注意到增加了--,但我不知道为什么这样做最好?它是做什么的?
- @Benjohn-the---期权告诉Git它已经到达期权的终点,任何跟随--期权的事情都应该作为一个论据。对于git log来说,只有当路径名以破折号开头时,这才有任何区别。如果你想知道一个有不幸名字的文件的历史,那么就用":git log --follow -p -- --follow"。
- @本约翰:通常,--是有用的,因为它还可以防止任何与您输入的文件名相匹配的revision名称,这实际上是很可怕的。例如:如果您有一个分支和一个名为foo的文件,那么git log -p foo将显示到foo的Git日志历史,而不是文件foo的历史。但是@danmolding是对的,因为--follow命令只使用一个文件名作为参数,所以这是不必要的,因为它不能是revision命令。我刚刚知道。也许你把它从你的回答中删去是对的,我不确定。
- 在"用-p生成补丁"一节之前,你必须先阅读Git日志文档的长页面,这真是太疯狂了。这个答案很好地解释了--follow,解释-p也很有用。
- 事实上,@johnlawrenceasden提出了一个很好的观点(在他的答案中),也包括--all来查看所有分支的文件历史。在某些情况下可能有用。
- 注意不要输入错误的文件名(我的文件名末尾忘了一个"s"),您将在git日志中看到一条消息,skipping...,后跟一系列tildes ~(可能每个commit/i dunno一个)。
- 如果这个命令不提供任何输出,会发生什么?
- 引发错误。fatal: unrecognized argument: --folow。但是命令git log -p 起作用了。
- @因为是--follow,有2个L…
如果您喜欢保持基于文本的,您可能需要使用TIG。
快速安装:
- apt-get:# apt-get install tig。
- 自制(OS X):$ brew install tig。
使用它在单个文件上查看历史记录:tig [filename]。或者浏览详细的回购历史:tig。
与gitk相似,但基于文本。支持终端中的颜色!
- 优秀的基于文本的工具,很好的答案。当我看到Gitk在我的无头服务器上安装的依赖项时,我吓坏了。会再次投票+++
- 您也可以使用tig查看特定的文件,即tig -- path/to/specific/file。
在这种情况下,git whatchanged -p filename也等同于git log -p filename。
您还可以看到文件中的特定代码行何时被git blame filename更改。这将为文件中的每一行打印出一个简短的提交ID、作者、时间戳和完整的代码行。当你发现了一个bug并且想知道它是什么时候引入的(或者是谁的错)之后,这是非常有用的。
- +1,但filename在命令git blame filename中不是可选的。
- "鼓励新用户使用Git日志。(…)该命令主要出于历史原因而保留;
sourcetree用户
如果您使用sourcetree来可视化您的存储库(它是免费的并且非常好),您可以右键单击一个文件并选择LogSelected。
显示器(以下)比Gitk和列出的大多数其他选项友好得多。不幸的是(此时)无法从命令行启动此视图-sourcetree的cli当前只打开repos。
- 我特别喜欢"跟随重命名的文件"选项,它允许您查看文件是否被重命名或移动。
- 但除非我弄错了(请告诉我!),在GUI中一次只能比较两个版本?有没有客户机有一个优雅的界面可以同时区分几个不同的版本?可能是在一个缩小视图像在崇高的文本?我认为那真的很有用。
- @Samlewalen如果我理解正确,你想比较三种不同的承诺吗?这听起来类似于三方合并(我的、你的、基础的),通常这种策略用于解决合并冲突,而不必比较三个任意的提交。有许多工具支持三向合并stackoverflow.com/questions/10998728/…,但诀窍在于为这些工具提供特定版本gitready.com/intermediate/2009/02/27/…
- 谢谢马克·福克斯,这就是我的意思。你知道有什么应用程序可以做到吗?
- 你救了我的命。您可以使用gitk找到SHA1散列,然后打开SourceTree根据找到的SHA1进入Log Selected..。
- 这是完美的。我在atlassian community.atlassian.com/t5/sourcetree questions/…上搜索了同样的解决方案。
- @如果已经有了文件名,那么您需要sha做什么?(无论如何,如果您确实需要sha,也可以使用sourcetree找到它。)
- @玛伦莱博·科瑟,我记不起当时我为什么需要沙。Ahaha。
要显示上次修改文件的每一行的修订和作者,请执行以下操作:
或者,如果您想使用强大的责备图形用户界面:
阅读并播放一点后,总结其他答案:
通常的命令行命令是
1
| git log --follow --all -p dir/file.c |
但您也可以使用Gitk(GUI)或Tig(文本用户界面)来提供更具人类可读性的查看方式。
1 2 3
| gitk --follow --all -p dir/file.c
tig --follow --all -p dir/file.c |
在debian/ubuntu下,这些可爱工具的安装命令如预期的那样:
1
| sudo apt-get install gitk tig |
我目前正在使用:
1
| alias gdf='gitk --follow --all -p' |
这样我就可以输入gdf dir来获得子目录dir中所有内容的集中历史。
- 我认为这是一个很好的答案。也许你得不到同样的投票,因为你回答了其他的方式(更好的imho),以看到变化,即通过Gitk和Tig除了Git。
- 只是为了补充答案。找到路径(在Git空间中,存储库中仍然存在的路径)。然后使用上面所述的命令"git log--follow--all-p"。可能会出现这样的情况:filde/文件夹会在历史记录中被删除,因此找到仍然存在的最大路径,并尝试获取其历史记录。作品!
- --all用于所有分支,其余的在@dan的答案中解释。
- 哦,伙计,经过这么长时间寻找好的解决方案来跟踪超越重命名的文件,最后,我在这里找到了它。魅力十足!谢谢!
将此别名添加到.gitconfig中:
1 2 3
| [alias]
lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
--abbrev-commit --date=relative |
使用如下命令:
1 2
| > git lg
> git lg -- filename |
输出看起来几乎与Gitk输出完全相同。享受。
- 在我跑完LG的捷径后,我说(并且我引用)"漂亮!"但是,请注意,"n"after"-graph"是一个错误。
- 也可以使用git lg -p filename—它返回搜索文件的漂亮差异。
最近我发现了tig,发现它非常有用。有些情况下,我希望它是A或B,但大多数时候它相当整洁。
对于您的情况,您可能需要的是tig 。
http://jonas.nitro.dk/tig/
为了这个目的我写了Git回放
1 2
| pip install git-playback
git playback [filename] |
这样既可以在命令行中显示结果(如git log -p),也可以使用箭头键(如gitk)逐步完成每个提交。
或:
gitx --
如果你用的是Gitx
- 出于某种原因,我的Gitx打开了空白。
- @igorganapolsky您必须确保自己在Git存储库的根目录下。
如果要查看文件的整个历史记录,包括所有其他分支,请使用:
如果您正在使用存储库菜单下的GitGUI(在Windows上),则可以使用"可视化主机历史记录"。突出显示顶部窗格中的提交和右下角的文件,您将在左下角看到该提交的差异。
- 这是如何回答这个问题的?
- 好吧,op没有指定命令行,从sourcesafe(这是一个图形用户界面)移到sourcesafe(这是一个图形用户界面)似乎是相关的,它指出您可以做与在Windows上的Git图形用户界面中的VSS中几乎相同的事情。
使用出色的Git扩展,您可以转到历史上文件仍然存在的位置(如果文件已被删除,否则直接转到head),切换到File tree选项卡,右键单击文件并选择File history。
默认情况下,它通过重命名跟踪文件,并且Blame选项卡允许查看给定修订版的名称。
它有一些小问题,比如在单击删除修订时在View选项卡中显示fatal: Not a valid object name,但我可以接受。-)
- 值得注意的是,这只是一个窗口。
- @Evanhahn不准确,通过Mono One也可以在Linux上使用GitExtension,我们在Ubuntu上使用它,非常高兴。请参阅git扩展文档。readthedocs.org/en/latest/&hellip;
SmartGit:
在菜单中,启用以显示未更改的文件:查看/显示未更改的文件
右键单击文件并选择"日志"或按"ctrl-l"
您还可以尝试这样做,列出已更改文件特定部分的提交(在Git 1.8.4中实现)。
返回的结果将是修改此特定部分的提交列表。命令:
1
| git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename> |
其中upperlimit是文件的起始行号,lowerlimit是文件的结束行号。
更多详细信息,请访问https://www.techpurohit.com/list-some-utility-git-commands
我要寻找的答案不在这个线程中,而是查看我为提交而准备的文件中的更改。即
- 如果您想包括本地(未老化)更改,我经常运行git diff origin/master来显示本地分支和主分支之间的完全差异(可以通过git fetch从远程更新)。
- -1,这是一个差异,而不是一个变化历史。
如果您使用TortoisGit,您应该能够右键单击该文件并执行TortoiseGit --> Show Log。在弹出的窗口中,确保:
未选中"EDOCX1"〔1〕选项。
选中"EDOCX1"〔2〕选项。
- TortoisGit(以及EclipseGit)不知何故错过了所选文件的修订,不要指望它!
- @诺玛诺斯,我还没有遇到这个问题,所以我不能核实你的说法是否正确。
- 我的错误是,它只在Eclipse中发生,但在TortoisGit中,如果取消选中"显示所有项目"+选中"所有分支"(如果文件是在另一个分支上提交的,则在合并到主分支之前),则可以看到文件的所有修订。我会更新你的答案。
git diff -U 给你一个统一的区别。
它应该是红色和绿色的。如果不是,先运行:git config color.ui auto。
如果您将Eclipse与Git插件一起使用,那么它具有极好的历史对比视图。右键单击文件并选择"Compare with"=>"History"
- 但是,这不允许您查找已删除的文件。
- 比较文件的两个版本不同于查看文件的更改历史记录