显示本地和远程之间的不同文件

时间:2020-02-20 00:54:40

标签: git github

我有一个本地文件夹,该文件夹链接到远程git存储库。

有时候,我们有instructions检查本地和远程之间的差异。

但是它们之间的差异可能很大而且很长。有时候,我只想查看哪些文件是不同的/添加/删除的,而无需赘述。

有人知道我如何快速获取该信息?

编辑1:

此外,我只是意识到自己最终需要git add个新的本地文件,并在git commitgit fetch之前在本地创建一个新的git diff。我对么?

2 个答案:

答案 0 :(得分:2)

您肯定需要获取远程存储库才能执行此操作。无法避免这种情况。完成此操作后,您可以进行比较。有两种方法可以做到这一点。

一种方法是进行git diff --stat master origin/master并查看统计信息输出:

$ git diff --stat master origin/master
 Documentation/RelNotes/2.26.0.txt | 44 +++++++++++++++-----------------------------
 1 file changed, 15 insertions(+), 29 deletions(-)

您也只能使用git diff --name-only查看文件名。如果要具体查看已添加或删除了哪些文件,可以使用--diff-filter选项仅列出以给定方式更改的文件。

最后,如果您想要更多类似git status -s的输出,可以使用git diff --name-status

答案 1 :(得分:1)

您的问题提到了文件夹文件。 Git不会存储文件夹,也不会真正处理文件,无论如何也无法与另一台计算机上的另一个Git进行对话。 Git可以与 commits 一起使用。当您的Git调用其他机器上的其他Git时,您的Git将从该Git中获取他们拥有的,您没有的,应该拥有的所有提交。这是一个git fetch操作。 (或者,您的Git向给予 Git您所拥有的,他们没有的,希望他们拥有的任何提交:这是一个git push操作。但这听起来像一个您关心的是“从他们那里获取”,即获取。)

因此,让您的Git调用他们的Git并从他们那里获取提交之后,您的工作就是比较这些提交。每个提交都包含文件。它仅具有文件,而没有文件夹,但是文件中的文件名通常会迫使您的操作系统创建文件夹。例如,名为dir/sub/file.ext的文件可能需要您的操作系统首先创建文件夹dir,然后在dir中创建文件夹sub。 (这是您的操作系统的问题,而不是Git的问题:就Git而言,它只是一个长名的文件。Git可以根据需要在操作系统上解决“文件夹”的固定问题。)

每个提交都具有该提交文件的 all 的完整完整快照。因此,例如,如果将提交 C123 与提交 C456 进行比较,则可以看到这两个文件共有哪些文件,每个文件都是唯一的,以及之间的区别任何通用文件。 git diff命令就是这样做的,它有很多选项:

git diff --name-only <commit#1> <commit#2>

告诉您哪些文件(用全名,例如a/b/c.ext)在两次提交中不同,或者仅在两次提交中之一。或者:

git diff --name-status <commit#1> <commit#2>

告诉您哪些文件不同,以什么方式不同:例如,可能需要A将文件添加到commit#1才能使commit#1开始更接近commit#2。可能只需要M修改另一个文件即可稍微更改其内容。 git diff的打印内容实际上是指令::如果您对左侧提交进行了这些更改,则会得到右侧提交。 git diff的默认设置是提供 complete 说明:您必须做的所有事情。

关于您的编辑

此外,我只是意识到自己最终需要git add个新的本地文件,并在git commitgit fetch之前在本地创建一个新的git diff。我说得对吗?

这也许是最明智的,但可能不是不必要

我在上面提到过有关Git处理提交的内容,上面显示的差异全部使用提交。提交包含所有(提交的)文件的冻结快照。 所有提交完全是只读的:一旦完成,任何提交的任何部分都无法更改。提交中存储的文件采用特殊的只读Git冻结格式,只有Git可以使用。 (这种格式使提交的比较变得更快,更容易,并且类似Git所做的其他事情。它也使提交的存储更加紧凑,因为一旦文件永久冻结,每个 new 提交都可以如果匹配,请重新使用 old 提交的文件。无法更改它们,因此,如果您进行新的提交,并且100个文件中有97个相同,则Git可以重复使用这97个文件。新提交中的“副本”实际上只是对现有的,已共享的,已经冻结的副本的引用。)

被永久冻结的东西非常适合存档。但是Git不仅仅是存档者。它的数据采用仅Git格式:计算机上的其他无法使用。因此,对于完成任何实际工作完全没有用。这意味着Git 必须,为了让您完成工作,将冻结的文件从某些提交中复制复制到某种工作区中。这个工作区域中的文件(Git称为工作树工作树或类似的文件)只是普通的日常文件。它们是 not 不冻结的,并且它们是计算机使用的普通日常格式,无论是哪种格式。 (它们都在文件夹中!)

这个将冻结文件复制到工作树中的过程还将冻结文件复制到Git的 index 中。当您git addgit commit时,您要做的是将工作树文件复制回索引(git add),然后根据索引中的内容进行新的提交({ {1}}。

索引可能会变得很复杂(在合并过程中),但可以很简单地描述它:在建立下一个提交的地方 1 中的文件处于冻结格式,可以进行新的提交,但与提交不同,它不会冻结。您可以覆盖它们,可以放入所有新文件,也可以从索引中删除文件。因此,您可以将每个工作树文件复制到索引中,以使其准备好提交。将工作树文件复制回索引的过程(如果有的话,则替换旧副本;如果没有,则创建一个全新的文件),称为分段文件,因此也称为索引也称为临时区域

所以:要使用文件,您需要将它们从提交复制到索引和工作树中。您可以查看和修改工作树中的文件,还可以将文件从工作树中重新复制回索引中,以进行提交。


1 从技术上讲,索引中的内容是对冻结格式文件的引用,就像在提交中一样。如果您开始使用git commitgit ls-files --stage查看索引的内部详细信息,则会显示此信息。但是,在大多数情况下,您可以将索引视为每个文件都有其自己的单独副本:心理模型在进入较低级别之前可以正常工作。


git update-index

git status命令运行两个git status:一个将当前的 commit (冻结,记住)与 index 进行比较。此处的所有不同之处都是进行提交。也就是说,如果您现在运行git diff ,Git将从索引中的内容开始进行新的提交。所有git commit(当前)提交的 match 匹配的文件都不是很有趣:它们完全相同。因此HEAD对此一无所获。对于任何新文件,已删除文件或其他文件,git status会列出该文件的名称。

这就是git status的工作,而git diff --name-only就是这一步的工作:它比较,而不同则打印出文件名。但是,它没有比较两个提交,而是比较了一个提交(特别是现在git status的一个提交)和索引。

但是HEAD然后继续运行第二个git status。这次,它将索引中的文件与工作树中的文件进行比较。对于相同的所有内容,它什么也没说。对于不同的所有内容,它都会打印文件名。

同样,这与git diff相同,只是比较索引和工作树而不是比较两个提交,只是比较。

因为工作树是一组普通的文件夹,所以您可以创建不在索引中的文件(和子文件夹)。这些是您的未跟踪文件。由于它们不在索引中,因此不会在下一次提交中。如果对它们运行git diff --name-only,Git会将它们从工作树复制到索引中,现在它们位于在索引中,而将会在下一个索引中提交。

如果不将它们复制到索引中,它们将仅保留未跟踪的文件。他们不会参加git add。 Git只会抱怨:我找到了这些未跟踪的文件,我该怎么办?一个git diff文件告诉Git关闭未跟踪的文件。它对跟踪的文件(位于索引中的文件)没有影响,因为这些文件位于索引中。但是您可以随时将文件放入索引,然后将它们从索引中取出。

这一切与您原来的问题有关

如果您希望比较两个提交,则需要进行一次提交。这样一来,您就可以根据需要调整索引的内容,然后进行两次提交,比较起来就很容易:您只需给.gitignore两个哈希ID,或两个哈希ID的名称。

但是,如果您愿意使用索引或工作树作为两组文件之一的源,也可以这样做。当使用工作树作为一组文件时,Git只会相信那些在 index 中也是 的文件是该工作树的一部分:其他文件都未跟踪,因此不参与git diff。现在您还有另一个问题:例如,git diff与右边的索引进行比较,左边的给定提交进行比较。但是,如果您希望进行比较,则有一个git diff --cached <hash>(反面)标志。

如果获取差异后,您决定要发送提交 另一个Git,您可能只想提交。进行提交通常非常便宜:只需打包索引中已有的内容,然后添加随新提交一起提供的元数据即可。

相关问题