Patches
- Gitネイティブプロトコル、HTTP以外の方法でもリポジトリの同期をとれる
-
Unix開発黎明期からの”patch and apply”が使える
-
git format-patch
- eメール形式でパッチ生成
-
git send-email
- SMTPでパッチ送付
-
git am
- eメールメッセージ中のパッチを適用
-
- メール受信者はパッチの適用の取捨選択を行える
Why Use Patches?
- Gitネイティブプロトコルのほうが高効率
-
にもかかわらずパッチを使用する理由
-
push/pullで同期できないケース
- 企業のファイアウォールでGitネイティブプロトコルのポートが閉じている
- SSH(同様)
-
HTTPも、pullはできるがpushができなかったりする
- inboundだけ開いているということか
- メーリスに流してレビューを乞う
- cherry-pickするとき、相手のrepositoryのコミット全部fetchせずにすむ
-
Generating Patches
-
git format-patch
- eメールメッセージ形式でパッチ生成
-
git diffとの違い
-
format-patchでは、指定の範囲に対して個々の差分を生成
- cf. diffではひとまとまりの差分
- diffはeメールヘッダを生成しない
-
-
git log -p —pretty=email とだいたい同じ
-
【補】emailには下記情報が含まれる
- 差分の統計
- gitバージョン
-
+ ---
+ 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 # on my master
# same as:
# git format-patch alice/master..HEAD
Patches And Topological Sorts
-
トポロジカルソート順に出力される
- 適用すべき正しい順番に生成されることが保証されているということ
- 「正しい順番」とは必ずしも一意ではない
- format.headersコンフィグで「いつものメールヘッダ」を定義できる
英語
-
to and fro
- あちらこちらに
-
tried-and-true
- 実証済みの、立証済みの、絶対確実な
-
veto
-
拒否権(の行使)
- 大統領、政府などの
-