2013-02-22 17 views
10

質問:
ステージングエリアにファイルを追加しました。私はこの情報を一時的に保存したいと思います。の仕方?ステージング領域の現在の状態を保存する方法は?

背景:
時々私はいくつかの大きなリファクタリングを行います。完全な結果をコミットするのは本当に理にかなっています。
このリファクタリング中に、私は独立してコミットしたい無関係な変更も行います。
たとえば、リファクタリングはメソッドの名前を変更しました。関連のない変更は、同じクラスの別のメソッドの1つのパラメータでスペルミスを修正しました。
無関係の変更の1つをあらかじめコミットすることを忘れてしまった場合、既にステージング領域にほとんどのファイルを追加したとします。
ファイルをステージング領域に追加するには時間がかかります。なぜなら、すべての単一ファイルをチェックして、私が本当に必要なものをコミットしていることを確認するからです。したがって、ステージング領域からそれらをすべて削除するだけでは解決できません。
は、私が代わりにやりたいこと:

  1. 保存にステージングエリア
  2. の現在の状態を削除し、すべての
  3. は無関係な変更
  4. 再コミットファイル
  5. ステージ無関係な変更を上演しました保存された状態をステージング領域に適用します。

これはどういうことですか?

複数のステージング領域が存在する可能性がありますが、可能性はありません。

+0

つのみステージング領域が存在します。そしてgitは実際にそれを保存しません - あなたはそれを自分で行うことができます。 – Reactormonk

+0

あなたは確かに['git stash'](http://git-scm.com/docs/git-stash)して対話式のチェックアウトをしたい/追加してください。 –

+0

@NevikRehnel:git stashは、ステージング領域の既存の状態? –

答えて

12

以下のコマンドのチェーンが

git commit -m "temporary" # save current stage are as an actual commit 
git commit unrelated_files -m "The other feature" 
git stash # hide the rest 
git rebase -i HEAD~2 # change the order of two last commits 
git reset HEAD^ # rollback the "temporary" commit 
git add . # add everything from that commit back to staging 
git stash pop # and return back all initially unstaged stuff 
+0

はい、それは完璧です。どうもありがとう! :)それは私のgitの使用に完全にマッチします。私はとにかく多くのリベースを行います。 –

2

あなたは間違いなく、これはあなたの現在の作業を保存し、あなたがHEADにリセットをしたかのようにディレクトリを残すgit stash

を必要としています。 これで、ブランチを切り替えたり、別のトピックで作業したりできます。

あなたがもう一度あなたの機能で作業する準備ができたら、git stash apply

であなたの隠した変更を再適用しますが、複数のスタッシュを組み合わせることができ、git stash listはそれらを一覧表示されます、あなたは適用するウィッヒいずれかを選択することができ、などgit stash apply @{1}

編集:

@ nevik-rehnelはコメントで言ったように、あなたはまた、追加のインタラクティブ使用することができます。

すべてをアンステージしてください。無関係の変更を実行してコミットし、すべてを復元するにはgit add -pを使用してください。

+1

いいえ、これは間違いなく*私に必要なものではありません。私は作業ディレクトリではなく*ステージングエリアについて話しています。私は自分の枝を変えたくない。 –

+0

Git stashはあなたのステージング領域を保存して、きれいなディレクトリを残します。その後、ファイルを変更し、無関係のコミットを行い、適用を隠し、作業を完了し、コミットします。 – Intrepidd

+0

より詳細な例については、このgistを参照してください。https://gist.github.com/Intrepidd/d52b7e190aec8cd29854 – Intrepidd

0

なぜあなたはブランチとして保存して、新しいブランチを開始することはできません

0

これは動作するように見えトリック実行する必要があります。

  • をgit commit -m "temp"
  • git stash -u
  • git reset HEAD^
  • git stash save "MeepMeep!"
  • gitのスタッシュポップスタッシュ@ {1}
関連する問題