4

Often I have a bunch of changes in my working copy that I would like to commit to different new branches, like this:

    o   third
  o |   second
o | |   first
| | |
\ | /
  o     base

What I do then is:

  • (on the "base" branch)
  • create the first branch
  • stage and commit a part of the changes
  • stash the rest of the changes
  • check out the base branch
  • apply the stash
  • create the second branch
  • stage and commit the next part of the changes
  • stash the rest of the changes
  • ...

Git wouldn't just let me check out the base branch without stashing the rest of the changes, even though it wouldn't (and I think cannot) create a conflict.

Is there an easier way to do this?

4

2 に答える 2

1

あなたの質問では、マージの競合を予期しないと書いています。でのテストgit checkoutはより保守的です。現在のブランチと宛先ブランチでローカルに変更されたファイルのオリジナル(つまり、コミットされたもの) はまったく異なるでしょうか?

first以下を実行してブランチを作成した後

$ git checkout -b 最初

$編集 ..

$ git add -p .

$ git commit -m 最初
 1 ファイル変更、1 挿入 (+)、0 削除 (-)

次のようなエラーが表示される可能性があります

$ git チェックアウト ベース
エラー: 次のファイルへのローカルの変更は、によって上書きされます
チェックアウト:
        [ファイル..]
ブランチを切り替える前に、変更をコミットするか、隠しておいてください。
中止しています

に戻そうとしたときbase

この種の状況で機能する--mergeオプション。git checkout

-m
--merge

ブランチを切り替えるときに、現在のブランチと切り替え先のブランチとの間で異なる 1 つ以上のファイルにローカルで変更を加えている場合、コマンドは変更をコンテキストに保持するためにブランチの切り替えを拒否します。ただし、このオプションを使用すると、現在のブランチ、作業ツリーの内容、および新しいブランチの間で 3 方向のマージが行われ、新しいブランチになります。

マージの競合が発生すると、競合するパスのインデックス エントリはマージされずに残されるため、競合を解決し、解決されたパスにマークを付ける必要がありますgit add(またはgit rm、マージによってパスが削除される場合)。

走るgit checkout -m baseと、最初の場所に戻りますが、おそらくあなたが望んでいるよりも先に進みます。およびbaseに対する変更だけでなく、すべての編集内容を含むブランチに移動します。コミットごとに、変更を段階的に減らすのではなく、他の 2 つのブランチの変更を破棄する必要があります。secondthird

于 2013-11-12T18:03:47.413 に答える