shop.oreilly.com
Patches
- Gitネイティブプロトコル、HTTP以外の方法でもリポジトリの同期をとれる
- Unix開発黎明期からの"patch and apply"が使える
- git format-patch
- git send-email
- git am
- メール受信者はパッチの適用の取捨選択を行える
Why Use Patches?
- Gitネイティブプロトコルのほうが高効率
- にもかかわらずパッチを使用する理由
- push/pullで同期できないケース
- メーリスに流してレビューを乞う
- cherry-pickするとき、相手のrepositoryのコミット全部fetchせずにすむ
Generating Patches
- git format-patch
- git diffとの違い
- format-patchでは、指定の範囲に対して個々の差分を生成
- diffはeメールヘッダを生成しない
- git log -p --pretty=email とだいたい同じ
+ ---
+ main.org | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 72 insertions(+), 5 deletions(-)
130,132d126
+ --
+ 2.17.1
+
git format-patch master~2..master
0001-hoge.patch
0002-hoge.patch
master~1
, master
が指定されているので下記2つの差分が得られる
master~2
-> master~1
master~1
-> master
- 複雑なコミットグラフの場合も
git log
と同じ挙動
.A-B--C-D--E-F
. \ /
. X-Y-Z
- ここにおいて
D..F
はX
,Y
,Z
,E
,F
を指す
- マージコミット自体の差分がない場合の出力は
0001-X.patch
0002-Y.patch
0003-Z.patch
0004-F.patch
- rangeが実際にどのコミットを指すかは下記コマンドで確認できる
--no-merge
: マージコミット除外
-v
: verbose
git rev-list <range>
- root commitから指定のコミットまで全部パッチ出力したい場合は
git format-patch --root <end-commit>
- root commitは
/dev/null
との差分
- 単一コミットを指定すると、HEADまでのrangeが指定されたことになる
- 他のコマンドの逆
- 他のコマンドでは、指定のコミットに至るまでの歴史全部指定したことになる
git format-patch <commit> HEAD
- この挙動は、自分のHEADに含まれていて、相手先にないコミットを送付するときに役立つ
git format-patch alice/master
Patches And Topological Sorts
- トポロジカルソート順に出力される
- 適用すべき正しい順番に生成されることが保証されているということ
- 「正しい順番」とは必ずしも一意ではない
- format.headersコンフィグで「いつものメールヘッダ」を定義できる
英語
- to and fro
- tried-and-true
- veto