- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道Git本身或文本编辑器中是否有一种方法可以将Git历史记录直接显示为文件树中的常规文件。
就像我的文件landing.html
具有几次以前的提交一样,我想将完整的landind.html.old.v0
,landind.html.old.v1
,landind.html.old.v2
等历史记录文件直接放在当前文件旁边。在文件名中也可能包含提交消息。就像landind.html.old.v0.initial-commit
。
可以通过在提交后添加一个钩子在Git本身中完成此操作吗?或者,也许作为文本编辑器的扩展?我主要使用VSCode
和Sublime
。我想避免使用其他工具,例如gitk
。
最佳答案
Git没有内置任何功能,因此您必须编写代码。
在运行git clone
之后立即尝试对任何特定文件执行此操作存在一个巨大问题,但是您添加了以下注释:
总的历史会更好,但是我只能和我一个分支来解决。我希望能够在不与Git交互的情况下查找总历史记录。
在这种情况下,有一条明显的前进之路。我将为您概述一个想法,但是您将不得不编写代码。如果您对Git有很多了解,请跳至有关使用提交后挂钩的底部。如果没有,请先通读其余部分。通过编写提交后的钩子,您将学到很多有关Git的知识,但是您可能还需要其他部分。
首先,请记住什么是未跟踪的文件
如果您完全要使用Git,则Git会迫使您了解其三个部分:
工作树。这很简单:在这里工作。工作树中的文件以通常的形式存储,您可以在其中查看和使用它们。
索引,还有另外两个名称,因为它在Git中是如此重要:它也称为暂存区,有时也称为缓存。索引中的文件采用特殊的仅Git格式。这里的关键是您可以替换索引中的文件,因此它们是可写的。
提交。提交是永久的,只读的且不会损坏的。1Git中的提交是历史记录:没有“文件历史记录”之类的东西;每个提交都是一个完整的快照,其内容独立于其他所有快照。 Git通过保存(提交)索引的内容来制作新的快照。
未跟踪的文件是不在索引中的文件。这是Git简单明了的罕见情况。 :-)如果您在工作树中有一个不在索引中的文件,则该文件不会被跟踪。您所有的landing.html.suffix
文件都将被取消跟踪。
1提交的持久性取决于其可达性。如以下有关提交的部分所述,Git通过从分支名称(或其他任何标识提交的名称)开始查找提交。这些提交通过其哈希ID标识其父代,因此可以从分支提示中访问父代。父母会确定更多的父母,因此这些父母也是可以达到的。 Git很少会(因为花费很长时间)在可到达的提交集(实际上是可到达的对象)上计算传递性闭包,并将其与对象数据库的整个内容进行比较。此时,根据其他条件,无法到达的对象可能会被垃圾回收(丢弃)。
廉洁性取决于它们是只读和散列的事实。如果对象内部发生某种改变,它将停止匹配其(加密的)哈希ID,Git将知道它已损坏。
关于提交的一些注意事项
(这些都不是直接相关的,但是牢记所有这些都是有用的。)
像所有Git内部对象一样,提交由其哈希ID进行标识(命名)。对象的哈希ID(包括每次提交)是其内容的加密校验和。每次提交的实际内容很小,因为存储的快照是通过称为树的单独Git对象完成的:Git将索引变成一棵树,然后保存树的哈希ID以及提交的元数据(您的姓名和电子邮件地址) ,一些时间戳,您的日志消息以及该提交的父哈希ID)作为提交对象。
存在分支,因此存在存储库中的历史记录,因为提交会存储父ID。像master
这样的分支名称仅包含一(1)个提交哈希ID。 Git将此称为尖端提交,根据定义,它是分支上的最后一个提交,即最新的提交。要查找历史记录,Git会查看提示提交的父提交,这是倒数第二个。然后,Git查看父母的父母,即倒数第二位。等等。因此,最终的提交链就是通过分支名称找到的分支,该分支仅标识最尖端的提交:
D--E <-- master
/
A--B--C
\
F--G <-- develop
A
到
E
都在分支
master
上,提交
A
到
C
加
F
和
G
都在分支
develop
上。请注意,某些提交位于多个分支上。存储在存储库中的历史记录只是存储在存储库中的所有提交的总和。请注意,这里的名称
master
和
develop
分别仅标识一个提交。
... G--H--I--J <-- develop
G-H
对,
H-I
对和
I-J
对进行了有用的比较。但这是其中的一部分:
D--E
/ \
A--B--C M <-- master
\ /
F--G--H--I--J <-- develop
M
是
master
上的合并提交,此时有人将
develop
合并到
master
中。提交
M
有两个父母,而不仅仅是一个父母:您会将
M
与
E
还是与
G
进行比较?同时,分支在
C
处分叉,因此
C
到现在为止;我们可以随时添加更多!-两个孩子。您将
C
与
D
进行比较,还是将
C
与
F
进行比较?这些是真正棘手的部分,您可以通过“仅设置我的一个分支”来避免。
git add
。这实际上是将更新的文件从工作树复制到索引中,从而替换未编辑的索引文件。
git commit
。这将收集您的提交日志消息,然后创建实际的提交对象。
git write-tree
,如果您要手动执行所有操作,则可以运行该命令)。一旦Git具有树对象,它就可以写出提交的文本:
tree <hash>
parent <hash>
author <name> <email> <timestamp>
committer <name> <email> <timestamp>
<log message>
git hash-object -w -t commit
手动完成此部分)。通过计算文本的加密校验和,创建对象会创建对象的哈希ID。只要此提交与其他所有提交都不同(并且时间戳加上其余内容即可确保它确实存在),因为时间总是在增加2,它将获得一个新的,不同于其他所有提交的哈希ID。请注意,
parent <hash>
行使用当前提交的哈希ID,即您在步骤1中检出的哈希ID。
git commit
运行后提交挂钩。
A--B--C <-- master (HEAD)
master
指向提交
C
。您
git checkout master
,进行一些更改,
git add
和
git commit
,然后创建新的提交
D
。新的提交指向
C
作为其父级:
A--B--C <-- master (HEAD)
\
D
master
正确地上下滑动,使其指向新的提交
D
:
A--B--C
\
D <-- master (HEAD)
git commit --amend
,这将使新提交将当前提交的父级作为其父级。也就是说,除了让
D
指向
C
之外,我们还可以让
D
指向
B
:
A--B--C
\
D <-- master (HEAD)
D -> B -> A
,跳过
C
(已变得不可访问,最终将被垃圾回收)。换句话说,我们实际上并没有更改历史记录-
C
仍在其中,它不再存在于我们的历史记录链接中-但看起来我们已经拥有了。如果要使用
git commit --amend
,请稍后在Git挂钩中记住这一点。
git rebase
具有类似的效果,但效果更为剧烈:它将多个提交复制到新提交中,而放弃了原始文件。)
git filter-branch
)设法进行与现有提交一点一点相同的新提交,则该提交具有相同的作者和提交者,相同的时间戳记,相同的父代,相同的源快照和相同的日志消息,那么您将重复使用旧提交的哈希ID。但是那又怎样呢?您刚刚进行了与旧提交完全相同的新提交。它具有相同的作者,相同的时间,相同的历史记录和相同的日志消息。这是旧的提交。
git checkout branch-name
步骤-对索引和工作树有重要影响。请注意,当Git在上面进行新提交时,它首先使用
git write-tree
写出索引以创建树对象。这意味着索引必须从当前提交开始匹配。3
git checkout
命令通过将当前(检出前)提交与目标(检出后)提交进行比较来实现此目的。当前提交具有一组文件,而目标提交具有另一组文件,大概至少有些不同。签出将从当前索引和工作树中删除那些必须删除的文件。它将必须添加的任何文件添加到当前索引和工作树中。它将在索引和工作树中替换必须换出的所有文件,以从旧提交转到新提交。
git checkout
之后,索引和工作树将与目标提交(刚成为当前提交)匹配(除了完全不在索引中的未跟踪文件)。
git commit
时,这将使用当前索引进行新的提交。结果是,一旦完成新的提交,当前的提交和索引将再次匹配。因此,我们得到了有关Git的基本信息(尽管稍有灵活性,请参见脚注3):索引通常与当前提交匹配,直到您开始从工作树复制文件为止。
git add
成功完成后立即运行您的提交后钩子。此
git commit
进行了新的提交,例如在我们将三提交存储库转换为四提交存储库的示例中的提交
git commit
。
D
。现在您有机会比较父母与孩子:
git diff --name-status HEAD^ HEAD
C
是当前的,即child,commit,而
HEAD
表示查看
HEAD^
的第一个父级。请记住这里有多个父级的合并提交:您可以使用
HEAD
来查找例如,在合并的第二个父节点上。我不确定,当
HEAD^2
进行合并提交时,
git merge
是否运行后提交钩子,尽管我怀疑是这样。)
git merge
的输出告诉您打印的每个文件发生了什么;有关详细信息,请参见
the git diff --name-status
documentation。4
git diff
)已更改(状态
landing.html
),或者已创建新文件(状态
M
),则可以在下一个版本号下复制该文件,并使用提交日志消息主题(
A
)。如果文件没有更改,您将无输出-
git log -1 --pretty=format:%s HEAD
什么也没说,因为无话可说-因此您就不会复制。
git diff
根本没有附加到分支名称上) )。请注意,您可以使用
HEAD
或
git rev-parse --abbrev-ref HEAD
来获取分支名称。5
git symbolic-ref --short HEAD
,它更容易预测。例如,它不遵循每个用户的配置控件,因此每个人的行为都相同。
git diff-tree
将查看您的
git diff
设置,您的
diff.renames
等,以及diff-output着色选项,所有这些都可能与脚本混淆。
diff.renameLimit
将失败(退出非零值),并且不产生标准输出(但默认情况下将写入stderr)。在这种情况下,
git symbolic-ref
只会打印
git rev-parse
。
关于git - Git历史记录作为常规文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142384/
今天我在一个 Java 应用程序中看到了几种不同的加载文件的方法。 文件:/ 文件:// 文件:/// 这三个 URL 开头有什么区别?使用它们的首选方式是什么? 非常感谢 斯特凡 最佳答案 file
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我有一个 javascript 文件,并且在该方法中有一个“测试”方法,我喜欢调用 C# 函数。 c# 函数与 javascript 文件不在同一文件中。 它位于 .cs 文件中。那么我该如何管理 j
需要检查我使用的文件/目录的权限 //filePath = path of file/directory access denied by user ( in windows ) File fil
我在一个目录中有很多 java 文件,我想在我的 Intellij 项目中使用它。但是我不想每次开始一个新项目时都将 java 文件复制到我的项目中。 我知道我可以在 Visual Studio 和
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有 3 个组件的 Twig 文件: 文件 1: {# content-here #} 文件 2: {{ title-here }} {# content-here #}
我得到了 mod_ldap.c 和 mod_authnz_ldap.c 文件。我需要使用 Linux 命令的 mod_ldap.so 和 mod_authnz_ldap.so 文件。 最佳答案 从 c
我想使用PIE在我的项目中使用 IE7。 但是我不明白的是,我只能在网络服务器上使用 .htc 文件吗? 我可以在没有网络服务器的情况下通过浏览器加载的本地页面中使用它吗? 我在 PIE 的文档中看到
我在 CI 管道中考虑这一点,我应该首先构建和测试我的应用程序,结果应该是一个 docker 镜像。 我想知道使用构建环境在构建服务器上构建然后运行测试是否更常见。也许为此使用构建脚本。最后只需将 j
using namespace std; struct WebSites { string siteName; int rank; string getSiteName() {
我是 Linux 新手,目前正在尝试使用 ginkgo USB-CAN 接口(interface) 的 API 编程功能。为了使用 C++ 对 API 进行编程,他们提供了库文件,其中包含三个带有 .
我刚学C语言,在实现一个程序时遇到了问题将 test.txt 文件作为程序的输入。 test.txt 文件的内容是: 1 30 30 40 50 60 2 40 30 50 60 60 3 30 20
如何连接两个tcpdump文件,使一个流量在文件中出现一个接一个?具体来说,我想“乘以”一个 tcpdump 文件,这样所有的 session 将一个接一个地按顺序重复几次。 最佳答案 mergeca
我有一个名为 input.MP4 的文件,它已损坏。它来自闭路电视摄像机。我什么都试过了,ffmpeg , VLC 转换,没有运气。但是,我使用了 mediainfo和 exiftool并提取以下信息
我想做什么? 我想提取 ISO 文件并编辑其中的文件,然后将其重新打包回 ISO 文件。 (正如你已经读过的) 我为什么要这样做? 我想开始修改 PSP ISO,为此我必须使用游戏资源、 Assets
给定一个 gzip 文件 Z,如果我将其解压缩为 Z',有什么办法可以重新压缩它以恢复完全相同的 gzip 文件 Z?在粗略阅读了 DEFLATE 格式后,我猜不会,因为任何给定的文件都可能在 DEF
我必须从数据库向我的邮件 ID 发送一封带有附件的邮件。 EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Adventure Works Admin
我有一个大的 M4B 文件和一个 CUE 文件。我想将其拆分为多个 M4B 文件,或将其拆分为多个 MP3 文件(以前首选)。 我想在命令行中执行此操作(OS X,但如果需要可以使用 Linux),而
快速提问。我有一个没有实现文件的类的项目。 然后在 AppDelegate 我有: #import "AppDelegate.h" #import "SomeClass.h" @interface A
我是一名优秀的程序员,十分优秀!