私はマスターから2つのブランチを持っています:
- v2.1 : (バージョン 2) 数か月間取り組んできた
- wss : マスターに特定の機能を 1 つ追加するために昨日作成したもの (本番環境)
昨日のコミットを wss から v2.1 にコピーする方法はありますか?
私はマスターから2つのブランチを持っています:
昨日のコミットを wss から v2.1 にコピーする方法はありますか?
使用する
git cherry-pick <commit>
現在のブランチに適用<commit>
します。
gitk
私自身は、選択したコミットをクロスチェックし、代わりにコミットエントリを右クリックしてチェリーピックするでしょう。
より自動化したい場合 (すべての危険を伴う)、昨日以降のすべてのコミットが wss で発生したと仮定すると、git log
( --pretty
Jefromi の提案による)を使用してコミットのリストを生成できます。
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 が提案するようにリベースを使用してください。
マージすることでこれをすべて実行できるワークフローが必要です。
- 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)
その後、マージできます!本当に、本当に、本当にマージできるポイントに到達できない場合でも、リベースを使用して、一度にいくつかのチェリーピックを効果的に実行できます。
# 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 つのブランチをマージしないという意図を意味します (後でマージすることにした場合、競合が発生します)。
または、あなたが伝道者の側に少し少ない場合は、私が使用している少し醜い方法を行うことができます。deploy_templateには、ブランチデプロイとしてマスターにコピーしたいコミットがあります
git branch deploy deploy_template
git checkout deploy
git rebase master
これにより、deploy_templateに新しいブランチデプロイが作成され(-fを使用して既存のデプロイブランチを上書きします)、この新しいブランチをマスターにリベースし、deploy_templateは変更されません。