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