特定のコミットのgitパッチを生成する方法は?


1233

SHA1コミット番号のリストのパッチを作成するスクリプトを作成する必要があります。

私はを使ってみましたgit format-patch <the SHA1>が、そのSHA1以降、コミットごとにパッチが生成されました。数百のパッチが生成された後、プロセスを終了する必要がありました。

特定のSHA1に対してのみパッチを生成する方法はありますか?

回答:


1990

試してください:

git format-patch -1 <sha>

または

git format-patch -1 HEAD

上記のドキュメントリンクによると、-1フラグはパッチに含めるコミットの数をgitに伝えます。

-<n>

     最上位のコミットからパッチを準備します。


次のコマンドでパッチを適用します。

git am < file.patch

211
パッチの適用: git apply --stat file.patch#show stats。 git apply --check file.patch#適用する前にエラーをチェックします。 git am < file.patch#最後にパッチを適用します。
エイドリアン

3
最後のコミットが別のブランチからのマージである場合は機能しないようです。
Lex Li

2
CRLF行末を使用してファイルにパッチを適用するには:git am --keep-cr < mypatch.patch
MichaelSchmeißerMay

40
ここにある後でgit am -3 < file.patch使用git mergetoolして(または手動で編集して)競合を解決できる3者間マージを使用して適用するために使用します。
Matt

6
また、このコマンドは、コミットからわずか特定のファイル(複数可)の作品:git format-patch -1 <sha> path/to/file.jsこれはのみfile.jsのための差分を含むパッチを作成します
クリストフDombi

281

特定のsha1ハッシュの最上位のコミットからパッチを生成する場合:

git format-patch -<n> <SHA1>

単一のパッチファイル内の先頭からの最後の10パッチ:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

2
最初のコマンドの例を示すのに十分親切にしていただけますか
Kasun Siyambalapitiya '14 / 12/16

1
git format-patch -1 HEAD最新のコミットのパッチを生成します
Sriram Murali

1
これを尋ねて-2got format-patch -2 HEADgit format-patch HEAD~2
ごめんなさい。そうなると

85

コミット1の後にコミットID 2があるとすると、実行できます。

git diff 2 1 > mypatch.diff

ここで、2と1はSHAハッシュです。


dookehster返信ありがとうございます。つまり、関心のあるコミットの前にあるコミットを見つけるためのスクリプトが必要です。それを回避できることを望んでいました。
elle

11
@elle、いや、あなたはしません- git diff hash^ hash。「ハッシュ^」は、先行するコミットを示します。(しかし、もちろん、manojldsの答えの方が優れています)
J-16 SDiZ '12 / 07/12

2
git show HEAD > mypatch.diffあなたがコミットしている間も同じことをするべきです。
andho 2015

1
@dookehesterは正解ですか、それとも逆ですかgit diff 1 2
Kasun Siyambalapitiya '14 / 12/16

1
これは、差分にバイナリファイルを含めることに失敗します。
stuckj

55

このコマンド(@ Naftuli Tzvi Kayによってすでに提案されている):

git format-patch -1 HEAD

HEAD特定のハッシュまたは範囲に置き換えます。

UNIXメールボックス形式のようにフォーマットされた最新のコミットのパッチファイルが生成されます。

-<n> -最上位のコミットからパッチを準備します。

次に、次の方法でパッチファイルをメールボックス形式で再適用できます。

git am -3k 001*.patch

参照:man git-format-patch


ありがとう!パッチを適用すると、コミットメッセージに[PATCH]が前に付いたコミットが作成されることに注意してください。それは簡単に修正できます
Mike S

2
驚異的な。OP、あなたはこれを受け入れていません、なぜなら...?@MikeSいいえ、git少なくともユーザーが正しい方法で適用した場合は、他のフォーマットされたパッチとは異なります。
underscore_d

2
@MikeS私は実際に理由を調査しませんでしたが、-kフラグ(git am -3)を省略すると、この問題が修正されました(PATCH[0/10]コミットメッセージはありません)。Gitバージョン2.20.1.windows.1
jannis

31
git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

高速でシンプルなソリューション。


5
またgit apply --check patch-file-name、パッチを適用する前に呼び出すことを忘れないでください。これは問題を回避するのに役立ちます。
iamantony 2017

16

(単一コミット)パッチが特定のコミットの上に確実に適用されるようにしたい場合は、新しいgit 2.9(2016年6月)オプションを使用できます git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

Xiaolong Ye( ``)によるcommit bb52995commit 3de6651commit fa2ab86commit ded2c09(2016年4月26日)を参照してください。(による合併Junio C浜野- -72ce3ffをコミット 2016年5月23日)
gitster

format-patch--baseベースツリー情報を記録するための' 'オプションを追加

メンテナーやサードパーティのテスターは、パッチシリーズが適用される正確なベースツリーを知りたい場合があります。git format-patchに ' --base'オプションを教えて、ベースツリー情報を記録し、最初のメッセージ(カバーレターまたはシリーズの最初のパッチ)の最後に追加します。

ベースツリー情報は、他の誰もが取り組むプロジェクト履歴の安定した部分の一部であるよく知られたコミットである「ベースコミット」と、よく知られているゼロ以上の「前提条件パッチ」で構成されます「ベースコミット」の一部ではない、進行中のパッチ。「ベースコミット」の上にトポロジー順に適用してからパッチを適用する必要があります。

「ベースコミット」は「base-commit:」として表示され、その後にコミットオブジェクト名の40 hexが続きます。
「必須パッチ」は「prerequisite-patch-id:」の後に40進数の「パッチID」が続き、「git patch-id --stable」コマンドでパッチを渡すことで取得できます。


Git 2.23(2019年第3四半期)は、 " --base"のオプションが " と互換性のある方法で計算するように更新された不安定な方法で前提条件のパッチをformat-patch計算したpatch-idsため、これが改善されgit patch-id --stableます。

Stephen Boyd()によるcommit a8f6855commit 6f93d26(2019年4月26日)を参照してください。(合併によりJunio C浜野- -8202d12コミットし、2019年6月13日)をakshayka
gitster

format-patch--base patch-id出力を安定させる

patch-id生成コードでハンクを処理するたびにコンテキストをフラッシュしていませんでした diff.cが、 ' patch-id'ツールを使用して「安定した」パッチIDを生成したときにそれを行っていました。

レッツ・ポート同様のロジックそれ以上からpatch-id.cdiff.c私たちは同じハッシュを取得することができるようにする場合「の私たちだ生成パッチ-IDS format-patch --base=コマンド呼び出しの種類」。


Git 2.24(2019年第4四半期)より前git format-patch -o <outdir>は、「mkdir <outdir>」は「mkdir -p <outdir>」ではなく「」と同等でしたが、修正中です。

Bert Wesarg()によるcommit edefc31(2019年10月11日)を参照してください。(合併によりJunio C浜野- -コミットf1afbb0、2019年10月18日)bertwesarg
gitster

format-patch:出力ディレクトリの主要コンポーネントを作成します

サインオフ:Bert Wesarg

'git format-patch -o'は 'mkdir -p'ではなく 'mkdir'と同等でしたが、修正中です。

adjust_shared_permセキュリティに影響を与える可能性がある先頭のディレクトリでの ' ' の使用を避けます。「config.sharedRepository」のように「git init」を一時的に無効にすることで実現しました。


Git 2.25(2020年第1四半期)では、構成変数が設定されていると「git rebaseformat.useAutoBaseが正しく機能しませんでしたが、これは修正されました。

Denton Liu()によるcommit cae0bc0commit 945dc55commit 700e006commit a749d01commit 0c47e06(2019年12月4日)を参照してください。(合併によりJunio C浜野- -71a7de7コミットし、2019年12月16日)をDenton-L
gitster

rebaseformat.useAutoBase破損を修正

報告者:Christian Biesinger
署名者:Denton Liu

ではformat.useAutoBase = true、リベースを実行するとエラーが発生しました。

fatal: failed to get upstream, if you want to record base commit automatically,
please use git branch --set-upstream-to to track a remote branch.
Or you could specify base commit by --base=<base-commit-id> manually
error:
git encountered an error while preparing the patches to replay
these revisions:

ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12

As a result, git cannot rebase them.

これを修正するには、常に--no-baserebaseからformat-patchに渡して、の効果format.useAutoBaseが無効になるようにします。


8

(最後のコミットではなく)特定のコミットからパスを生成するには:

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

5

指定したファイルを比較したいだけなら、次のことができます:

git diff master 766eceb-connections /> 000-mysql-connector.patch


0

私の水銀の背景で私は使うつもりでした:

git log --patch -1 $ID > $file

でも今は使うことを考えてgit format-patch -1 $IDいます。


-5

特定のSHA1に対してのみパッチを生成する方法は何ですか?

それは非常に簡単です:

オプション1。 git show commitID > myFile.patch

オプション2。 git commitID~1..commitID > myFile.patch

注:commitID実際のコミットID(SHA1コミットコード)に置き換えます。


3
オプション1は実に間違っており、質問とは無関係です。
Anshuman Manral

3
オプション2も無効なコマンドです。次のようなエラーが表示されます。「git --help」を参照してください。回答を投稿する前に確認してください
Anshuman Manral 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.