2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

git diff / git apply入門:パッチで一部の変更だけを反映する方法

Posted at

 Gitを使ってチーム開発をしていると特定のファイルにだけ変更を適応したい場面があります。
 そんなときはgit diffgit apply を使いましょう。

使用ケース

  • 特定のブランチやコミットから一部の変更だけ取り入れる
    • cherry-pickより柔軟に対応可
  • コードレビューなどの修正提案を渡す
  • git stashの代用

パッチとは

 Gitではパッチ作成にgit diffを、パッチ適応にgit applyを使います。パッチとは差分を意味します。一般にはソフトウェアの不具合を修正したり、機能を追加したりするために使われる更新プログラムを指すことが多く、修正プログラムやアップデートとも呼ばれることがありますが、これも広義では差分を意味しています。Gitの場合は単純に差分をパッチと呼びます。
 git diffは差分を表示するコマンドですが、これがパッチの形式になっていることが確認できます。

 git applyコマンドでは「指定された差分出力(つまり「パッチ」)を読み取り、ファイルに適用します。」と説明されています。

コマンド解説

git diff

パッチファイルへの出力

$ git diff > patch
$ git diff [オプションや種々の指定] > patch

 git diff は単に差分を出力するだけですが、これをファイルにリダイレクトすることでパッチファイルを作成できます。

作業ツリーに関する差分

$ git diff             (1) 
$ git diff --cached    (2) 
$ git diff HEAD        (3) 
  1. ステージングと作業ツリーとの間の変更

  2. ステージングと最後のコミットとの間の変更:git commitでコミットされる内容

  3. 作業ツリーと最後のコミットとの間の変更:git commit -aでコミットされる内容

特定のブランチやコミットとの差分

$ git diff commitA..commitB   (1)
$ git diff commitA...commitB  (2)
  1. 特定のコミット間の差分
  2. 両者のコミットの共通の祖先(マージベース)からcommitBの間の変更

 ブランチを指定することも可能です。Gitではブランチ名=そのブランチの最新コミットなのでgit diff topic..mainのようにコミットをブランチに置き換えればOKです。
 (1)はgit diff commitA commitBのように..を省くこともできますが使用を推奨します。..はコミット間を表すgit共通の記法なので、他のコマンドでも使えます。
 (2)はGitHubのPull Requestの「Files changed」タブで表示される差分と同じものをイメージしてください。

ファイルの指定

$ git diff ファイル名

 コマンドの最後にファイルやディレクトリを指定することで特定の変更だけを取り出すことができます。

git apply

パッチを適応

$ git apply patch

主なオプション

# 適用した変更を取り消す
git apply --reverse patch

# パッチを適用せず、変更の概要を表示する
git apply --stat patch

# パッチを適用せず、エラーが出るか確認する
git apply --check patch

応用例

$ git diff feat_ref~1..feat_ref path/to/directory > patch
$ git apply patch

 feat_ref ブランチの上から1つ目のコミットのうち、path/to/directory下にある差分だけを適用にしたい場合、上記のようなコマンドで実現できます。

補足

  • stashの代用について
    • 柔軟に扱える
    • reflogが使えない
  • linuxに似たコマンドdiffpatch
    • ファイル間の差分を抽出し適用するコマンド
    • git diff --no-indexgit applyで同じ
  • git format-patchgit amは使わない
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?