という名前のファイルがありますfoo
。私はそれにいくつかの変更M1
を加えてfoo
ステージングします。次に、 からチェックアウトして作業ツリーに戻し、HEAD
別の変更M2
を加えます。ここで、コミットする前にこれら 2 つの変更をマージします。これはどのように行うことができますか?ありがとう!
(ブランチがこの種の作業用であることは知っていますが、ステージングされたファイルを作業ツリーの変更されたバージョンとマージする方法があるかどうかを知りたいです。)
という名前のファイルがありますfoo
。私はそれにいくつかの変更M1
を加えてfoo
ステージングします。次に、 からチェックアウトして作業ツリーに戻し、HEAD
別の変更M2
を加えます。ここで、コミットする前にこれら 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"
対処するブランチはありません。
最も明白な解決策は、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-index
、git rebase was-in-index
、またはあなたは何を持っていますか。was-in-index
完了したら、ブランチを削除できます。
最も簡単な方法は、4 ステップのプロセスです。
git commit
foo へのステージングされた変更。git add foo
、M2 をステージング エリアに配置します。git commit --amend
、M1 を M2 とマージします。これはまさにあなたが求めたものではありませんが、あなたが要求している結果を得る最も効率的な方法だと思います。