GNU/Linux >> Linux の 問題 >  >> Linux

diff および apply コマンドを使用して GIT でパッチを作成および適用する方法

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 でパッチを使用する場合は、これに注意してください。


Linux
  1. diffコマンドを使用してLinuxでファイルを行ごとに比較する方法

  2. diff および apply コマンドを使用して GIT でパッチを作成および適用する方法

  3. Linux で Snapper コマンドを使用してファイルシステムのスナップショットを作成する方法

  1. コマンドラインを使用してMySQLでデータベースを作成する方法

  2. Linuxでエイリアスを作成してエイリアスコマンドを使用する方法

  3. ddコマンドを使用して起動可能なUSBドライブを作成する方法

  1. 7 Linux で差分パッチ ファイルを適用するパッチ コマンドの例

  2. 「dd」コマンドを使用して Linux でスパース ファイルを作成する方法

  3. 単一のコマンドでディレクトリを作成して許可を与える方法