機能ブランチのモノリスがあります。マスターへの1つの大規模なPRの代わりに、3つの部分に分割したいと思います。
理想的には、機能ブランチからスタンドアロンコードをそれ自体でPRに引き出したいです。このコードは新しいディレクトリにあり、まだ呼び出されていないため、比較的安全なPRになります。ただし、ディレクトリをコピーして単一のコミットとPRを作成するのではなく、新しいPRの変更のすべてのコミット履歴を保持したいと思います。
これはGitを使用して可能ですか?私はフィルターブランチを調べましたが、それはリポジトリを2つに分割するためのものであり、変更の差分を2つに分割するためのものではないようです(それが理にかなっている場合)。
コミット履歴を含むファイルをブランチから新しいブランチにプルする方法はありますか?
commitをプルします。これは、一部のファイルだけでなく、リポジトリ全体をブランチに入れることを意味します。
良いオプションの1つは、不要なファイルを事前ブランチのコンテンツにリセットすることです。
--x--x--x (master)
\
y--y--y (branch B1 with mixed work)
\
z (new branch B2, but with some files reset to master)
B2
はB1
から始まり、必要なファイルとその履歴を含めます。
しかし、B2
には、master
にしたいB1
の他のファイルも含まれます。
(B2
で)a git reset --soft master
を実行できます。git status
は、インデックスがマスターを反映するために必要なすべての変更を通知します。保持したいファイルに関連する変更を追加しないでください。
そしてコミットしないでください。 someファイルの変更をmaster
に段階的に戻したいだけです。
(「 git reset --soft
?の実際の使用法 」も参照)
それが完了すると、git reset --soft B2
はHEADに戻ってB2
に戻ります(ただし、適切なファイルのマスターを反映するために必要なすべての変更と削除を記録するインデックスが付いています)。
他のファイルをmaster
に戻し、変更を加えずに履歴を変更せずにB1
と同じにして、今すぐコミットできます。
Githubプルリクエストは常にブランチに関係します。 「プルリクエストを分割する」場合は、それがコミットに十分に分割されていることを確認してから、実行するプルリクエストごとにブランチを作成し、そのような各機能ブランチに関連するすべてのコミットがあることを確認します。
メインブランチの隣に3つのブランチを作成し、各ブランチへの関連するコミットをチェリーピックし、メインでそれらを削除し、3つのブランチのそれぞれとメインマージすることは良い戦略のようです。次に、各ブランチのPRを作成し、履歴を共有することもできます。
これが私の推奨する解決策ですが、この場合はgit履歴が失われます。本当に保持したい場合は、それをコピーして個々のPRのコミットメッセージに貼り付けるだけです。
私は通常、変更されたファイルのリストを確認し、個別のPRに属する変更のセットごとに.patchファイルを作成します。この場合、これはディレクトリごとに変更を分離する非常に簡単な方法です。
たとえば、次の例では、README.mdファイルとusers_controllers.rbファイルに変更を加え、viewsディレクトリ内のすべてのファイルを一致ファイルに入れて、新しいブランチに適用できます。その後、新しいPRを作成できます。
まず、大きすぎるPRでブランチをチェックアウトし、次に
git diff master head -- README.md app/controller/users_controller.rb app/views > first_group_of_changes.patch