gitバージョン管理のパッチとは何ですか?


136

私はgitとバージョン管理の両方が初めてなので、パッチとは何か、またgitで行う他のアクティビティとの違いを理解しようとしています。

いつパッチを適用しますか?コミットするたびに発生しますか?

回答:


116

このブログ投稿で、パッチの作成方法を確認できます(通信して別のリポジトリに適用する変更のコレクション)。

gitパッチ
(2008年のブログ投稿「Gitを使用したBioruby:それはどのように機能するのか」の画像、Jan AERTSから発行)

別の具体例として、Gitを使用したRailsへの貢献も参照してください。

現在、GitHubプルリクエストにより、GitHubリポジトリへのパッチの適用が非常に簡単になりました。これは、直接の寄稿者ではない場合(つまり、直接リポジトリにプッシュする権限がない場合)に役立ちます。
実際、ごく最近、GitHub は新しいパッチの通知を改善するために「Better Pull Request Emails」を導入しました。


4
良い答えであり、GITの「パッチ」は私が探しているものではないことを教えてくれます。
RonLugge

91

パッチは、パッチファイルと呼ばれる別のファイルに含まれる指示に従ってテキストファイルを更新するUnixプログラムです。

したがって、言い換えれば、それは、そのファイルを処理して何かに適用する命令またはプログラムを含むファイルを意味する場合があります。

さて、パッチファイルとは何ですか?2行のテキストファイルがあるとします。

This is line A.
This is line B, or otherwise #2.

次に、最初の行を変更すると、ファイルは次のようになります。

This is SPARTA.
This is line B, or otherwise #2.

ファイルの内容の変更をどのように説明しますか?最初の行は「これはA行です」と言えます。「This is SPARTA。」、または最初の行の最後の単語「A」で別の単語「SPARTA」に置き換えられました。そして、それはまさにdiffが私たちに言っていることです。このファイルの2つのバージョンがあり、1つはfile1.txt、もう1つはfile2.txtという名前で、diffを実行してこれを取得するとします。

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

変更の説明があれば、それを初期コンテンツに適用して、変更されたコンテンツを取得できます。そして、「パッチ」のようなプログラムが理解できる統一されたフォーマットに入れられたこれらの変更は、パッチファイルと呼ばれます。それは、彼らがあなたに釣り方を教えてくれる誰かから魚を手に入れる代わりに、あなたがその魚を自分で水から掘り出すことができるようなものです。ここで、file1.txtにパッチを適用して、file2.txtのように見えるようにします。

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

このファイルの2つのバージョンを用意する方が簡単だと思うかもしれません。さて、この単純なケースではそうです。しかし、多くのファイルがあり、それらのファイルが非常に大きい場合、全体を2つコピーするよりも、数行の変更を加える方がはるかに効率的です。

gitに関して話すとき、パッチファイルは同じことを意味しますが、diff + patchを自分で使用するのは悪夢です。たとえば、ファイルを比較するには、常に2つのバージョンのファイル(またはリポジトリ全体)をチェックアウトする必要があります。それほどよく聞こえませんか?したがって、gitはすべてのハードワークを処理します。ローカルファイルを、作業中のリポジトリにあるものと比較し、「diff」として表示したり、「diff」をパッチは、変更をコミットするか、すでにあるパッチファイルを適用することもできます。詳細には触れませんが、この意味でgitはSVNのような他のバージョン管理システムや、CVSやperforceとまったく同じです。

それが役に立てば幸い!


gitが組み込みpatchプログラムを使用することを知らなかった。gitには独自の実装があると思いました。
radiantshaw 2018

43

パッチは、リポジトリで行われた変更を示す小さなファイルです。これは通常、チーム外の誰かが読み取り専用アクセス権を持っているが、適切なコード変更を利用できる場合に使用されます。その後、パッチを作成して送信します。それを適用し、gitリポジトリにプッシュします。その後、誰もが更新されたバージョンの恩恵を受け、パッチの作成者は読み取り/書き込みアクセスを必要としませんでした。

それは本当に主にセキュリティの問題です(少なくとも、それは人々がそれを使用するためのものです)。


1
追加情報:gitは内部でパッチを使用しませんが、gitの設計目標の1つは、パッチの交換を容易にすることです(Linuxやgit自体など、多くのプロジェクトがそのように機能するため)。したがって、gitにはパッチを処理するための特別なコマンドがあります(git diffデフォルトでは変更がパッチとして表示git applyされ、パッチを適用できます)。
sleske 2012年

おめでとうございます!パッチの用途、つまり、変更の作成者が書き込みアクセス権を持たないリポジトリに変更を送信する手段に関して、それを実際に釘付けにしました。したがって、GitHubのフォークおよびプルリクエストモデルは、変更配布のパッチモデルの代わりになります。したがって、パッチはGitHubのようなツールのコンテキスト以外でのみ役立つと思います。
mljrg

8

パッチファイルは、任意のブランチに任意の順序で適用できる単一の変更セットを表します。パッチを使用すると、1つまたは複数のファイル間で差異が生じます。その後、差分(パッチ)を適用して、新しいファイルの変更を取得できます。Gitのパッチには多くの用途があります。作業ディレクトリにコミットされていない変更があり、その変更を他の場所に適用する必要がある場合は、パッチを作成してパッチを適用してください。

git diff > mypatch.patch

リポジトリに新しいファイルがある(追跡されていない)場合は、パッチを作成する前にファイルをステージングし(コミットしないでください)、次のコマンドを使用します。

git diff --cached > mypatch.patch 

後でパッチを適用できます。

git apply mypatch.patch

gitリポジトリに変更を加えたいが、書き込み権限がない場合は、変更を加えて両方の間にパッチを作成し、これにより、パッチを適用する権限を持つ人にパッチを送信します。変更はそのgitリポジトリに追加する必要があります。


より良いデモ:robots.thoughtbot.com/…。私の基本的な例の要約:git format-patch <base_commit_or_branch_name>=今からすべてのコミットを<base_commit_or_branch_name>にまとめて、差分とコミットメッセージを含む素敵できれいなファイルにまとめます。彼らのコードベース。その後、受信者がファイルを自分のシステムにパッチを適用:cat *.patch | git am
ガブリエルステープルズ

7

パッチとは、1つ以上のファイルの違いのセットであり、それらの違いを示します。通常は、変更内容を誰かに示すパッチのみを生成します。このような場合の例として、オープンソースアプリケーションでバグを見つけて修正し、その修正をバグトラッカーに投稿する場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.