如何在 Git 中检查文件是否为二进制文件

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何判断一个文件是否被 Git 视为二进制文件。我们将探索两种方法:使用 git diff --numstat 命令观察 Git 如何总结文件更改,以及利用标准的 Linux file 命令识别文件类型。在本实验结束时,你将了解 Git 如何区分文本文件和二进制文件,以及如何自行检查这种区别。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/diff("Compare Changes") subgraph Lab Skills git/add -.-> lab-560025{{"如何在 Git 中检查文件是否为二进制文件"}} git/status -.-> lab-560025{{"如何在 Git 中检查文件是否为二进制文件"}} git/diff -.-> lab-560025{{"如何在 Git 中检查文件是否为二进制文件"}} end

使用 git diff --numstat 进行检查

在这一步中,你将学习如何使用 git diff --numstat 来了解文件不同版本之间的更改情况。该命令会提供更改摘要,显示每个文件的新增和删除行数。

首先,确保你位于项目目录中。打开终端并导航到 my-time-machine 目录:

cd ~/project/my-time-machine

现在,对 message.txt 文件进行更改。我们将在其中添加一行新内容:

echo "Hello, Past Me" >> message.txt

>> 操作符会将文本追加到现有文件中,而不是覆盖它。

再次检查仓库的状态:

git status

你应该会看到 message.txt 已被修改:

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   message.txt

no changes added to commit but untracked files present (use "git add" to track)

现在,使用 git diff --numstat 查看所做更改的摘要:

git diff --numstat

输出应该类似于以下内容:

1       0       message.txt

此输出表明,在 message.txt 中新增了 1 行,删除了 0 行。这是一种简洁的方式,可让你快速了解多个文件更改的总体影响。

当你想快速了解文件的更改程度,而无需查看具体的更改内容时,理解 git diff --numstat 非常有用。在审查他人所做的更改,或者想了解自己工作的修改规模时,这个命令尤其有帮助。

对文件运行 file 命令

在这一步中,你将学习 file 命令,它是 Linux 中一个实用的工具,用于确定文件的类型。这很重要,因为 Git 对文本文件和二进制文件的处理方式不同。

首先,确保你位于项目目录中:

cd ~/project/my-time-machine

现在,对 message.txt 文件使用 file 命令:

file message.txt

你应该会看到类似以下的输出:

message.txt: ASCII text

这表明 message.txt 是一个文本文件。Git 非常适合处理文本文件,因为它可以轻松跟踪逐行的更改。

其他类型的文件呢?让我们创建一个简单的二进制文件。你可以使用 head 命令提取系统文件的前几个字节,并将其重定向到项目中的一个新文件。例如,从 /bin/ls 可执行文件创建一个小的“二进制”文件:

head -c 1024 /bin/ls > binary_file

此命令提取 /bin/ls 文件的前 1024 字节,并将其保存为当前目录下的 binary_file

现在,对这个新文件使用 file 命令:

file binary_file

输出会有所不同,表明它是一个二进制文件。输出可能如下所示:

binary_file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, BuildID[sha1]=..., stripped

这个输出确认了 binary_file 不是一个简单的文本文件。Git 对二进制文件的处理方式不同,因为它无法轻松确定逐行的更改。相反,它通常会为每个版本存储整个二进制文件。

在使用 Git 时,理解文本文件和二进制文件之间的区别至关重要,尤其是在处理图像、编译程序或压缩存档等文件时。Git 强大的差异比较和合并功能主要是为文本文件设计的。

测试文本文件与二进制文件

在这一步中,你将了解 Git 如何处理文本文件和二进制文件的更改。这将凸显出为什么 Git 的差异比较功能主要是为文本文件设计的。

首先,确保你位于项目目录中:

cd ~/project/my-time-machine

你已经有了 message.txt(文本文件)和 binary_file。现在,对 message.txt 进行另一次更改:

echo "Another line for the future" >> message.txt

接下来,将这两个文件添加到暂存区并提交。首先,添加文件:

git add message.txt binary_file

检查状态以确认两个文件都已被暂存:

git status

你应该会看到两个文件都列在“Changes to be committed”下面:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   message.txt
        new file:   binary_file

现在,提交这些更改:

git commit -m "Add binary file and update message"

你会看到确认提交的输出,包括对两个文件的更改:

[master ...] Add binary file and update message
 2 files changed, 2 insertions(+)
 create mode 100644 binary_file

现在,对 binary_file 进行一个小更改。你可以向其中追加一个字节:

echo -n "a" >> binary_file

-n 标志可防止 echo 添加换行符。

再次检查状态:

git status

Git 会显示 binary_file 已被修改:

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   binary_file

no changes added to commit but untracked files present (use "git add" to track)

现在,尝试使用 git diff 查看差异:

git diff

Git 不会显示逐行的更改,而是可能会告诉你二进制文件有差异:

warning: LF will be replaced by CRLF in binary_file.
The file has no newline at the end of the file.
diff --git a/binary_file b/binary_file
index ... ...
Binary files a/binary_file and b/binary_file differ

这个输出清楚地表明,Git 不会尝试显示二进制文件内的详细更改。它只是说明文件不同。这是 Git 处理文本文件和二进制文件的关键区别。对于文本文件,Git 可以准确显示哪些行被添加、删除或修改。对于二进制文件,它只能告诉你发生了更改。

这一步展示了为什么 Git 强大的差异比较和合并工具在处理基于文本的内容(如源代码和配置文件)时最为有效。

总结

在本次实验中,你学习了如何在 Git 中判断一个文件是否为二进制文件。你探索了两种主要方法。首先,你使用 git diff --numstat 命令来检查文件版本之间的更改,观察它如何总结添加和删除的内容,这可以根据更改的规模间接表明文件的性质。

其次,你了解了 file 命令(一个标准的 Linux 实用工具),以及如何使用它直接识别文件的类型,区分文本格式和二进制格式。这种直接的方法至关重要,因为 Git 处理二进制文件的方式与处理文本文件有很大不同。