web-dev-qa-db-ja.com

あるブランチから別のブランチにコミットをコピーするにはどうすればいいですか?

私は私のマスターから2つの枝を持っています:

  • v2.1 :(バージョン2)私は数ヶ月間取り組んできました
  • wss :昨日作成したマスターに特別な機能を追加するためのもの(本番中)

昨日のコミットをwssからv2.1にコピーする方法はありますか?

610
Bob Walsh

あなたは本当にマージすることによってこれをすべて行うことを可能にするワークフローを持つべきです:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

だからあなたがしなければならないのはgit checkout v2.1git merge wssだけです。何らかの理由で本当にこれができず、 git rebase を使ってあなたのwssブランチを正しい場所に移動させることができない場合、どこかから単一のコミットを取得して他の場所に適用するコマンドは です。 git cherry-pick 。適用したいブランチをチェックアウトしてgit cherry-pick <SHA of commit to cherry-pick>を実行してください。

リベースの方法のいくつかはあなたを救うかもしれません:

あなたの歴史がこのように見えるなら:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

git rebase --onto v2 v2-only wssを使用してwssを直接v2に移動できます。

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

それからあなたはマージすることができます!本当に本当にreallyがマージできるようにならない場合でも、rebaseを使って一度に複数のチェリーピックを効果的に行うことができます。

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

注意:これを行うために余分な作業が必要になるのは、リポジトリにコミットが重複して作成されるためです。これは本当に良いことではありません - 簡単な分岐とマージのすべてのポイントは、コミットを1か所にしてそれらを必要な場所にマージすることによってすべてを実行できるようにすることです。コミットが重複しているということは、これら2つのブランチをマージしないという意図を意味します(後でやりたいと決心した場合は、競合が発生します)。

488
Cascabel

つかいます

git cherry-pick <commit>

現在のブランチ <commit>を適用する。

私は自分がgitkで選択したコミットをクロスチェックし、代わりにそこにあるコミットエントリを右クリックしてそれらをチェリーピックするでしょう。


もっと自動化して(危険をともなって)昨日以降の全てのコミットをwssで行ったと仮定した場合、git log with(Jefromiが提案する--pretty)を使ってコミットのリストを生成することができます。

git log --reverse --since=yesterday --pretty=%H

bashを使っていると仮定してすべて一緒に

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

ここで何か問題が発生した場合(多くの可能性があります)、これはライブチェックアウトで機能するので問題を抱えています。手動のチェリーピックを行うか、Jefromiが提案するようなリベースを使用してください。

788

git cherry-pick:いくつかの既存のコミットによって導入された変更を適用する

(X、Y、Z)コミットのあるブランチ _ a _ があるとします。これらのコミットをブランチ _ b _ に追加する必要があります。 cherry-pickオペレーションを使います。

cherry-pickを使うとき、コミットがBranch _ a _ に現れるのと同じ年代順にbranch _ b _ にコミットを追加するべきです。

cherry-pickは一定範囲のコミットをサポートしていますが、その範囲のマージコミットがある場合、それは本当に複雑になります

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

ワークフローの例:

enter image description here

cherry-pickoptions と共に使用できます。

-e or --edit:このオプションを指定すると、git cherry-pickはコミットする前にコミットメッセージを編集させます。

-nまたは--no-commit:通常、このコマンドは自動的に一連のコミットを作成します。このフラグは、コミットを行わずに、作業ツリーとインデックスへの各名前付きコミットを選択するために必要な変更を適用します。さらに、このオプションを使用すると、インデックスはHEAD commitと一致する必要はありません。チェリーピックは、インデックスの最初の状態に対して行われます。

ここで興味深い 記事cherry-pickについて。

36
Lyes CHIOUKH

あなたがコピーしたいコミットから パッチを作成する そしてコピー先のブランチに パッチを適用する とできます。

15
Charles Ma

あるいは、あなたが福音伝道者の側にいることが少しでも少ないならば、私が使っている少し醜いやり方をすることができます。 deploy_templateでは、ブランチデプロイとしてマスターにコピーしたいコミットがあります。

git branch deploy deploy_template
git checkout deploy
git rebase master

これにより、deploy_template上に新しいブランチデプロイ(既存のデプロイブランチを上書きするために-fを使用します)が作成され、この新しいブランチがmasterにリベースされ、deploy_templateは変更されません。

9
Petr Sykora

最後のコミットをwssのブランチからv2.1にコピーするだけの簡単な場合は、コミットID(git log --oneline | head -n 1)を取得して以下のようにします。

git checkout v2.1
git merge <commit>
0
zeroimpl