追跡されていないファイルをどのように隠しておくのですか?


1437

ファイルに加えて新しいファイルに変更があり、別のタスクに切り替えるときにgit stashを使用してそれらを片付けたいと思っています。ただし、git stash自体は、既存のファイルへの変更のみを隠します。新しいファイルは私の作業ツリーに残り、私の将来の作業を乱雑にします。この追跡されていないファイルをどのように隠しておくのですか?


27
スタッシュに追跡されていないファイルしかない場合は、空のファイルのように見えるので注意してください。git stash show何も返されず、削除したくなります(数か月前に書いた有用なスクリプトが含まれているときに行ったように)。 → ドロップされたスタッシュを回復する方法
Maxime R.

回答:


1925

追跡されていないファイル(特に.gitignoreにあるファイル)を含む作業ディレクトリを隠しておくには、おそらく次のコマンドを使用します。

git stash --include-untracked

詳細:

2018年5月17日更新:

gitの新しいバージョンではgit stash --all、追跡されていないファイルや無視されたファイルを含むすべてのファイルが隠されるようになりました。
git stash --include-untracked無視されたファイルには触れません(git 2.16.2でテスト済み)。

以下の元の答え:

警告:これを行うと、gitignoreファイルにdirectory / *エントリがある場合、ファイルが完全に削除されます。

バージョン1.7.7以降では、git stash --include-untrackedまたはgit stash save -uを使用して、追跡されていないファイルをステージングせずに隠しておくことができます。

git addファイルを追加()し、追跡を開始します。次に隠します。ファイルの内容全体が新しいため、それらは隠され、必要に応じて操作できます。


4
stashは、変更がステージングされていないにもかかわらず、変更された既存のファイルをまだstashしているのはなぜですか?
アラン・クリステンセン

6
@ alan-christensen kernel.org/pub/software/scm/git/docs/git-stash.htmlの説明を読んでください。ポイントは、隠した後の作業ツリーをクリーンにすることです。
ケルビン

3
@Kelvin私のコメントで意味したことは、ステージングされていない限り新しいファイルは隠さないということですが、ステージングされていなくても既存のファイルは隠します。私には矛盾しているようです。
アランクリステンセン

11
@AlanChristensenポイントは、別のブランチのチェックアウトによって上書きされる可能性があるものを隠しておくことです。
jwg 2013年

3
あなたがここでトップアンサーを持っているので、私はあなたがあなたのアンサーのgit stash --include-untrackedgit stash --allにリストすることを2つの理由で要求するでしょう。まず、2019年にOPの質問により適切に回答します。次に、すべてが.gitignoredされているすべてのファイルを削除するという点で、ほとんどすべてのユーザーがおそらく望まないことを行うためです
Daniel

411

git 1.7.7以降git stash--include-untrackedオプション(または省略形)を受け入れます-u。追跡されていないファイルをスタッシュに含めるには、次のいずれかのコマンドを使用します。

git stash --include-untracked
git stash -u

警告:これを行うと、gitignoreファイルにdirectory / *エントリがある場合、ファイルが完全に削除されます。


15
かっこいい-それは最終的にはマニュアルページで説明されているように動作します。新しいファイルを隠さない(およびクリーニングしない)と、動作が壊れます。
スティーブベネット

1
私のgitのバージョンは1.9.1であり、私が持っている.gitignoreものがこのように見えても、追跡されてignoredDirectoryいないignoredDirectory/*ものは削除されます。追跡されていないファイルでも、ディレクトリだけではありません。
theUnknown777 2015

22
警告について説明してもらえますか?なぜそれらのファイルを削除するのですか?それらを削除し、それらを隠しませんか?私はしばらくGitを使用しており、この問題に遭遇していません。
Aleksandr Dubinsky

警告は*.extensionエントリにも適用されますか?
arekolek 2017年

3
@ aleksandr-dubinsky、@ arekolek- git1.8.3 -u--include-untracked)オプションはgit stash show、追跡されていないファイルを
スタッシュ

77

ファイルをインデックスに追加します。

git add path/to/untracked-file
git stash

インデックスのコンテンツ全体と、既存のファイルへのステージングされていない変更により、すべてが隠されます。


すでにインデックスにある変更を隠したくない場合はどうしますか?新しいファイルを隠しておくことは可能ですか?
allyourcode

インデックスをコミットし、新しいファイルを隠して、コミットを元に戻すか、コミットからファイルをチェックアウトします。それは無骨な解決策ですが、うまくいくはずです。
Gdalya、2012年

git add .何らかの理由でそれを考慮に入れていなかった
TheBilTheory

53

git bashでは、追跡されていないファイルを隠しておくには、次のコマンドを使用します。

git stash --include-untracked

または

git stash -u

http://git-scm.com/docs/git-stash

git stashは、追跡されていないファイルやコミットされていないファイルをワークスペースから削除します。また、次のコマンドを使用してgit stashを元に戻すことができます

git stash pop

これにより、ファイルがローカルワークスペースに戻ります。

私の経験

.classpathファイルと.projectファイルがリモートリポジトリに移動しないように、gitIgnoreファイルを変更する必要がありました。現在、この変更された.gitIgnoreをリモートリポジトリに移動することは許可されていません。

.classpathおよび.projectファイルはEclipseにとって重要です-これは私のJavaエディターです。

まず、残りのファイルを選択的に追加し、ステージングにコミットしました。ただし、変更された.gitIgnoreフィールドと追跡されていないファイルが表示されない限り、最終的なプッシュは実行できません。.projectと.classpathは隠されていません。

使った

 git stash 

変更された.gitIgnoreファイルを隠しておくため。

.classpathと.projectファイルを隠しておくために、私は

git stash --include-untracked

そして、それは私のワークスペースからファイルを削除しました。これらのファイルがないと、Eclipseで私の作業場所で作業する私の能力を奪います。コミットされたファイルをリモートにプッシュする手順の完了に進みました。これがうまくいったら、私は

git stash pop

これにより、同じファイルがワークスペースに貼り付けられました。これにより、同じプロジェクトでEclipseで作業する能力が戻ってきました。これが誤解を無視することを願っています。


2
IDEファイルにグローバルgitignoreを使用しないのはなぜですか?つまり。使用します~/.gitignore
Antti Pihlaja

20

他で述べられているように、答えはgit addファイルです。例えば:

git add path/to/untracked-file
git stash

ただし、別の回答でも質問が出されます。ファイルを本当に追加したくない場合はどうなりますか?まあ、私が知る限り、あなたはそうしなければなりません。そして、以下は機能しません

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

これは次のように失敗します。

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

それで、あなたは何ができますか?さて、あなたは、本当にファイルを追加する必要がありますしかし、あなたが効果的で、後でそれをアン追加することができますgit rm --cached

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

その後、以前と同じ状態でgit add(つまり、と呼ばれるpath/to/untracked-file追跡されていないファイルと、追跡されているファイルに必要なその他の変更を加えて)作業を続けることができます。

これに関するワークフローの別の可能性は、次のようなものです。

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[注:@mancocapacからのコメントで述べたように--exclude-standardgit ls-filesコマンドに追加することもできます(そう、git ls-files -o --exclude-standard)。]

...簡単にスクリプト化することもできます-エイリアスでも可能です(zsh構文で示されます。必要に応じて調整します)[また、この回答でスクロールせずに画面に収まるようにファイル名を短くしました。選択した別のファイル名に置き換えてください]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

注後者はよりよいシェルスクリプトや関数などであるかもしれないことを、パラメータを供給できるようにしgit stashたくない場合には、popしかしapply、および/または特定のスタッシュを指定するだけではなく、トップを取ることができるようにしたいです1。おそらくこれ(上記の2番目のエイリアスの代わりに)[スクロールせずに収まるように空白が削除されます。読みやすくするために再度追加します]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

:このフォームでは、stash識別子を指定する場合は、アクション引数と識別子を指定する必要があります。例:unstashall apply stash@{1}またはunstashall pop stash@{1}

もちろん、あなた.zshrcが長期的に存在させるためにあなたがあなたの同等のものに入れたものはどれですか。

うまくいけば、この答えが誰かに役立ち、すべてを1つの答えにまとめることができます。


1
git ls-files -oを実行すると、興味のあるファイルよりも多くのファイルが表示されます。次のgitステータスから、-exclude-standardの作業を追加したことがわかりました。git ls-files -o --exclude-standard。この上の私のテイクはそれだけで普段つまり、あなたの.gitignoreがフィルタリングではないでしょう人跡未踏のファイルを表示し、-無視しないでしょう人跡未踏のファイル「を含む」である
mancocapac

20

gitバージョン2.8.1の場合:次のように動作します。

変更されたファイルと追跡されていないファイルを名前なしでstashに保存するには

git stash save -u

変更されたファイルと追跡されていないファイルを名前を付けてstashに保存するには

git stash save -u <name_of_stash>

次のように、ポップまたは後で適用することができます。

git stash pop

git stash apply stash@{0}

追跡されていないファイルはコンピューターから削除されませんでしたが、追跡されていないファイルとしては表示されなくなりました。git stash showそれらを示さなかった。を試したところgit stash apply、「エラー:追跡されていないファイルをstashから復元できませんでした」というエラーが発生しました。ただし、ファイルは再び追跡されていないものとしてリストされましたが、追跡されたファイルへの変更は復元されませんでした。これらのファイルはスタッシュからチェックアウトすることで個別に復元できると思いますが、この解決策は私が望んでいたものではありませんでした。
hBrent

9

次のようにすることで、追跡されていないファイルだけを隠しておくことができました。

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

最後のものは、追跡されたファイルのスタッシュをポップし、追跡されていないファイルのみをスタッシュしたままにします。


git stash save -uuntrackedファイルを保存するだけでなく、trackedとの両方を保存しますuntracked。この場合、あなたがしている最初の保存は必要ありません。atlassian.com/git/tutorials/saving-changes/…に
。– Drenai

2
問題は、追跡されていないファイルだけを隠しておく方法です。最初の隠し場所をスキップすると、何を飛び出しますか?アイデアは次のとおりです。1)Stashを追跡します。2)追跡されていない隠し場所。3)ポップを追跡。結果:追跡されないままになっています。
オデッド

3

追跡されていないファイルを隠しておき、インデックス付けされたファイル(たとえば、コミットしようとしているファイル)を保持したい場合は、-k(インデックスを保持する)オプションを-u

git stash -u -k


2

追跡されていない新しいファイルが「views.json」と呼ばれているとしましょう。アプリの状態を隠してブランチを変更したい場合は、通常、次のように入力します。

git add views.json

次に:

git stash

そして、それは隠されてしまいます。それから私はブランチを変更することができます

git checkout other-nice-branch

1

ここにはいくつかの正解がありますが、新しいディレクトリ全体で'git add path'は機能しないことを指摘しておきます。したがって、untracked-pathに新しいファイルがたくさんある場合は、次のようにします。

git add untracked-path
git stash "temp stash"

これにより、次のメッセージが表示されます。

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

場合と人跡未踏-pathは、あなたがしているスタッシュパスのみで、スタッシュ「一時スタッシュは、」空のスタッシュになります。正しい方法は、ディレクトリ名だけでなく、パス全体を追加することです(つまり、パスの最後に「/」を付けます)。

git add untracked-path/
git stash "temp stash"

少なくとも私のシステムでは、あなたの仮定は間違っています。スラッシュなしで動作します!空のディレクトリはとにかく無視されます。(macos git 2.6.2)
phobie 2015年

0

これは、ファイルのすべての内容をステージング領域にコミットするのではなく、ファイルが存在することをgitに伝えてを呼び出すことで解決できると思いましたgit stash。Araqnid は前者の方法を説明しています。

git add --intent-to-add path/to/untracked-file

または

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

ただし、後者は機能しません。

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

1
私の知る限り、前者も機能しません。この問題の解決策については、私の回答を参照しください。
lindes

0
git stash --include-untracked

追加したファイルやステージングしていないファイルも保存されるので、私のお気に入りです。


0

新しく作成されたファイルでSourcetreeを使用しているときに同様の問題が発生しました(それらはスタッシュにも含まれません)。

私が最初に「すべてをステージング」を選択してから、新しく追加されたコンポーネントを追跡する場所に隠し、したがって隠し場所に含めました。


この質問は11歳で、すでに14の回答があります。投稿する前に読みましたか?
ミカエルB.

-7

私はよく考えて同じ機能を望んでいました。しかし、時間が経つにつれ、本当に必要ないことに気付きました。隠しておくときは、新しいファイルを残してもかまいません。それらに「悪い」ことは起こり得ません(他のものをチェックアウトすると、gitはエラーになり、既存の追跡されていないファイルを上書きしません)

また、通常、git stashとの間の時間枠git stash popはかなり短いので、追跡されていないファイルが再び必要になります。私は、ファイルの不便がで現れて言うように、git statusあなたは(間に他の何かに取り組んでいる間、git stashおよびgit stash pop小さい)、その後の作業に起因すると注意が必要な不便さは、それ以外に追跡されていないファイルを追加しようとするかかるだろうあなたの隠し場所。


15
プロジェクトによって異なります。追跡されていないファイルが(半分書かれた)単体テストであり、テストハーネスがディレクトリ内のすべての単体テストを実行するとします。その他
スティーブベネット

1
別の例は、2台のコンピューターで作業していて、データをAからBに移動できるが、BからAに移動できない場合です。Bで最初に発生する問題を解決するために新しいコードを作成すると、 AとBの両方に必要な場合は、Bにファイルを隠しておくことができます。これにより、Aでそのファイルを再作成し、それをバンドルに持ち込むときに、隠されたバージョンをgit diffして、自分がそうしなかったことを確認できます。間違える。
Gdalya、2012年

7
ファイルが1つのブランチで追跡されていないからといって、別のブランチで追跡されているファイルと競合しないわけではありません。
jwg 2013年

3
単純な反例:.conf.dディレクトリ内の構成ファイル、またはそこにあるだけでソフトウェアの動作を変更するその他のファイル。
fotanus 2014年

もちろん機能が必要です。追加の例として、隠したいローカルで追跡されていないファイルがある場合、あるブランチから別のブランチに切り替えることはできません。
Demitrian '26 / 10/26
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.