GIT でパッチを作成することは、まだ公開する準備ができていない変更を共有するための優れた方法です。プロジェクトのブランチ。
パッチを作成する方法をよりよく理解するために、まず GIT が変更を保存する方法について少し説明しましょう。
GIT を初めて使用する場合は、git をインストールして、この GIT 紹介記事からジャンプスタートしてください。
ファイルが GIT のプロジェクトに初めてコミットされると、コピーが保存されます。その後のすべてのコミットについて、GIT は基本的に、以前のバージョンのプロジェクトを新しくコミットされたバージョンに変換する方法を示す命令を保存します。
GIT では、これらの命令は「差分」と呼ばれます。ブランチをチェックアウトすると、GIT は基本的にプロジェクトの元の状態から開始し、これらすべての差分を順番に適用して、目的の状態に到達します。
GIT がコミットを保存する方法がわかったので、パッチ ファイルは、パッチがまたがる各コミットの差分を単純に連結したものになることが容易にわかります。
この例では、次の状況を想定してみましょう:2 つのブランチ (マスターと実験的) を持つ単純なプロジェクトがあります。
$ git log --oneline --all * b36f227 (experimental) third commit -- added file3 * f39ebe8 second commit -- added file2 * 04a26e5 (HEAD, master) first commit -- committed file1
マスターは現在最初のコミットにあり、実験的はその 2 コミット前です。各コミットで、file1、file2、file3 という名前のファイルをそれぞれ追加しました。各ブランチの現在の状態は次のとおりです:
マスターには file1:しかありません
$ git status On branch master nothing to commit, working directory clean $ ls file1
実験中は、3 つのファイルすべてがあります:
$ git status On branch experimental nothing to commit, working directory clean $ ls file1 file2 file3
このチュートリアルでは、実験的ブランチで変更のパッチを作成し、それらをマスターに適用する方法について説明します。
GIT パッチの作成
git diff コマンドを使用して diff 出力を作成し、それをファイルにリダイレクトします。使用する diff コマンドの形式は次のとおりです。
git diff from-commit to-commit > output-file
ここで:
- from-commit – パッチを開始するポイント。 (この場合、experimental が master から分岐するポイント)
- to-commit – パッチは、この時点までの変更にまたがります。 (私たちの場合、実験的な最新のコミット)
- output-file – パッチはここに書き込まれます
注:from-commit または to-commit のいずれかが省略されている場合、それらは HEAD と見なされます
2 つのコミットを一意のハッシュで指定します。通常、一意性を確保するのに十分なコミット ハッシュを指定するだけで済みます (おそらく 4 文字で十分です)。
$ git diff 04a2 b36f > patch.diff $ ls patch.diff file1 file2 file3
上記の出力からわかるように、パッチ ファイルが作成されています。
ブランチ全体のパッチを作成するこの特別なケースでは、GIT に作業の一部を任せることができます。 git merge-base コマンドを使用して、実験的ブランチがマスター ブランチから分岐したポイントを GIT に判断させることができます。
git diff $(git merge-base <public branch> <experimental branch>) > <output file>
git merge-base は、2 つのブランチ間の最新の共通コミットを決定します。今回は を省略したことにも注意してください。 HEAD にデフォルト設定され、実験的ブランチがチェックアウトされているため、HEAD が実験的ブランチの最新のコミットになります。
$ git diff $(git merge-base master experimental) > anotherPatch.diff $ ls anotherPatch.diff patch.diff file1 file2 file3
再び、パッチ ファイルが作成されました。これらのパッチ ファイルは同一です。
GIT パッチの適用
パッチファイルが作成されたら、それを適用するのは簡単です。チェックアウトしたブランチが、パッチを適用するブランチ (この場合はマスター) であることを確認してください。次に、git apply コマンドを使用してパッチを適用できます:git apply
$ git status On branch master ... (rest of output omitted) ... $ ls anotherPatch.diff patch.diff file1 $ git apply patch.diff $ ls anotherPatch.diff patch.diff file1 file2 file3
実験的ブランチからの変更がマスターに複製されました。
警告:この方法でパッチを適用するとコンテンツが正確に複製されますが、コミット履歴は複製されません。これは、作成したパッチが複数のコミットにまたがっていても、適用すると単一の変更セットとして表示されることを意味します。コミットがどのように分割されたかに関する知識と、各コミットのメッセージの両方が失われます。両方のブランチのコミット履歴を比較してみましょう:
実験的に、3 つのコミットがあり、それぞれに意味のあるコミット メッセージがあります。
$ git branch * experimental master $ git log --oneline b36f227 third commit -- added file3 f39ebe8 second commit -- added file2 04a26e5 first commit -- committed file1
ただし、パッチは実際の変更を master ブランチに適用しただけです。
$ git branch experimental * master $ git log --oneline 04a26e5 first commit -- committed file1
パッチを適用しても変更はコミットされず、これらの変更に関連するコミット履歴も取り込まれませんでした。 GIT でパッチを使用する場合は、これに注意してください。