私はファイルに新しいファイルを加えた変更をしています、そして私が別のタスクに切り替える間、それらを片付けるためにgit stashを使いたいです。しかし、git stashはそれ自体で既存のファイルに対する変更のみを隠します。新しいファイルは私の作業ツリーに残り、私の将来の作業を雑然とさせます。この追跡されていないファイルを隠すにはどうすればよいですか?
2018年5月17日に更新:
Gitの新しいバージョンでは、追跡されていないファイルや無視されたファイルを含むすべてのファイルを隠すgit stash --all
が追加されました。git stash --include-untracked
はもう無視されたファイルに触れません(git 2.16.2でテストされました)。
下記の元の答え:
警告、gitignoreファイルにディレクトリ/ *エントリがある場合、これを実行するとファイルが完全に削除されます。
バージョン1.7.7以降では、git stash --include-untracked
またはgit stash save -u
を使用して、追跡されていないファイルをステージングせずに隠蔽できます。
ファイルを追加(git add
)して追跡を開始します。それから隠します。ファイルの内容全体が新規であるため、それらは隠蔽され、必要に応じてそれを操作することができます。
Git 1.7.7以降、git stash
は--include-untracked
オプション(または省略形の-u
)を受け入れます。追跡していないファイルを隠しファイルに含めるには、次のいずれかのコマンドを使用します。
git stash --include-untracked
git stash -u
ファイルをインデックスに追加します。
git add path/to/untracked-file
git stash
インデックスの内容全体、および既存のファイルに対するステージングされていない変更がすべて、それを隠してしまいます。
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にとって重要です - Eclipseは私のJavaエディタです。
私はまず最初に、残りのファイルを選択的に追加し、ステージングを約束しました。ただし、最終的なプッシュは、変更された.gitIgnoreファイルが削除され、追跡されていないファイルが削除されない限り実行できません。 .projectと.classpathは隠されていません。
私が使った
git stash
変更した.gitIgnoreファイルを隠します。
.classpathと.projectファイルを隠すために、私は使いました
git stash --include-untracked
そしてそれは私のワークスペースからファイルを削除しました。これらのファイルが存在しないと、Eclipseで私の勤務地で作業する能力がなくなります。コミットしたファイルをリモートにプッシュする手順を完了しました。これが成功したら、私は使いました
git stash pop
これは私のワークスペースに戻って同じファイルを貼り付けました。これで私はEclipseで同じプロジェクトに取り組むことができました。これが誤解をさけることを願っています。
他のところで言われたように、答えはファイルをgit add
することです。例えば。:
git add path/to/untracked-file
git stash
しかし、質問はまた別の答えで提起されています:あなたが本当にファイルを追加したくない場合はどうしますか?まあ、私が言うことができる限り、あなたはしなければなりません。そして以下はNOTになります:
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-standard
コマンドにgit 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'
pop
ではなくapply
を必要としない場合や、特定のstashを指定できるようにしたい場合には、後者をシェルスクリプトまたは関数として使用すると、パラメータをgit stash
に渡すことができます。一番上のものを取ります。たぶんこれ(上の2番目のエイリアスの代わりに)[空白はスクロールせずに収まるように削除された。読みやすくするために追加しなおしてください。
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
注:スタッシュ識別子を指定する場合は、識別子と共にaction引数を指定する必要があります。例:unstashall apply stash@{1}
またはunstashall pop stash@{1}
もちろん、どれをあなたの.zshrc
に入れるか、それと同等のものを長期的に存在させるべきです。
うまくいけば、この回答が誰かに役立ち、すべてを1つの回答にまとめることができます。
Gitバージョン2.8.1の場合:以下は私のために動作します。
変更されたファイルや追跡されていないファイルを名前なしで隠しファイルに保存する。
git stash save -u
変更されたファイルと追跡されていないファイルを隠しファイルとして名前を付けて保存する
git stash save -u <name_of_stash>
どちらのポップを使用して後で適用することもできます。
git stash pop
git stash apply stash@{0}
just 追跡されていないファイルを隠すことができました。
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 --include-untracked
または
git stash save -u
Git stashについての詳細は この投稿を参照する(ここをクリック)
追跡されていないファイルを隠しても、索引付けされたファイル(たとえばコミットしようとしているファイル)を保持したい場合は、-k
に-u
(索引の保持)オプションを追加するだけです。
git stash -u -k
ここには正しい答えがいくつかありますが、新しいディレクトリ全体については、'git add path'
が _ではなく_ workであることを指摘したいと思いました。もしあなたが 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
そして、 untracked-path が隠している唯一のパスである場合、隠し文字 "temp stash"は空の隠し文字になります。正しい方法は、ディレクトリ名だけでなく、パス全体を追加することです(つまり、パスの最後に '/'を付けます)。
git add untracked-path/
git stash "temp stash"
新しい、追跡されていないファイルが "views.json"という名前であるとしましょう。あなたがあなたのアプリの状態を隠してブランチを変更したいのであれば、私は一般的にタイプします:
git add views.json
その後:
git stash
そしてそれは隠されるでしょう。それから私はちょうどブランチを変更することができます
git checkout other-Nice-branch
これを解決するには、ファイルの内容をすべてステージング領域にコミットしてからgit stash
を呼び出すのではなく、ファイルが存在することをgitに伝えます。 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