私はgitとバージョン管理の両方が初めてなので、パッチとは何か、またgitで行う他のアクティビティとの違いを理解しようとしています。
いつパッチを適用しますか?コミットするたびに発生しますか?
私はgitとバージョン管理の両方が初めてなので、パッチとは何か、またgitで行う他のアクティビティとの違いを理解しようとしています。
いつパッチを適用しますか?コミットするたびに発生しますか?
回答:
このブログ投稿で、パッチの作成方法を確認できます(通信して別のリポジトリに適用する変更のコレクション)。
(2008年のブログ投稿「Gitを使用したBioruby:それはどのように機能するのか」の画像、Jan AERTSから発行)
別の具体例として、Gitを使用したRailsへの貢献も参照してください。
現在、GitHubプルリクエストにより、GitHubリポジトリへのパッチの適用が非常に簡単になりました。これは、直接の寄稿者ではない場合(つまり、直接リポジトリにプッシュする権限がない場合)に役立ちます。
実際、ごく最近、GitHub は新しいパッチの通知を改善するために「Better Pull Request Emails」を導入しました。
パッチは、パッチファイルと呼ばれる別のファイルに含まれる指示に従ってテキストファイルを更新する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とまったく同じです。
それが役に立てば幸い!
patch
プログラムを使用することを知らなかった。gitには独自の実装があると思いました。
パッチは、リポジトリで行われた変更を示す小さなファイルです。これは通常、チーム外の誰かが読み取り専用アクセス権を持っているが、適切なコード変更を利用できる場合に使用されます。その後、パッチを作成して送信します。それを適用し、gitリポジトリにプッシュします。その後、誰もが更新されたバージョンの恩恵を受け、パッチの作成者は読み取り/書き込みアクセスを必要としませんでした。
それは本当に主にセキュリティの問題です(少なくとも、それは人々がそれを使用するためのものです)。
git diff
デフォルトでは変更がパッチとして表示git apply
され、パッチを適用できます)。
パッチファイルは、任意のブランチに任意の順序で適用できる単一の変更セットを表します。パッチを使用すると、1つまたは複数のファイル間で差異が生じます。その後、差分(パッチ)を適用して、新しいファイルの変更を取得できます。Gitのパッチには多くの用途があります。作業ディレクトリにコミットされていない変更があり、その変更を他の場所に適用する必要がある場合は、パッチを作成してパッチを適用してください。
git diff > mypatch.patch
リポジトリに新しいファイルがある(追跡されていない)場合は、パッチを作成する前にファイルをステージングし(コミットしないでください)、次のコマンドを使用します。
git diff --cached > mypatch.patch
後でパッチを適用できます。
git apply mypatch.patch
gitリポジトリに変更を加えたいが、書き込み権限がない場合は、変更を加えて両方の間にパッチを作成し、これにより、パッチを適用する権限を持つ人にパッチを送信します。変更はそのgitリポジトリに追加する必要があります。
git format-patch <base_commit_or_branch_name>
=今からすべてのコミットを<base_commit_or_branch_name>にまとめて、差分とコミットメッセージを含む素敵できれいなファイルにまとめます。彼らのコードベース。その後、受信者がファイルを自分のシステムにパッチを適用:cat *.patch | git am