1. ホーム
  2. ギット

[解決済み] ある範囲のコミットを選んで、別のブランチにマージする方法は?

2022-03-23 08:55:17

質問

以下のようなリポジトリレイアウトがあります。

  • master ブランチ (本番)
  • 統合
  • 作業

私が実現したいのは、workingブランチからある範囲のコミットをチェリーピックして、integrationブランチにマージすることです。私は git の初心者ですが、リポジトリを混乱させることなくこれを正確に行う方法 (マージではなく、コミット範囲のチェリーピック) を見つけることができません。この件に関して何かご指摘やご意見はありませんか?ありがとうございます。

解決方法は?

さまざまなコミットがある場合、チェリーピック でした 実用的ではない

として 以下のとおりです。 によって キース・キム Git 1.7.2 以降では、コミットの範囲をチェリーピックする機能が導入されました (しかし、まだ チェリーピックが将来のマージに与える影響 )

git cherry-pick"は、コミットの範囲を選択することを学びました。

(例: " cherry-pick A..B "と " cherry-pick --stdin ")もそうですが、" git revert これらは、より良いシーケンス制御 " をサポートしていません。 rebase [-i] "が持っていますが。

ダミアン コメント と警告を発しています。

で、"。 cherry-pick A..B "形式です。 A よりも古い必要があります。 B .

もし順番を間違えると、コマンドは黙って失敗します。 .

を選びたいなら 範囲 B を通して D (を含む B ) ということになります。 B^..D (代わりに B..D ).

"をご覧ください。 Git は、以前のコミットの範囲からブランチを作成しますか? "を図解しています。

として Jubobs 記載事項 コメントで :

これは、次のように仮定しています。 B がルートコミットでない場合は、" が表示されます。 unknown revision そうでない場合はエラーになります。

注意:Git 2.9.x/2.10 (Q3 2016) より、オーファンブランチ (空の頭) で直接コミットの範囲をチェリーピックできるようになりました:" を参照してください。 gitで既存のブランチを孤児にする方法 となります。


当初の回答(2010年1月)

A rebase --onto のように、指定した範囲のコミットを統合ブランチの上で再生させるのがよいでしょう。 チャールズ・ベイリー氏は次のように説明しています。 .

(また、"あるブランチに基づくトピックブランチを別のブランチに移植する方法を示します"の中にあるものを探してください。 git rebase のマニュアルページ の実用的な例を見ることができます。 git rebase --onto )

現在のブランチがintegrationの場合。

# Checkout a new temporary branch at the current location
git checkout -b tmp

# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range

# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration

これで間のすべてを再生します。

  • の親の後に first_SHA-1_of_working_branch_range (そのため ~1 ): リプレイしたい最初のコミット
  • までなら"です。 integration "(再生したい最後のコミットを指しています。 working ブランチ)

を"に変更しました。 tmp を指しています。 integration を指していた)

これらのコミットのいずれかが再生されたときに競合が発生した場合。

  • 解決して " を実行するか。 git rebase --continue "です。
  • または、このパッチをスキップして、代わりに " を実行してください。 git rebase --skip をクリックします。
  • または、"で全てをキャンセルします。 git rebase --abort "(そして integration ブランチを tmp ブランチ)

その後 rebase --onto , integration は統合ブランチの最後のコミットに戻ります (つまり、" tmp "ブランチ + リプレイされたすべてのコミット)

チェリーピックを使用したり rebase --onto のように、後続のマージに影響を与えることを忘れないでください。 ここに記載されている .


純粋な"です。 cherry-pick "ソリューションとは こちら というようなものです。

パッチのアプローチを使いたい場合は、"git format-patch|git am" と "git cherry" が選択肢となります。

現在 git cherry-pick は単一のコミットしか受け付けませんが、範囲を指定したい場合は B を通して D ということになります。 B^..D は、git の専門用語で

git rev-list --reverse --topo-order B^..D | while read rev 
do 
  git cherry-pick $rev || break 
done 

しかし、いずれにせよ、ある範囲のコミットを "replay" する必要がある場合、 "replay" という単語は " を使用することを後押ししてくれるはずです。 rebase "というGitの機能です。