1

という名前のファイルがありますfoo。私はそれにいくつかの変更M1を加えてfooステージングします。次に、 からチェックアウトして作業ツリーに戻し、HEAD別の変更M2を加えます。ここで、コミットする前にこれら 2 つの変更をマージします。これはどのように行うことができますか?ありがとう!

(ブランチがこの種の作業用であることは知っていますが、ステージングされたファイルを作業ツリーの変更されたバージョンとマージする方法があるかどうかを知りたいです。)

4

3 に答える 3

2

最善の方法は、隠しておくことです。

# modify file
git stash -u
# modify file in a different way
git add -A && git commit -m "M2"
git stash pop
# resolve conflicts
git add -A && git commit --amend -m "M1 and M2 merged"

対処するブランチはありません。

于 2012-10-31T06:12:49.273 に答える
1

最も明白な解決策は、2 つのコミットを作成し、それらをマージすることです。変更を 2 つの異なるコミットに入れると、それらを失うのはかなり難しく、マージが思い通りに進まない場合は、マージ コミットを破棄して再試行できるため、これはかなり安全です。

最初のコミットでは、すでに変更がステージングされているので、それだけgit commitで十分です。

2 つ目は、元の への変更を表す作業コピーの状態ですHEAD。しかし、そのコミットを行ったので、その間に 1 つのコミットがあります。HEADはインデックスにあったものなので、作業コピーがそれらの変更を元に戻しているようです。これを回避するにHEADは、作業コピーの内容を変更せずに、ポイントをリセットする必要があります。

HEADそうする前に、現在の:へのポインタを保存しましょうgit branch was-in-index。これで、 を使用して以前のHEAD( の親HEAD) にリセットし、git reset HEAD^変更を追加してコミットできますgit add some stuff; git commit(またはgit commit -a、すべての変更が必要な場合は )。

これで 2 つのブランチができました。作業コピーからの変更を含む現在のものとwas-in-index、インデックスにあった変更を含む です。これで、必要に応じてこれらをマージできます。git merge was-in-indexgit rebase was-in-index、またはあなたは何を持っていますか。was-in-index完了したら、ブランチを削除できます。

于 2012-10-31T05:18:19.683 に答える
0

最も簡単な方法は、4 ステップのプロセスです。

  1. git commitfoo へのステージングされた変更。
  2. foo を変更し、M1 の上に M2 を追加します
  3. git add foo、M2 をステージング エリアに配置します。
  4. git commit --amend、M1 を M2 とマージします。

これはまさにあなたが求めたものではありませんが、あなたが要求している結果を得る最も効率的な方法だと思います。

于 2012-10-31T04:44:57.037 に答える