普通の開発者は、ソフトウェア ウェアハウスからコードのクローンを作成し、コードを記述してパッチを作成し、最後に電子メールで Linux に送信します。 カーネルのメンテナは良いでしょう。 Git はもともと Linux バージョン管理ツールとして使用され、透過的で完全かつ安定した Patch 機能を提供しました。
まずPatchとは何かを紹介しましょう。ソフトウェアに新しいバージョンがある場合、コンパイルとインストールのために新しいバージョンのコードを完全にダウンロードできます。ただし、Linux のように カーネルのような大規模なプロジェクトの場合、コードが圧縮されている場合でも、新しいダウンロードごとにかなりの費用がかかります。ただし、各更新では 1MB を超えるコードが変更されることはないため、 2 つのバージョンのコードの差分データを保持できるようにするには、非常に低コストでプログラムを更新できる必要があります。そこで、ラリーさんは ウォールはパッチというツールを開発しました。差分ファイルに基づいてバージョンアップデートを実行できます。
しかし、git では、パッチを作成するために diff と patch を直接使用する必要はありません。これは危険で面倒です。 Git は 2 つの単純なパッチ ソリューションを提供します。 1 つは git を使用することです diff によって生成される標準パッチ、2 つ目は git format-patch によって生成される Git 固有のパッチです。
1. git diff で生成される標準パッチ
まず git diff でパッチを作成します。この記事の例の作業ディレクトリには最初にファイル a があり、その内容は「これはファイルです」 a." をマスター ブランチに配置します。コードを変更するための一般的なアプローチは、新しいブランチを作成することです:
sweetdum@sweetdum-ASUS:~/GitEx$ git ブランチ
修正
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout 修正
ブランチに切り替え
「修正」
次に、ファイル a に行を追加して、git diff を実行します。
sweetdum@sweetdum-ASUS:~/GitEx$ echo
「修正!!!」>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git diff
diff --git a/a
b/a
index 4add65f..0d295ac 100644
--- a/a
+++ b/a
@@ -1 +1,2
@@
これはファイルです。
+Fix!!!
Git を見ました
diff の出力。これは非常に典型的なパッチ diff です。この方法で、この出力をパッチに直接変換できます:
sweetdum@sweetdum-ASUS:~/GitEx$
git commit -a -m "修正"
[修正 b88c46b] 修正
1 ファイル変更、1 挿入(+)、
削除数 0 (-)
sweetdum@sweetdum-ASUS:~/GitEx$ git diff master >
patch
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
に切り替えました
ブランチ 'master'
これでパッチ ファイルが完成し、master がチェックアウトされました。次に git を使用できます。 このパッチを適用するには、 apply をクリックします。もちろん、実際のアプリケーションでは、マージするだけなので、あるブランチでパッチをビルドし、それを別のブランチに適用することはありません。私たちは今、 そのような Fix ブランチはありません。通常の状況では、マスターを保護するために、新しく送信されたパッチを処理するためのブランチを確立します:
sweetdum@sweetdum-ASUS:~/GitEx$ git ブランチ
PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
に切り替えました
ブランチ 'PATCH'
sweetdum@sweetdum-ASUS:~/GitEx$ git apply
patch
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "パッチ
適用
[PATCH 9740af8] パッチ適用
1 ファイル変更、1 挿入(+)、0
deletions(-)
このパッチを PATCH ブランチに適用したので、PATCH ブランチと Fix ブランチを比較できます。結果は何も表示されないはずです。これは、PATCH ブランチと Fix ブランチがまったく同じであることを示しています。 。パッチは正常に適用されました。複数のファイルがあっても git diff を使用してパッチを生成することもできます。
2.git format-patch によって生成された git 固有のパッチ。
今回は、上記の例の作業ディレクトリを使用し、Fix ブランチの a に新しい行を追加した後、git を使用します。
format-patch はパッチを生成します。
sweetdum@sweetdum-ASUS:~/GitEx$ git チェックアウト
Fix
ブランチ「Fix」に切り替えました
sweetdum@sweetdum-ASUS:~/GitEx$ echo
'修正!!!'>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m
"Fix1"
[Fix 6991743] Fix1
1 ファイルが変更されました、1 挿入 (+)、0
削除(-)
sweetdum@sweetdum-ASUS:~/GitEx$ git format-patch -M
master
0001-Fix1.patch
git format-patch の -M オプションは、このパッチをそのブランチと比較する必要があることを示します。パッチ ファイルが生成されるので、それが何であるかを見てみましょう:
sweetdum@sweetdum-ASUS:~/GitEx$ cat 0001-Fix1.patch
From
6991743354857c9a6909a253e859e886165b0d90 2001 年 9 月 17 日月曜日 00:00:00
発信者:
Sweetdumplings
日付: 月曜日、29 8 月 2011 14:06:12
+0800
件名: [パッチ] Fix1
---
a | 1 +
1 ファイル変更、1 挿入 (+)、0 削除 (-)
diff --git a/a b/a
index 4add65f。 .0d295ac 100644
--- a/a
+++
b/a
@@ -1 +1,2 @@
これはファイル a.
+Fix!!!
--
1.7.4.1
ほら、今回は diff だけでなく、もっとたくさんのものがあります情報、送信者、時刻などが含まれています。よく見ると、これは電子メール ファイルであることがわかります。直接送信できます。この種のパッチには git を使用する必要があります 申請するつもりです。
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
ブランチに切り替えました
'master'
sweetdum@sweetdum-ASUS:~/GitEx$ git ブランチ
PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout
PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git am 0001-Fix1.patch
適用:
Fix1
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m "PATCH apply"
パッチを送信した後、ファイル a の現在の状況を確認できます:
sweetdum@sweetdum-ASUS: ~ /GitEx$ cat a
これはファイル a です。
Fix!!!
案の定、もう 1 つ Fix があります!!!
しかし、master ブランチと Fix ブランチの間に複数のコミットがある場合に注意する必要があります送信ごとにパッチが生成されます。
3. 2 つのパッチの比較:
互換性: git diff によって生成されたパッチには強い互換性があることは明らかです。変更しているコードの公式リポジトリが Git 管理のリポジトリではない場合は、git を使用する必要があります。 diff によって生成されたパッチにより、プロジェクトのメンテナがコードを受け入れられるようになります。
デバッグ機能: git diff によって生成されたパッチについては、git apply --check を使用して、パッチが現在のブランチに適切かつスムーズに適用できるかどうかを確認できます。 format-patch で生成されたパッチは現在のブランチに適用できません。 git am はプロンプトを表示し、パッチ適用作業の完了を支援します。 -3 三者マージを実行します。詳しい方法はgitのマニュアルまたは「Progit」を参照してください。この観点から見ると、どちらのデバッグ機能も非常に強力です。
リポジトリ情報: git のおかげで format-patch で生成されたパッチにはパッチ開発者の名前が含まれているため、パッチが適用されると、この名前がリポジトリに記録されます。これは明らかに適切です。したがって、現在 Git を使用しているオープン ソース コミュニティでは、全員が format-patch を使用してパッチを生成することを推奨することがよくあります。