574

段階的な変更だけを隠しておく方法はありますか? 私が問題を抱えているシナリオは、特定の時点でいくつかのバグに取り組んでいて、ステージングされていない変更がいくつかある場合です。これらのファイルを個別にステージングして、.patch ファイルを作成し、コードが承認されるまで隠しておきたいと思っています。このようにして、承認されたら、(現在の) セッション全体を隠し、そのバグをポップしてコードをプッシュできます。

私はこれについて間違った方法で進んでいますか?プロセスを簡素化するために git が他の方法でどのように機能するかを誤解していますか?

4

16 に答える 16

662

はい、DOUBLE STASHで可能です

  1. 隠しておく必要があるすべてのファイルをステージングします。
  2. 実行しますgit stash --keep-index。このコマンドは、すべての変更 ( staged および unstaged ) を含む stash を作成しますが、ステージングされた変更を作業ディレクトリに残します (ステージングされた状態のままです)。
  3. 走るgit stash push -m "good stash"
  4. これで、ステージングされたファイルのみが作成されまし"good stash"た。

stash の前にステージングされていないファイルが必要な場合は、最初の stash (で作成されたもの--keep-index) を適用するだけで、stash したファイルを削除できます"good stash"

楽しみ

于 2015-10-05T14:42:18.620 に答える
184

最新のgitでは、--patchオプションを使用できます

git stash push --patch   # since 2.14.6

git stash save --patch   # for older git versions

また、git は、ファイルの各変更を stash に追加するかどうかを尋ねます。
あなたはただ答えるyか、n

DOUBLE STASHのUPD
エイリアス:

git config --global alias.stash-staged '!bash -c "git stash --keep-index; git stash push -m "staged" --keep-index; git stash pop stash@{1}"'

これで、ファイルをステージングして実行できますgit stash-staged
その結果、ステージングされたファイルは stash に保存されます

ステージングされたファイルを保持したくない場合は、それらを stash に移動します。次に、別のエイリアスを追加して実行できますgit move-staged

git config --global alias.move-staged '!bash -c "git stash-staged;git commit -m "temp"; git stash; git reset --hard HEAD^; git stash pop"'
于 2017-06-29T11:55:41.473 に答える
56

現在ステージングされているものだけを隠し、それ以外はすべて残すスクリプトを作成しました。関係のない変更をあまりにも多く行い始めると、これは素晴らしいことです。目的のコミットに関係のないものを単にステージングし、それだけを隠します。

(出発点のBartłomiejに感謝します)

#!/bin/bash

#Stash everything temporarily.  Keep staged files, discard everything else after stashing.
git stash --keep-index

#Stash everything that remains (only the staged files should remain)  This is the stash we want to keep, so give it a name.
git stash save "$1"

#Apply the original stash to get us back to where we started.
git stash apply stash@{1}

#Create a temporary patch to reverse the originally staged changes and apply it
git stash show -p | git apply -R

#Delete the temporary stash
git stash drop stash@{1}
于 2016-09-22T16:55:22.617 に答える
13

このシナリオでは、問題ごとに新しいブランチを作成することを好みます。接頭辞 temp/ を使用しているので、後でこれらのブランチを削除できることがわかります。

git checkout -b temp/bug1

bug1 を修正するファイルをステージングしてコミットします。

git checkout -b temp/bug2

その後、必要に応じてそれぞれのブランチからコミットを選択し、プル リクエストを送信できます。

于 2018-06-05T05:52:06.200 に答える
7

特定のバグの変更をコミットし、そのコミットとその前のコミットからパッチを作成してみませんか?

# hackhackhack, fix two unrelated bugs
git add -p                   # add hunks of first bug
git commit -m 'fix bug #123' # create commit #1
git add -p                   # add hunks of second bug
git commit -m 'fix bug #321' # create commit #2

次に、適切なパッチを作成するには、次を使用しますgit format-patch

git format-patch HEAD^^

0001-fix-bug-123.patchこれにより、次の 2 つのファイルが作成されます。0002-fix-bug-321.patch

または、バグごとに個別のブランチを作成して、バグ修正を個別にマージまたはリベースしたり、うまくいかない場合は削除したりすることもできます。

于 2013-02-07T19:58:40.250 に答える
3

git stash --keep-indexは良い解決策です...ただし、削除されたパスでは正しく機能しませんでしたが、Git 2.23 (2019 年第 3 四半期) で修正されました。

Thomas Gummerer ( )によるcommit b932f6a (2019 年 7 月 16 日)を参照してください。( 2019 年 7 月 25 日コミット f8aee85Junio C Hamanoによってマージされました)tgummerer
gitster

stash: 削除されたファイルの処理を修正--keep-index

git stash push --keep-indexインデックスとディスクの両方で、インデックスに追加されたすべての変更を保持することになっています。

現在、ファイルがインデックスから削除された場合、これは正しく動作しません。
ディスク上で削除されたままにする代わりに、**--keep-indexは現在、ファイルを復元します。**

git checkoutインデックスと作業ツリーを忠実に復元できる非オーバーレイ モードで' ' を使用して、この動作を修正します。
これにより、コードも簡素化されます。

追跡されていないファイルがインデックスで削除されたファイルと同じ名前を持っている場合、これは追跡されていないファイルを上書きすることに注意してください。

于 2019-07-27T20:36:50.290 に答える
2

これに対する別のアプローチは、隠しておきたくないファイルで一時的なコミットを作成し、残りのファイルを隠して最後のコミットを静かに削除し、ファイルをそのままにしておくことです:

git add *files that you don't want to be stashed*
git commit -m "temp"
git stash --include-untracked
git reset --soft HEAD~1

そうすれば、触れたいファイルだけに触れることができます。

ここでは、「--include-untracked」が新しいファイルを隠しておくためにも使用されていることに注意してください (これはおそらく本当に必要なものです)。

于 2020-11-29T18:24:28.027 に答える