次のワークフローを行いたい:
ステップ2を実行する方法はありますか?
例
echo "123" > foo
git add foo # Assumes this is a git directory
echo "456" >> foo
git stash
cat foo # Should yield 123
git stash save
には、必要なことを正確に行うオプション--keep-index
があります。
したがって、git stash save --keep-index
を実行します。
これは3段階で実行できます:段階的な変更を保存し、他のすべてを隠し、段階的な変更でインデックスを復元します。基本的には次のとおりです。
git commit -m 'Save index'
git stash Push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
これはまさにあなたが望むことをします。
git stash save --keep-index
また、Re:
ステージング後に変更をコミットしてみませんか? –シン
A:テスト済みのコードを常にチェックインする必要があるため:)つまり、コミットしようとしている変更のみでテストを実行する必要があります
もちろん、経験豊富なプログラマーとして、これらの変更のみをテストおよびレビューするという生来の衝動があります-部分的冗談です
git version 2.7.4
を使用すると、次のことができます。
git stash save --patch
git
は、変更をstashに追加するかどうかを尋ねます。
そして、あなたはy
またはn
と答えるだけです
常に作業ディレクトリを復元できます:
git stash pop
または、保存した変更をstashに保持したい場合:
git stash apply
以前の回答を拡張して、複雑な一連の変更が段階的に行われることがありますが、最初に別の変更をコミットしたいです。たとえば、段階的な変更を行う前に修正したいバグや間違ったコードを見つけた可能性があります。考えられるルートの1つは次のとおりです。
最初にすべてを隠しますが、段階的な変更はそのままにします
$ git stash save --keep-index [--include-untracked]
ステージングされた変更も個別に隠します
$ git stash save
修正のために変更を加えます。およびテスト;それらをコミットする:
$ git add [--interactive] [--patch]
$ git commit -m "fix ..."
ここで、以前にステージングされた変更を復元します。
$ git stash pop
競合を解決します。競合があった場合、gitは適用されますが、notはそのトップスタッシュエントリを削除します。
(...その後、段階的な変更をコミットし、他のすべての変更のスタッシュを復元し、続行します...)
質問に関連する別のヒント:
を使用してステージングされていない変更を効果的にスタッシュするとき
$ git stash save --keep-index
スタッシュにメッセージを与えると、git stash list
を実行するときに、特にスタッシュ操作に続いてさらに保存する場合に、以前にスタッシュした内容がより明確になります。例えば
$ git stash save --keep-index "changes not yet staged"
(実際には、他の回答に記載されているすべての変更が含まれています)。
たとえば、上記の直後に以下が続く場合があります。
$ git stash save "フィーチャーXの段階的な変更"
ただし、できないを使用することに注意してください
$ git stash apply "stash @ {1}" ###✘望んでいることはまったくできない
ステージングされていない変更のみを復元します。
Gitには、ステージングされていない変更のみを格納するコマンドはありません。
ただし、Gitでは、どのファイルを隠しておくかを指定できます。
git stash Push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb
それらのファイルの特定の変更のみを隠しておきたい場合は、--patch
オプションを追加します。
git stash Push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb
--include-untracked
オプションを使用すると、追跡されていないファイルをスタッシュできます。
git stash Push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb
詳細については、git help stash
(またはman git-stash
)を実行してください。
注:ステージングされていない変更がかなり分解されている場合は、おそらく @ alesguzikの答え の方が簡単です。
Stashにタグなし(コミットに追加されていない)ファイルを追加するには、次のコマンドを実行します。
git stash -k
その後、ステージングされたファイルをコミットできます。その後、次のコマンドを使用して、最後に隠されたファイルを取得できます。
git stash pop
Git 2.16以降( git stash Push [--] [<pathspec>...]
は非推奨 )なので、このコマンドの最新の形式はgit stash save
です。
これをワイルドカード形式と組み合わせることができます。例:
git stash Push --all --keep-index ':(glob)**/*.testextension'
しかし、Git for Windowsでは、Git 2.22(2019年第2四半期)まではうまく機能しません。 issue 2037 を参照して、 git stash
は、C で再実装されました(シェルスクリプトの代わりに)
commit 7db9302 (2019年3月11日)by Thomas Gummerer(tgummerer
) 。
「 commit 1366c78 」、 commit 7b556aa (07 3月参照) 2019)by Johannes Schindelin(dscho
) 。
( によって合併された浜野順夫-gitster
- in commit 0ba1ba4 、2019年4月22日)
組み込み
stash
:再び:(glob)
pathspecsを処理しますたとえば、
git add
にパススペックのリストを渡す場合、解析されたパススペックの形式ではなく、元の形式を使用するように注意する必要があります。これにより違いが生じます。呼び出すとき
git stash -- ':(glob)**/*.txt'
元のフォームには
:(glob)
プレフィックスが含まれますが、解析されたフォームには含まれません。ただし、組み込みの
git stash
では、解析された(つまり正しくない)フォームを渡したため、git add
はエラーメッセージで失敗します。fatal: pathspec '**/*.txt' did not match any files
git stash
が実際に正常に更新された場合でも、refs/stash
がワークツリーから変更をドロップする段階で。