961

私はマスターから2つのブランチを持っています:

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

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

4

11 に答える 11

1168

使用する

git cherry-pick <commit>

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

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


より自動化したい場合 (すべての危険を伴う)、昨日以降のすべてのコミットが wss で発生したと仮定すると、git log( --prettyJefromi の提案による)を使用してコミットのリストを生成できます。

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 が提案するようにリベースを使用してください。

于 2010-03-19T01:22:45.007 に答える
692

マージすることでこれをすべて実行できるワークフローが必要です。

- 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 wsswss を 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 つのブランチをマージしないという意図を意味します (後でマージすることにした場合、競合が発生します)。

于 2010-03-19T00:59:27.757 に答える
26

コピーするコミットからパッチを作成し、そのパッチを宛先ブランチに適用できます

于 2010-03-19T00:55:56.673 に答える
14

または、あなたが伝道者の側に少し少ない場合は、私が使用している少し醜い方法を行うことができます。deploy_templateには、ブランチデプロイとしてマスターにコピーしたいコミットがあります

git branch deploy deploy_template
git checkout deploy
git rebase master

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

于 2011-12-14T22:18:31.993 に答える