web-dev-qa-db-ja.com

git:複数のコミットにわたって単一のパッチを生成する

これは状況です:

  1. 既存のオープンソースgitリポジトリ(source-repoなど)に基づいて「プライベート」リポジトリ(たとえばour-repo)を作成しました。

  2. 私たちはコードを開発しており、リポジトリに約20のマージがあります。そのため、リポジトリは「State_Initial」から「State_Current」に移動しました。

今、ビジネス上の理由から、すべての開発をサードパーティに引き渡したいと考えています。いくつかの法的問題に基づいて、唯一のオプションは、すべての変更を含む「単一」のパッチファイルを提供することです。これは、「State_Initial」と「State_Current」の間のつぶれたパッチです。

周りを見回して見つけた

git format-patch -X

ただし、「n」個の.patchファイルが生成されます。

単一のパッチファイルを作成する方法はありますか?したがって、「source-repo」に基づいてレポを作成し、パッチを適用すると、「State_Current」に移動しますか?

10
SimpleCoder

次のコマンドは、複数のコミットを含む単一の.patchファイルを作成します。

git format-patch cc1dde0dd^..6de6d4b06 --stdout > foo.patch

その後、次のように適用できます。

git am foo.patch

注:最初のコミットSHAを含める場合は、^..ではなく..を使用してください。

7
aleclarson

単一の squashed commit を持つsquashedという名前の新しいブランチを作成します。このブランチの内容は通常のブランチとまったく同じですが、履歴はありません。

よく見て、満足したらformat-patchパッチファイルを作成します。

$ git checkout -b squashed $(git commit-tree HEAD^{tree} -m 'Squashed history')
$ git format-patch --root HEAD

これは非破壊的な操作であり、後で通常の開発ブランチに戻すことができます。 squashedブランチをtagして、電子メールで送信したものへの参照を保存するか、branch -D不要になったら削除します。

$ git branch -D squashed
0
John Kugelman

何らかの理由で使い捨てブランチを作成し、state_initialstate_currentの間ですべてのコミットを押しつぶしたくない場合は、代わりにgit format-patchを使用します。 state_initialから分岐し、分岐がソース分岐の上にリベースする場合:

git format-patch source_branch <patch_file_name>

git am <patch_file_name>を実行すると、コミットチェーン全体が再構築されません。ただし、このパッチファイルは変更の順次リストになります。複数のコミットにまたがって変更したり元に戻したりした場合でも、誰かがパッチファイルを調べれば、それが表示される可能性があります。

0
Subhamoy S.