4

Git には、多くの頭を 1 つにマージできる、大々的に宣伝されている (?) octopus-merge 機能があります。

しかし、1 つのノードから複数のブランチを同時に作成するという、正反対のことを行うものはありますか?

プロジェクト用のコードがたくさんあり、Git を使い始めたとしましょう。一部の機能はそのプロジェクトで完成していますが、他の機能はまだ進行中です。私が望むのは、これらの未完成の機能をそれぞれ個別のブランチに移動し、未完成のコードなしでマスターを可能な限り「完全」にすることです。

もちろん、これらすべてを 1 つの手順で行うこともできます。「未完成の機能 #1」ブランチを作成し、その機能に固有のファイルをマスターから削除します。次に、マスターを「未完成の機能 #2」に再分岐し、機能 #2 固有のファイルをマスターから削除しますが、最初の分岐からも削除します。したがって、私が行う分割ごとにワークロードが増加します。

そのようなシナリオで私を助ける何かがありますか?

4

2 に答える 2

11

補足:タコのマージタコの分岐点のシナリオは大きく異なります。コミットの DAG (有向非巡回グラフ) 内のポインターは、子 (新しいコミット) から親または親を指すことに注意してください。したがって、タコのマージの場合、2 つ以上の親を持つコミット (コミット オブジェクト) があります。「octopus branchpoint」の場合、親と同じコミットを指すコミットがいくつかあるだけです。

タコのマージ:

1 <---- M
2 <----/ |
3 <------|

タコ分岐点:

P <----- 1
^-------- 2
^-------- 3

したがって、この質問の命名は単に間違っていると思います


答え

ここで、作業領域の変更を異なるブランチ間で分割し、各機能を個別のトピック ブランチに配置する場合は、Gitで明示的なステージング エリア(別名インデックス)を利用できます。

2 つのファイル 'a' と 'b' を変更し、ファイル 'a' の変更をブランチ 'A' に移動させ、ファイル 'b' の変更をブランチ 'B' に移動させたいとします。あなたが現在いるブランチ、あなたが作成したい多くのブランチのベースにしたい分岐点の名前が「マスター」であると仮定しましょう。

まず、ブランチ「A」を作成しましょう

$ git checkout -b A master

Git は次のように応答します。

M       a
M       b
Switched to a new branch "A"

「M」は、ファイル「a」および「b」が、ブランチ「A」の基になったポイント(「マスター」ブランチ)に関して変更されていることを意味します。(以下では、コマンドライン呼び出しの下に単に git 応答を配置します。応答とは何かを個別に示すのではありません。)

ファイル 'a' の内容をステージング領域 (インデックス) に追加してみましょう。

$ git add a

ファイル 'a' の変更のサブセットのみをブランチ 'A' に追加する場合は、"git add --interactive" (略して "-i") または "git gui" を使用して per-ステージング領域への変更のハンク追加およびその他のそのような操作。

次に、ブランチ「A」に変更をコミットします

$ git commit
Created commit 35d0061: Commit description...
 1 files changed, 1 insertions(+), 0 deletions(-)

git-commit に「-a」オプションを使用していないことに注意してください。

ちなみに、ステージング領域からコミットする前に変更をテストしたい場合は、「git stash save --keep-index」を使用して、「git commit」を使用してコミットする状態の作業領域を取得し、変更をテストしてから、 「git stash pop --index」(または「git stash pop」。ここでどれが必要か覚えていません) を使用して前の状態に戻ります。

ここで、ブランチ「マスター」に基づいて、別のブランチ、ブランチ「B」を作成します。

$ git checkout -b B master
M       b
Switched to a new branch "B"

ブランチ 'B' に残した変更 (ブランチ 'A' にコミットしなかった変更) が、新しく作成されたブランチ 'B' に移動することが簡単にわかります。ファイルを削除したり、変更を削除したりする必要はありません。他のブランチに何があるかを知る必要はありません。すべてが自動です。
もう一度、ファイル 'b' の内容をステージング領域 (インデックス) に追加し、ブランチ 'B' でコミットします。

$ git add B
$ git commit

これは必要に応じて何度でも繰り返すことができ、新しいブランチでは難しくなりません。

HTH

于 2009-01-14T18:16:29.513 に答える