Git でファイルがバイナリかどうかを確認する方法

GitGitBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Git がファイルをバイナリとみなすかどうかを判断する方法を学びます。2 つの方法を探っていきます。1 つは、git diff --numstat コマンドを使用して、Git が変更内容を要約する方法を観察する方法です。もう 1 つは、標準的な 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 コマンドを実行する

このステップでは、Linux でファイルの種類を判別する便利なツールである file コマンドについて学びます。これは、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 に小さな変更を加えましょう。1 バイトを追加することができます。

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 でファイルがバイナリかどうかを判断する方法を学びました。主に 2 つの方法を探りました。まず、git diff --numstat コマンドを使ってファイルのバージョン間の変更を調べ、追加と削除の概要を見ることで、変更の規模から間接的にファイルの性質を判断する方法を学びました。

次に、標準的な Linux ユーティリティである file コマンドについて学び、これを使ってファイルの種類を直接特定し、テキスト形式とバイナリ形式を区別する方法を学びました。この直接的なアプローチは、Git がバイナリファイルとテキストファイルを大きく異なる方法で扱うため、重要です。