2017年08月02日

git 変更をpatchファイルにする

変更差分をpatchファイルにすることができる。

事前知識として、Linuxの patch はテキストファイルに差分を適用するコマンド。
パッチファイルを作成するコマンドは以下。

$ diff -u 変更前のファイル 変更後のファイル > パッチファイル名


-u オプションは unified diff形式で出力する指定。

例として、パッチファイルを作成して、そのパッチファイルの中身を見てみる。
$ diff -u a_old.txt a_new.txt > a.patch

$ cat a.patch
--- a_old.txt 2017-08-01 09:00:00.570393470 +0900
+++ a_new.txt 2017-08-01 09:30:00.841552217 +0900
@@ -1 +1,3 @@
aaa
+
+modified 1


パッチを適用するコマンドは以下。

$ patch -u 適用するファイル名 < パッチファイル名



パッチ適用前後を比較しながら、適用内容を確認してみる。
$ cat a.txt
aaa

$ patch a.txt < a.patch
patching file a.txt

$ cat a.txt
aaa

modified 1

変更差分のパッチが適用されたことがわかる。


もし適用するファイルを間違えていたら、パッチ適用を戻す(リバースパッチ)。
-R オプションを使うことで、新旧ファイルが反転しているものとして適用することで元に戻す。

$ patch -u -R 適用するファイル名 < パッチファイル名

$ patch -R a.txt < a.patch
patching file a.txt

$ cat a.txt
aaa

リバースパッチをあてることで元に戻った。





パッチファイルの作成


git diff の出力をパッチファイルとして保存すればいい。
例えば、特定ファイルの異なるコミットの差分のパッチファイルを作る場合、

$ git diff commitID1 commitID2 -- filepath > file.patch

試しに作成してみる。
$ git log --oneline
827142f modified2 a.txt b.txt
e379d74 modified a.txt b.txt
6c5004e modified a.txt d.txt
069d76c Add file :d.txt
4bfcd75 modified c.txt
3f062b7 modified b.txt
9925985 modified a.txt
d79bc0b Add files

$ git diff 069d76c 6c5004e -- p1/p2/d.txt
diff --git a/p1/p2/d.txt b/p1/p2/d.txt
index 1d60b70..c8b35f9 100644
--- a/p1/p2/d.txt
+++ b/p1/p2/d.txt

@@ -1 +1,3 @@
ddd
+
+patch 1:d.txt


$ git diff 069d76c 6c5004e -- p1/p2/d.txt > ~/Documents/test.patch

$ cat ~/Documents/test.patch
diff --git a/p1/p2/d.txt b/p1/p2/d.txt
index 1d60b70..c8b35f9 100644
--- a/p1/p2/d.txt
+++ b/p1/p2/d.txt
@@ -1 +1,3 @@
ddd
+
+patch 1:d.txt






パッチファイルの適用


作成したパッチファイルを適用するには git apply を使う。

$ git apply file.patch


git apply は全部適用するか、または一切適用しないかのどちらか。エラーが出るまで適用するとか中途半端なことはしない。
また、適用できるかあらかじめチェックすることができる。git apply --check を使い、適用できなければエラーがでる。適用可能であれば何も出力されない。
$ git apply --check test.patch
error: patch failed: p1/p2/d.txt:1
error: p1/p2/d.txt: patch does not apply

適用したら、ステージしてコミットすれば良い。



git操作で作成したパッチファイルは、Linuxコマンドの patch コマンドと互換性を持ち、git管理されていないファイルに対しても適用できる。

$ patch -p1 < test.patch

-p オプションは差分に記載されたファイル名から指定した個数分のパス指定を取り除く指定。"-p1" なので1個除く。
差分ファイルのパスの指定には、"a" "b" がついているのでこれを除くことで、patch コマンドと互換性が取れる。
--- a/p1/p2/d.txt
+++ b/p1/p2/d.txt






まとめ


パッチを使うことで、ファイル丸ごとの置き換えはしたくない差分対応とか、離れた環境にあるリポジトリへの適用や、git管理下にないファイルに変更差分を適用したい場合に使える。
変更差分は git diff の操作なので難しいことではない。
ちょっとした変更差分でも、手動でファイルに変化点を加えていくとヒューマンエラーが介入する可能性があり神経を使うので、自動的に作業できることは自動化してしまうほうが時間もかからないし、間違いが少ない。





gitをインストール
gitサーバーのセットアップ
git ブランチについて
git 変更を一時的に退避 stash
git ブランチを合流するマージ
git ブランチを付け替える
git コミット履歴を変更する
git 変更をリセットする
git リモートでの操作
git ファイルの追跡
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください