web-dev-qa-db-ja.com

Gitでステージングされていない変更のみをスタッシングする

次のワークフローを行いたい:

  1. ステージに変更を追加します。
  2. ステージングされなかった他のすべての変更を隠します。
  3. ステージングで何かを行う(ビルド、テストの実行など)
  4. スタッシュを適用します。

ステップ2を実行する方法はありますか?

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123
178
Unapiedra

git stash saveには、必要なことを正確に行うオプション--keep-indexがあります。

したがって、git stash save --keep-indexを実行します。

250
vhallac

これは3段階で実行できます:段階的な変更を保存し、他のすべてを隠し、段階的な変更でインデックスを復元します。基本的には次のとおりです。

git commit -m 'Save index'
git stash Push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

これはまさにあなたが望むことをします。

29
alesguzik
git stash save --keep-index

また、Re:

ステージング後に変更をコミットしてみませんか? –シン

A:テスト済みのコードを常にチェックインする必要があるため:)つまり、コミットしようとしている変更のみでテストを実行する必要があります

もちろん、経験豊富なプログラマーとして、これらの変更のみをテストおよびレビューするという生来の衝動があります-部分的冗談です

27
sehe

git version 2.7.4を使用すると、次のことができます。

git stash save --patch

gitは、変更をstashに追加するかどうかを尋ねます。
そして、あなたはyまたはnと答えるだけです

常に作業ディレクトリを復元できます:

git stash pop

または、保存した変更をstashに保持したい場合:

git stash apply
11
Eugen Konkov

以前の回答を拡張して、複雑な一連の変更が段階的に行われることがありますが、最初に別の変更をコミットしたいです。たとえば、段階的な変更を行う前に修正​​したいバグや間違ったコードを見つけた可能性があります。考えられるルートの1つは次のとおりです。

最初にすべてを隠しますが、段階的な変更はそのままにします

$ git stash save --keep-index [--include-untracked]

ステージングされた変更も個別に隠します

$ git stash save

修正のために変更を加えます。およびテスト;それらをコミットする:

$ git add [--interactive] [--patch]

$ git commit -m "fix ..."

ここで、以前にステージングされた変更を復元します。

$ git stash pop

競合を解決します。競合があった場合、gitは適用されますが、notはそのトップスタッシュエントリを削除します。

(...その後、段階的な変更をコミットし、他のすべての変更のスタッシュを復元し、続行します...)

5
Rhubbarb

質問に関連する別のヒント:

を使用してステージングされていない変更を効果的にスタッシュするとき

$ 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}" ###✘望んでいることはまったくできない

ステージングされていない変更のみを復元します。

2
Rhubbarb

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の答え の方が簡単です。

1
ma11hew28

Stashにタグなし(コミットに追加されていない)ファイルを追加するには、次のコマンドを実行します。

git stash -k

その後、ステージングされたファイルをコミットできます。その後、次のコマンドを使用して、最後に隠されたファイルを取得できます。

git stash pop
1
srth12

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がワークツリーから変更をドロップする段階で。

0
VonC