Git stash uncached:ステージングされていないすべての変更を片付ける方法は?


96

gitによってバージョン管理されたプロジェクトで2組の変更が行われたとします。1セットはステージングされ、もう1セットはステージングされません。

この状態(コミット前)でプロジェクトを実行して、段階的な変更を再確認したいと思います。ステージングされていないすべての変更を片付け、ステージングされたままにする簡単な方法は何ですか?そのため、プロジェクトから消えるには段階的な変更が必要ですが、今後の作業のためにどこかに保存する必要があります。

これは、git stashコマンドとよく似ています。しかしgit stash、段階的な変更と段階的な変更の両方を私のプロジェクトから遠ざけるでしょう。そして、私はのようなものを見つけることができませんgit stash uncached


今日の私のgit 2.21では、これに対する良い答えはまだありません。以下のすべての回答は正しくない(-kオプション)か、使いにくいです。
Penghe Geng

回答:


98

アップデート2:
人々はこの答え不満れている理由私はわからないんだけど、それはあなたが追加することができますuntractedファイルのために、私と一緒に完璧に動作しているようだ-uフラグ

完全なコマンドは git stash --keep-index -u

そして、これがgit-stashヘルプのスニペットです

--keep-indexオプションを使用すると、すでにインデックスに追加されたすべての変更がそのまま残ります。

--include-untrackedオプションを使用すると、すべての追跡されていないファイルも隠され、git cleanでクリーンアップされ、作業ディレクトリは非常にクリーンな状態になります。代わりに--allオプションを使用すると、追跡されていないファイルに加えて、無視されたファイルが隠されてクリーンアップされます。

そして、これはそれがどのように見えるかのgifです:

ここに画像の説明を入力してください

更新:

これが選択された回答ですが、[以下の回答](https://stackoverflow.com/a/34681302/292408)が正しいものであると多くの人が指摘しています。私はそれをチェックすることをお勧めします。

今日(2020年1月31日)にgit versionに対してもう一度答えをテストしましたが、2.24.0それでも正しいと信じています。追跡されていないファイルについて上記の小さなメモを追加しました。動作していないと思われる場合は、gitのバージョンもお知らせください。

古い答え
この--keep-indexオプションを使用すると、すでにインデックスに追加されたすべての変更はそのまま残ります。

git stash --keep-index

ドキュメントからgit-stash

部分的なコミットのテスト

git stash save --keep-index作業ツリーの変更から2つ以上のコミットを行い、コミットする前に各変更をテストする場合に使用できます。

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

ただし、ステージングされた変更のみを視覚的に確認したいだけの場合は、以下を試すことができますdifftool

git difftool --cached

4
git stash [-p|--patch]インタラクティブスタッシュのような感じもご覧ください。man git stash「--patchを使用すると、対話的に隠しすることがHEADと作業ツリー間の差分からハンクを選択することができます。」
ここ

1
私はいつもadd -pcheckout -pそしてreset -p決して試したことはありませんstash -pでした。チップに感謝します:D
Mohammad AbuShady

18
この回答は、ステージングした変更を隠しておくことにも注意してください。
ベン・フリン

この回答は混乱を招くため、あまり役に立ちません。この答えは、stackoverflow.com / a / 34681302/292408の方が適しています。
イライジャ・リン

1
@ElijahLynnコメントのおかげで多くの人々がより良い答えだと言って見つけたので、私は他の答えにリンクしました
Mohammad AbuShady

99

受け入れられた回答は、いくつかの指摘によると、段階的な変更を隠し、追跡されていないファイルを隠しません。stashで段階的な変更を行わずに、追跡されていないファイルを削除してstashする方法は次のとおりです。

アイデアは、ステージングされた変更を一時的にコミットしてから、ステージングされていない変更を隠し、一時的なコミットをコミット解除することです。

# temp commit of your staged changes:
$ git commit --message "WIP"

# stage your previously unstaged files before stashing (so you get untracked files):
$ git add .

$ git stash

# now un-commit your WIP commit:
$ git reset --soft HEAD^

この時点で、ステージングされていない変更が隠され、作業コピーにはステージングされた変更のみが存在します。


21
これは本当に正解ですIMO。--keep-index現在の受け入れ答えでオプションがまだインデックスに何スタッシュ、それだけで、インデックスでそれを保持します。だからそれは複製され、陽気さが続く。
ケンウィリアムズ

3
@KenWilliams <del> hilarity </ del> <ins> tragedy </ ins>
tuespetre

@KenWilliamsそれは本当に私を苛立たせました。OP選択した回答を調整してください。
MikeMurko

2
現在の作業ディレクトリの上のディレクトリにあるファイルも取得する必要git add .があるため、ステップを改善するgit add --all必要がある場合があります。
イライジャ・リン

1
受け入れられた回答の--keep-indexオプションは誤解を招くため、これはこれまでのところ最良の回答です。これは受け入れられる答えになるはずです。
イライジャ・リン

21

私はステージングされていない変更だけを本当に隠しておく必要があるものだったので、マークされた答えは私にはうまくいかないことに気付きました。マークされた回答はgit stash --keep-index、段階的変更と非段階的変更の両方を隠します。--keep-index一部は単に、同様の作業コピーにそのままインデックスを残します。これはOPで機能しますが、実際に答えを求めていたのとは少し異なる質問をしたためです。

ステージングされていない変更を隠しておくための唯一の本当の方法は、隠していないものをまったく使用しないことです。

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .の代わりにも動作しますapply -R

仕事、仕事、仕事...

git apply unstaged.diff
rm unstaged.diff

1
ここgit version 2.6.1.windows.1git stash -kは、説明どおりに機能しました。
koppor

これは受け入れられる答えになるはずです!これは、複数のstackoverflowスレッドの中で唯一、主張することを実行し、一時的なコミットに依存しないものです。
user643011 2017年

1
@ user643011:gitの一時コミットは悪いことではありません。彼らは費用がかからず、誰にも害を与えません。
Fritz

1
@Fritz:一部のシナリオでは一時的なコミットが不可能です。現在の作業コードをチェックするpre-commitフックがある場合、失敗する可能性があります。段階的な変更は適切であるが、段階的でない変更は適切でない場合、このアプローチでは段階的な変更をコミットできません。
Penghe Geng

1
これには、追跡されていないファイルは含まれません。"git ls-files"を使用して、diffパッチでそれらを見つけて含める必要があります
ACyclic

5

Git:ステージングされていない変更を隠しておく

これにより、git addしなかったすべての変更が隠されます。

git stash -k

-uスイッチを使用しない限り、新しく作成された(および追加されていない)ファイルは作業ディレクトリに残ります。

git stash -k -u 

また、後でgit stash popを実行するときに、作業ディレクトリをクリーンにする必要があります(つまり、すべての変更を追加する必要があります)。

http://makandracards.com/makandra/853-git-stash-unstaged-changes


13
これはと同等git stash --keep-indexです。ステージングされたファイルはstashに含まれています。
Benjamin Cheah 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.