私はマスターから2つのブランチを持っています:
- v2.1:(バージョン2)数か月間取り組んできました
- wss:特定の機能をマスターに追加するために昨日作成した(運用中)
昨日のコミットをwssからv2.1にコピーする方法はありますか?
私はマスターから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)
その後、マージできます!本当に、本当に、本当にマージできるポイントに到達できない場合でも、リベースを使用して、一度に複数のチェリーピックを効果的に実行できます。
# 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-svn-id
参照を削除してから、dcommit
再度実行しました。私はおそらくチェリーピックのステップを省略して、リベースを単独で使用しただけかもしれません。
使用する
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
ここで問題が発生した場合(潜在的な可能性がたくさんあります)、これはライブチェックアウトで機能するので問題があります。
git rebase
、私の答えで使用する方法はより堅牢であることも指摘しておきます。特に、このようなforループを使用すると、チェリーピックの1つが失敗した場合でも、残りのすべてを実行しようとします。これは...非常に良くない、としましょう。
git
解答に対して単純で正解な答えであり、回答者がそれをどれだけよく知っているかを証明するためにgitの複雑さを蛇行するのではなく。
git cherry-pick
:既存のコミットによって導入された変更を適用します
(X、Y、Z)コミットのブランチAがあるとします。これらのコミットをブランチBに追加する必要があります。cherry-pick
オペレーションを使用します。
を使用する場合、ブランチAにコミットが表示されるのと同じ時系列cherry-pick
でブランチ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
とオプション
-eまたは--edit:このオプションを使用すると、git cherry-pickを使用すると、コミットする前にコミットメッセージを編集できます。
-nまたは--no-commit:通常、コマンドは一連のコミットを自動的に作成します。このフラグは、コミットを行わずに、名前付きの各コミットを作業ツリーとインデックスにチェリーピックするために必要な変更を適用します。さらに、このオプションを使用する場合、インデックスはHEADコミットと一致する必要はありません。チェリーピックは、インデックスの初期状態に対して行われます。
ここに興味深い記事がありcherry-pick
ます。