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

StackOverflow https://stackoverflow.com/questions/2474353

  •  21-09-2019
  •  | 
  •  

質問

マスターから 2 つのブランチを受け取りました。

  • v2.1:(バージョン 2) 数か月間取り組んできました
  • うす:昨日、マスター (運用環境) に 1 つの特定の機能を追加するために作成したもの

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

役に立ちましたか?

解決

実際には、以下をマージすることでこれらすべてを実行できるワークフローが必要です。

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

それであなたがしなければならないのは git checkout v2.1 そして git merge wss. 。何らかの理由で本当にこれができず、使用できない場合は、 gitリベース wss ブランチを適切な場所に移動するには、どこかから単一のコミットを取得して、それを別の場所に適用するコマンドは次のとおりです。 git チェリーピック. 。適用したいブランチをチェックアウトして実行するだけです 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 cherry-pick <commit>

あなたの現在のブランチのに<commit>を適用します。

私自身は、おそらく私がgitkに選んで、代わりにそこにコミットエントリを右クリックして、それらを桜選ぶコミットをクロスチェックします。

<時間>

あなたがより多くの(すべての危険性を持つ)自動と昨日は、WSSに起こったので、あなたは(Jefromiによって提案git log)で--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) コミットを使用します。これらのコミットをブランチに追加する必要があります B. 。使用するのは、 cherry-pick オペレーション。

使用するとき cherry-pick, 、ブランチにコミットを追加する必要があります B コミットがブランチに表示されるのと同じ時系列順 .

チェリーピックはコミットの範囲をサポートしますが、その範囲にマージコミットがある場合、非常に複雑になります

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-pickオプション

-e または --edit :このオプションを使用すると、git Cherry-pick でコミット前にコミット メッセージを編集できるようになります。

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

ここに興味深いものがあります 記事 について cherry-pick.

あなたはコピーしたいコミットからパッチを作成し、先のブランチにパッチを適用します。

か、エバンジェリストの側に少しある場合は、私が使用している少し醜い方法を行うことができます。 deploy_templateでは、私は枝展開

としての私のマスターにコピーしたいのコミットがあります
git branch deploy deploy_template
git checkout deploy
git rebase master

このはそのままdeploy_template残し、その後、マスター上にこの新しいブランチをリベース、deploy_templateに(私は支店を展開、既存の上書きするには、-fを使用して)新しいブランチ展開を作成します。

ちょうどV2.1への分岐WSSから最後のコミットをコピーする簡単なケースでは、あなたは、単にコミットID(git log --oneline | head -n 1を)つかむと行うことができます:

git checkout v2.1
git merge <commit>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top