私は私のマスターから2つの枝を持っています:
昨日のコミットをwssからv2.1にコピーする方法はありますか?
あなたは本当にマージすることによってこれをすべて行うことを可能にするワークフローを持つべきです:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
だからあなたがしなければならないのはgit checkout v2.1
とgit 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つのブランチをマージしないという意図を意味します(後でやりたいと決心した場合は、競合が発生します)。
つかいます
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が提案するようなリベースを使用してください。
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
ワークフローの例:
cherry-pick
は options と共に使用できます。
-e or --edit:このオプションを指定すると、git cherry-pickはコミットする前にコミットメッセージを編集させます。
-nまたは--no-commit:通常、このコマンドは自動的に一連のコミットを作成します。このフラグは、コミットを行わずに、作業ツリーとインデックスへの各名前付きコミットを選択するために必要な変更を適用します。さらに、このオプションを使用すると、インデックスはHEAD commitと一致する必要はありません。チェリーピックは、インデックスの最初の状態に対して行われます。
ここで興味深い 記事cherry-pick
について。
あるいは、あなたが福音伝道者の側にいることが少しでも少ないならば、私が使っている少し醜いやり方をすることができます。 deploy_templateでは、ブランチデプロイとしてマスターにコピーしたいコミットがあります。
git branch deploy deploy_template
git checkout deploy
git rebase master
これにより、deploy_template上に新しいブランチデプロイ(既存のデプロイブランチを上書きするために-fを使用します)が作成され、この新しいブランチがmasterにリベースされ、deploy_templateは変更されません。
最後のコミットをwssのブランチからv2.1にコピーするだけの簡単な場合は、コミットID(git log --oneline | head -n 1
)を取得して以下のようにします。
git checkout v2.1
git merge <commit>