という名前のファイルがあります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 commitfoo へのステージングされた変更。git add foo、M2 をステージング エリアに配置します。git commit --amend、M1 を M2 とマージします。これはまさにあなたが求めたものではありませんが、あなたが要求している結果を得る最も効率的な方法だと思います。