308

このワークフローを使用したいと思います:

  1. いくつかの変更をステージングします。
  2. ステージングされていない変更をスタッシュに保存します。
  3. ステージにあるもの(ビルド、テストなど)でいくつかのことを行います。
  4. 専念。
  5. ステージングされていない変更を復元します。

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

例:

git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git stash push
test
git commit
git stash pop
4

14 に答える 14

383

git stash push--keep-index必要なことを正確に実行するオプションがあります。

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

于 2011-10-04T16:10:50.650 に答える
72

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

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

これはあなたが望むことを正確に行います。

于 2015-04-25T10:13:12.747 に答える
31
git stash save --keep-index

また、Re:

ステージングした後、変更をコミットしてみませんか?- すね

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

もちろん、経験豊富なプログラマーとして、これらの変更だけをテストしてレビューするという生来の衝動があるという事実は別として、これはすべて、部分的に冗談です

于 2011-10-04T16:13:25.937 に答える
21

段階的な変更なしの隠し場所

--keep-index/の問題-k

作業ツリー(ステージングされていない変更)だけをGitに隠しておくことは、本来あるべきよりも困難です。受け入れられた回答、および他のかなりの数の回答は、ステージングされていない変更を隠し、を介して要求されたとおりにステージをそのままにし--keep-indexます。

ただし、明らかではないのは、段階的な変更--keep-index隠しておくことです。段階的な変更は、段階と隠し場所の両方で終了します。スタッシュに一時的な変更を加えると、後でスタッシュをポップするときに競合が発生する可能性があるため、これが必要になることはめったにありません。

エイリアスソリューション

このエイリアスは、作業コピーの変更のみをステージングするのに適しています。

stash-working = "!f() { \
  git commit --quiet --no-verify -m \"temp for stash-working\" && \
  git stash push \"$@\" && \
  git reset --quiet --soft HEAD~1; }; f"

段階的な変更を一時的にコミットし、残りの変更からスタッシュを作成し(また、--include-untrackedやなどの追加の引数--messageをエイリアス引数として渡すことができます)、一時的なコミットをリセットして段階的な変更を元に戻します。

これは@SimonKnappの回答に似ていますが、いくつかの小さな違いがあります。実行される一時的なアクションで使用され、をハードコーディングするのではなく--quiet、stashの任意の数のパラメーターを受け入れ、最終的に追加されます。インデックスが開始時のままになるようにリセットします。また、コミット時に使用して、コミット前のフック(HT:@Granfalloner)からの作業コピーへの変更を回避します。push-m--soft--no-verify

段階的な変更(エイリアスstash-index)だけを隠しておくという反対の問題については、この回答を参照してください。

于 2020-03-26T19:50:16.660 に答える
20

あなたと一緒git version 2.7.4に行うことができます:

git stash save --patch

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

いつものように作業ディレクトリを復元できます。

git stash pop

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

git stash apply
于 2017-06-29T11:48:49.440 に答える
12

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

git stash -k

新しく追加されたファイル(ステージングされていない-緑色ではない)もスタッシュに含める場合は、次の手順を実行します。

git stash -k -u

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

git stash pop
于 2018-11-23T10:49:57.123 に答える
5

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の回答の方がおそらく簡単です。

于 2018-12-17T22:14:38.900 に答える
4

以前の回答を拡張して、複雑な一連の変更をステージングすることがありますが、最初に別の変更をコミットしたいと思います。たとえば、段階的な変更の前に修正したいバグやその他の誤ったコードを見つけた可能性があります。とるべき1つの可能なルートはこれです:

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

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

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

$ git stash save

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

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

$ git commit -m "fix ..."

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

$ git stash pop

競合を解決し、競合があった場合、gitは適用されますが、その最上位のstashエントリは削除されないことに注意してください。

(...次に、段階的な変更をコミットし、他のすべての変更の隠し場所を復元して、続行します...)

于 2015-01-21T13:10:39.357 に答える
3

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

ステージングされていない変更を効果的に隠しておく場合

$ git stash save --keep-index

スタッシュにメッセージを送信して、それを実行するときにgit stash list、以前にスタッシュしたものがより明確になるようにすることができます。特に、そのスタッシュ操作に続いてさらに保存する場合はそうです。例えば

$ git stash save--keep-index"変更はまだステージングされていません"

(実際には、他の回答に記載されているように、すべての変更が含まれています)。

たとえば、上記の直後に次のようになります。

$ gitstashsave「機能Xの段階的な変更」

ただし、その後は使用できないことに注意してください

$ git stash apply "stash @{1}"###✘はあなたが望むかもしれないことを完全には行いません

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

于 2015-01-21T13:21:44.270 に答える
3

stashエントリへのメッセージとして使用する文字列を受け入れるエイリアスを使用します。

mystash = "!f() { git commit -m hold && git stash push -m \"$1\" && git reset HEAD^; }; f"

どれの:

  • インデックス内のすべてをコミットし、
  • 作業ツリーで変更されたものを隠します(もちろん、-uまたはを追加できます-a)。
  • 最後のコミットを作業試行にリセットします(--softインデックスに保持するために使用する場合があります)。
于 2020-03-13T00:59:14.693 に答える
1

これが(私の意見では)OPが要求したことを正確に実行する最良の解決策です。ステージングされていない追跡されたファイルのみを隠します–不必要なコミットや、変更されたすべてのファイルを--keep-index

ステージングされていない、追跡されたすべての変更を一覧表示しgit diff --name-only()、改行をスペースに変換し(| tr '\n' ' ')、以下を使用してこれらすべてのファイルを隠しますgit stash push

git stash push $(git diff --name-only | tr '\n' ' ')
于 2022-02-17T00:08:06.883 に答える
1

Git 2.35+(Q1 2022)から、--stagedフラグ(man)を使用して、インデックスgit stash pushの変更のみをステージングできるようになりました。

あなたの質問は正反対なので、2つの選択肢があります。

  1. 次のように操作を逆にします。
git stash push --staged            # Stash staged changes
git stash                          # Stash everything else
git stash pop stash@{1}            # Restore staged changes stash
  1. 保持したい変更ではなく、隠したい変更をステージングします。今、あなたはただ走ることができます:
git stash push --staged

この情報は、別のS/O投稿のこの回答から得ました。

于 2022-02-22T13:53:01.133 に答える
0

2022年:「gitの段階的な変更のみを隠しておくことは可能ですか?」で言及しましたが、Git 2.35(2022年第1四半期)には「git stash push --stagedmanが付属しています:

このオプションは、プッシュおよび保存コマンドにのみ有効です。

現在ステージングされている変更のみを隠しておきます。これは、状態が現在のブランチではなくスタッシュにコミットされることを除いて、
基本に似ています。git commit


2019:git stash push [--] [<pathspec>...]Git 2.16+(git stash save非推奨)以降、そのコマンドの最新の形式はです。

これをワイルドカード形式と組み合わせることができます。次に例を示します。

git stash push --all --keep-index ':(glob)**/*.testextension' 

しかし、Git 2.22(2019年第2四半期)までは、Git for Windowsではうまく機能しません。シェルスクリプトの代わりにCで再実装されていることを考えると、問題2037を参照してください。git stash

Thomas Gummerer()によるcommit 7db9302(2019年3月11日)を参照してください。Johannes Schindelin()によるcommit 1366c78commit 7b556aa(2019年3月7日)を 参照してください。濱野純雄による合併---コミット0ba1ba4、 20194月22日)tgummerer
dscho
gitster

組み込みstash:(glob)pathspecsを再度処理する

たとえば、pathspecsのリストをに渡すときgit addは、pathspecsの解析された形式ではなく、元の形式を使用するように注意する必要があります。

これは、たとえば電話をかけるときに違いを生みます

git stash -- ':(glob)**/*.txt'

ここで、元のフォームには:(glob)プレフィックスが含まれていますが、解析されたフォームにはプレフィックスが含まれていません。

ただし、組み込みではgit stash、解析された(つまり正しくない)フォームを渡したため、git add次のエラーメッセージが表示されて失敗します。

fatal: pathspec '**/*.txt' did not match any files

実際に正常に更新されたgit stash場合でも、ワークツリーから変更を削除する段階。refs/stash

于 2019-04-22T18:26:43.990 に答える
0

私の知る限り、現在、ステージングされていない変更のみgit stash pushをで保存することはできません。つまり、インデックス状態からの変更を保存することはできません。このコマンドは、作業ツリーのすべての変更(ステージングされた変更とステージングされていない変更)、つまりHEAD状態からの変更を保存します。オプション--keep-indexを使用して、作業ツリーの状態をHEAD状態ではなくインデックス状態に設定します(これにより、復元時に競合が発生します。 )を使用してHEAD状態から変更しgit stash popます。git stash pushステージングされた変更のみを保存するオプションがすでにあるので、ステージングされていない変更のみを保存するオプションがあると非常に便利です-U|--unstaged(私にとってはオプション--keep-indexに欠陥があります)-S|--staged

だから今のところあなたはエミュレートする必要があります

git stash push --unstaged

git stash pop

一時ファイルを使用する場合:

git diff >unstaged
git restore .

git apply unstaged
rm unstaged

あなたのユースケースは部分的な変更をコミットする前にテストしており、それはすでにリファレンスドキュメント--keep-indexにありますが、競合を引き起こす欠陥のあるオプションがあります。エミュレートされたオプションのあるバージョンは次の-U|--unstagedとおりです。

git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git diff >unstaged
git restore .
test
git commit
git apply unstaged
rm unstaged

状態の視覚化

スタッシングをよりよく理解するには、各ステップで作業ツリー、インデックス、およびHEADの状態を確認することが重要だと思います。ユースケースを見てみましょう。

git init

働く 索引

echo one >file

働く 索引
1

git add file

働く 索引
1 1

git commit

働く 索引
1 1 1

echo two >>file

働く 索引
1 1 1
2

git add file

働く 索引
1 1 1
2 2

echo three >>file

働く 索引
1 1 1
2 2

git diff >unstaged

git restore .

働く 索引
1 1 1
2 2

test

git commit

働く 索引
1 1 1
2 2 2

git apply unstaged

rm unstaged

働く 索引
1 1 1
2 2 2
于 2022-01-30T13:14:21.150 に答える