git - 如何显示相对于当前分支创建的更改文件列表

git - how to show list of changed files relative to creation of current branch

我需要能够查看自创建当前分支以来以任何方式修改的文件列表,无论是已提交、暂存还是刚刚在树中更改。

我的场景是(按时间顺序)

1.  clone branch master from remote master
2.  make various changes,  adds and commits in my local master
3.  git branch myisolatedbranch
4.  git checkout myisolatedbranch
5.  make various changes,  adds and commits in myisolatedbranch
6.  git push --all  
             (creates myisolated branch in remote) 
             (don't know if this step 6 is relevant)
7.  make various changes,  adds and commits in myisolatedbranch
  1. 现在 - 我想查看一个简单的文件列表,这些文件与时间 4 时的工作树相比现在在工作树中有所不同。即我在 myisolatedbranch 中更改了什么(不仅提交而且任何更改)

Plain git status 告诉我所有与时间 1 不同的文件列表,即 myisoatedbranch 和 master 的整体不同之处,其中还包括我在时间 2 更改的所有内容,这是一个很多我不想看的文件。

根据 git status 的手册页,有一个可选的位置参数

[<pathspec>…​]

这可能会帮助我 - 但令人沮丧的是,手册页没有说明此参数的效果。 (所以我的第二个问题是,这个参数在这种情况下到底做了什么?)

或者我应该尝试 git 日志?但我认为报告只提交。

使用 git diff --name-only master 显示文件列表(或者您可以使用 --stat 标志来显示每个文件的更多统计信息)。 这将显示当前工作树与您离开的最后一个位置 master 之间的所有差异文件(在您的示例中似乎是 4)。 查看更多 here.

关于 git status 中的 pathspec - 它只是过滤输出以仅显示特定目录中的文件。

在 Git 中,分支——或者更准确地说,分支 names——几乎什么都不是。 Git 对他们的创造一无所知,或者除了一些例外,他们的历史。它们要么现在存在,在这种情况下它们指向一个(一个,单个)提交,要么它们现在不存在,仅此而已。1

另一方面,提交是永远的(有一些例外,否则你永远无法进行临时提交,并且 Git 进行 lot 临时提交) .提交的问题,只要它们 可达 就是永久性的——这个概念需要大量定义,所以我暂时忽略 2——就是他们的名字极其不友好。例如,考虑提交 7446b8fa5ead8ce0990e8f2be3a2490eac8e199f.

什么叫 gitty 7446b8fa5ead8ce0990e8f2be3a2490eac8e199f?

好吧,您实际上可以 Google 它:它是 Git 版本 2.9.0,在 Git 本身的 Git 存储库中。但是 "v2.9.0" 是一个 更友好的名称。而且,v2.9.0 是 Git 存储库中 Git 的一个 标签 ,那个标签是(你和我都记得)那么丑7446bqhatevwr.

如果你想记住一个特定的提交——你在这里想要的,因为你想将当前版本与 "that particular commit I was trying to remember, whatever its big ugly SHA-1 hash was" 进行比较——那么标签就是你想要什么。给那个提交一个标签,然后你可以把那个标签名称给 Git 每当你想说 "tell me about that commit I had you remember".


1奇怪的是——一个分支名称仅仅指向一个分支尖端提交——它实际上非常有用. Git 的工作方式是,当你在一个分支上并进行 new 提交时,Git 使新提交具有先前的分支提示作为其parent 提交,然后使分支 name 指向新的提交。

因此,通过大量的努力(Git 自动化),可以从任何分支尖端提交开始,并构建 之前的每个提交的图表 提交。请注意,这会告诉您有关所有这些提交本身的所有信息 除了 他们的名字 ,回到这些提交时。根据定义,分支名称总是在变化。这就是为什么我们有标签名称,Git 永远不会改变自己。如果你保留它们,它们将为提交提供合理的名称(无论如何 "sensible" 的某些值,完全取决于你自己想出好名字的能力)。

2可达性 的概念最终归结为使用分支和标记名称之类的东西作为提交的入口图形。一旦你有了一个对象的丑陋的大散列来开始在这个图中,你就可以使用你现在已知的提交来获取父提交 ID,以便找到更多的提交。然后,您使用这些提交 ID 来查找更多父 ID,直到找到图中的每个提交。 (在此过程中,您使用这些来查找 tree 对象,并使用树来查找 blob 对象。还有 tag objects for annotated tags. 一个 annotated tag 只是一个指向这样一个对象的标签名称。标签对象指向被标记的提交,而不是有标签指向直接指向提交。使用轻量级标签,标签名称直接指向提交。)

实际上存储在 Git 的对象数据库中(在包含存储库的 .git 目录中)的任何对象(提交、标签、树或 blob),但不是通过上述方法可达,通过git gc被标记为垃圾收集。因此,您可以随时进行临时提交——有一些额外的保证,例如 "objects linger for 14 days" 和 "most names have reflogs" 等等,这将使它们至少在一个月内可以访问,或者暂时保护它们免受Grim Reaper——然后,如果你最终决定喜欢它们,给它们起外部名称,例如 branch and/or 标签名称。如果你决定讨厌它们,你只需放弃它们,最终 git gc 会收割它们并让你的磁盘 space 回来。