36

SVN から Git にインポートしたので、次のような大きなブランチが 1 つあります。

  • 機能 C に取り組む
  • 機能 B に取り組む
  • 機能 C に取り組む
  • 機能 C に取り組む
  • 機能 B に取り組む
  • 機能 A に取り組む

A、B、C 用に個別のフィーチャー ブランチが必要です。新しいブランチへのコミットをチェリー ピッキングしていますが、元のブランチからは削除されないため、引き出したブランチを手動で追跡する必要があります。

分割するコミットは約 800 件あり、おそらく 50 件の機能/バグ修正があります。

引き出したものをこのように git ログに何らかの形で反映させるとよいので、既に行ったものがわかります。これは可能ですか?

引き出したコミットをスキップして、ブランチ全体をリベースできますが、これにより多くの競合が発生するのではないかと心配しています。コミットを引き出すたびに 500 件の競合を解決したくありません。

進行状況を追跡しながら、1 つの uber ブランチから小さな機能ブランチにコミットを引き出す最良の方法は何ですか?

4

6 に答える 6

41

この場合、私が行うことは、インタラクティブなリベースを使用することです。

HEAD、ブランチ、、、を作成ABますCbackupまた、問題が発生して元のバックアップが必要になった場合に備えて、「バックアップ」ブランチを作成します(名前を付けることができます) HEAD

git branch feature-a
git branch feature-b
git branch feature-c
git-branch backup-before-rebase

次に、開始するコミットで、おそらく便利な安定したコミットでブランチを作成します。new_trunkそれか何かと呼んでください。

git checkout HEAD~50       ## this will be the new tree-trunk
git branch new_trunk

次に、インタラクティブを実行rebaseし、そのブランチに保持するコミットを選択します。このように使用すると、基本的cherry-pickにはまとめて使用するようなものです。

git checkout feature-a
git rebase -i new_trunk    ## -i is for "Interactive"

完了したら、から始まる個別の履歴を持つ3つのブランチと、まだ必要な場合は古いものを反映new_trunkするブランチが必要です。backupHEAD

于 2012-09-22T08:20:13.897 に答える
10

個人的には、このような大きな変更の長所と短所を実際に検討します (既にこれを行っている場合はもう一度)。競合が発生した場合 (大規模なリベース/チェリー ピックが面倒で、それだけでは解決が困難です)、機能を「マスター」ブランチにマージするときにおそらく苦労するでしょう。

大きなブランチを凍結し、「完了」(または「十分」) し、新しい機能ブランチを作成する方が良い/簡単ではないでしょうか? (または、一部のブランチのみを除外しますか?)

しかし、あなたの質問に:

変更やコミットの欠落を自動的に追跡したい場合は、git cherry コマンドを使用します。

git cherry featureBranch bigBranch

機能ブランチのチェリーピッキングまたはリベース中に競合がなかった場合は、パイプを追加して以前のコードを使用できます。

git cherry featureBranch bigBranch | awk '{ print "pick " $2 }' | tee remaining

これにより、featureBranch にないコミットが出力されます (そして「remaining」という名前のファイルに保存されます)。これを bigBranch の対話型リベースに追加して、不要になったコミットを破棄できます。(「ed」エディターを git エディターとして使用し、コマンドを対話型リベースの標準入力に渡すことで、さらにスクリプトを作成できるかもしれませんが、試していません。)

于 2012-09-22T09:06:51.033 に答える
2

私が見つけた別の方法は、「git notes」を使用することです。

http://alblue.bandlem.com/2011/11/git-tip-of-week-git-notes.html

この機能により、ブランチを実際に変更したり、リベースを必要としたりすることなく、既存のコミットにコメントを追加できます。どのコミットが引き出されたかを追跡する方法の 1 つは、それぞれに git ノートを追加することです。

Cherry-picked to features\xyz 925a5239d4fbcf7ad7cd656020793f83275ef45b

これは、大部分が手動のプロセスで役立つ可能性があります。小さなスクリプトを記述して、特定のブランチへのコミットを選択し、関連する git ノートを元のコミットに戻すことができます。

または、本当にファンキーになりたい場合は、次の方法でプロセス全体を自動化できます。

  1. すべてのコミットに git ノートを追加し、チェリーピックしたいフィーチャー ブランチを指定します。TOCHERRYPICK: features\xyz
  2. すべての git ノートをスキャンするスクリプトを作成し、すべてのフィーチャー ブランチを自動的に作成し、選択された正しいコミットをチェリー ピックします。次に、git ノートを に変更して、CHERRYPICKED: features\xxx at 925a5239d4fbcf7ad7cd656020793f83275ef45b後でツールを再実行してより多くのコミットを選択できるようにすることができます。
  3. コミットがチェリーピックされたときに目立つようにしたい場合は、同様の名前のタグの作成を自動化することもできます。CHERRYPICKED:<branch>:SHA
于 2015-11-04T12:09:56.220 に答える
0

// 開発ブランチで

git diff develop your/branch > diff.patch
git apply diff.patch
于 2021-05-17T05:28:40.227 に答える