2012-10-12 9 views
10

最近、よりも入力しやすいので、git show <hash>を使って差分を作成しました。コミット情報(タイムスタンプ、ユーザ、ハッシュ、コメント)。 git apply <filename>を使用してパッチを適用できます。`git show`を使用して複数のコミットにまたがってパッチを作成して適用する

私は、git show -3に最後の3つのコミットと同じ追加情報が表示されることを発見しました。ただし、git applyは、すべてを作業ディレクトリにステージングされていない変更としてスクラッシュし、すべてのコミット情報を失います。

gitにその情報をすべて適用するものがありますか?パッチを3つのファイルに分割し、それらを個別に適用し、新しいコミットを作成するよりも、フラグを渡すほうがずっと簡単です。

答えて

5

git format-patchを使用すると、メタデータ(メッセージ、作成者など)を含めて、コミットを表すMIME電子メールを生成できます。 git amでこれらを再適用することができます。

したがってgit format-patch HEAD~3は、最後の3回のコミットに対して3つのパッチを生成し、これらのすべてをgit amにパイプすることができます。よりシンプルにしたい場合は、git format-patch --stdout HEAD~3はMIMEメッセージをstdoutに送ります。そのため、3つの別々のファイルを扱う代わりに、必要な場所にパイプすることができます。

もちろん、後で参照するためにコミットを保存しようとしている場合は、タグ付けするだけです。 git cherry-pickを使用して、そこからコミットを再適用できます。

+0

これが動作するように私が持っているでしょうが、それは、見えますgit showを使って既に行ったパッチをもう一度やり直してください。私はおそらく今よりも簡単にするためにformat-patchを使い始めるでしょう。 私が 'git cherry-pick'を使用しているだけではない理由は、私は新しいdevサーバーに移動していて、本質的にgitで読み取り専用アクセス権を持っているからです。すべてのコードディレクトリをscpするのではなく、コピーするパッチを作るだけです。 – redbmk

1

try git bundle履歴の特定の部分を送信します。

3

のLinuxにすることができますパイプあなたのデルタジェネレータgit-applyコマンドを使用して、インスタンスの --- git-showまたはgit-diff、---。

(常に3-wayが-3オプションでマージ可能にするためにも、より安全な可能性がある)

> git show <sha1> [<path>] | git apply -3 
> git diff <sha1-a> <sha1-b> [<path>] | git apply -3 

例:

  • は ABCDEF で行われた特定のファイルの編集を適用します。
> git show abcdef dir/file.c | git apply -3 

> git diff abcdef 123456 foo.h | git apply -3

参照 ABCDEF二つの異なるコミットのファイルに違いを適用し、 :https://stackoverflow.com/a/12320940/1329340

関連する問題