ファイルに加えて新しいファイルに変更があり、別のタスクに切り替える間、git stash を使用してそれらを片付けたいと考えています。しかし、git stash 自体は、既存のファイルへの変更のみを隠します。新しいファイルは作業ツリーに残り、今後の作業が雑然とします。この追跡されていないファイルを隠しておくにはどうすればよいですか?
18 に答える
追跡されていないファイル (特に にあるファイル) を含む作業ディレクトリを隠しておくには、.gitignore
おそらく次のコマンドを使用する必要があります。
git stash --include-untracked
-u
または、 の代わりに短縮形を使用する--include-untracked
か、単に追跡されていないファイルや無視されたgit stash --all
ファイルを含むすべてのファイルを隠します。この動作は 2018 年に変更されたため、git が最新であることを確認してください。
警告: 無視されたディレクトリの内容が完全に削除される可能性がある (またはあった) 状況があるようです。詳細については、このアーカイブされた Web サイトを参照してください。
git 1.7.7 の時点で、オプション (または省略形)git stash
を受け入れます。追跡されていないファイルを stash に含めるには、次のコマンドのいずれかを使用します。--include-untracked
-u
git stash --include-untracked
# or
git stash -u
警告、これを行うと、gitignore ファイルにdirectory/ エントリがある場合、ファイルが完全に削除されます。*
ファイルをインデックスに追加します。
git add path/to/untracked-file
git stash
インデックスの内容全体と、既存のファイルへのステージングされていない変更はすべて、隠し場所になります。
git bash では、追跡されていないファイルのスタッシュは、コマンドを使用して実現されます。
git stash --include-untracked
# or
git stash -u
http://git-scm.com/docs/git-stash
git stash は、追跡されていない、またはコミットされていないファイルをワークスペースから削除します。また、次のコマンドを使用して git stash を元に戻すことができます
git stash pop
これにより、ファイルがローカル ワークスペースに戻されます。
私の経験
.classpath および .project ファイルがリモート リポジトリに移動しないように、gitIgnore ファイルを変更する必要がありました。現在、この変更された .gitIgnore をリモート リポジトリに移動することは許可されていません。
.classpath および .project ファイルは、私の Java エディターである Eclipse にとって重要です。
まず、残りのファイルを選択的に追加し、ステージングをコミットしました。ただし、変更された .gitIgnore フィールドと追跡されていないファイルがない限り、最終的なプッシュを実行することはできません。.project と .classpath は隠しません。
使った
git stash
変更された .gitIgnore ファイルを隠します。
.classpath と .project ファイルをスタッシュするために、私は使用しました
git stash --include-untracked
そして、ワークスペースからファイルを削除しました。これらのファイルがないと、Eclipse で自分の作業場所で作業する能力が失われます。コミットされたファイルをリモートにプッシュする手順を完了しました。これが成功したら、私は使用しました
git stash pop
これにより、同じファイルがワークスペースに貼り付けられました。これにより、Eclipse で同じプロジェクトに取り組むことができるようになりました。これが誤解を払拭することを願っています。
git バージョン 2.8.1 の場合: 次のように動作します。
変更されたファイルと追跡されていないファイルを名前なしでスタッシュに保存するには
git stash save -u
変更されたファイルと追跡されていないファイルを stash に名前を付けて保存するには
git stash save -u <name_of_stash>
次のようにpopまたはapply later を使用できます。
git stash pop
git stash apply stash@{0}
他の場所で言われているように、答えは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-standard
に、git ls-files
コマンド (so, 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
。1。おそらくこれ (上記の 2 番目のエイリアスの代わりに) [スクロールせずに収まるように空白が削除されました。読みやすくするために再追加]:pop
apply
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
注: この形式では、スタッシュ識別子を指定する場合は、アクション引数と識別子を指定する必要がありますunstashall apply stash@{1}
。unstashall pop stash@{1}
.zshrc
もちろん、長期的に存在させるためにあなたまたは同等のものを入れます。
うまくいけば、この回答が誰かの役に立ち、すべてを 1 つの回答にまとめることができます。
これは、ファイルのすべての内容をステージング領域にコミットするのではなく、ファイルが存在することを 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
ここにはいくつかの正解がありますが、新しいディレクトリ全体で'git add 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がスタッシュしている唯一のパスである場合、スタッシュの「一時スタッシュ」は空のスタッシュになります。正しい方法は、ディレクトリ名だけでなく、パス全体を追加することです (つまり、パスを '/' で終了します):
git add untracked-path/
git stash "temp stash"
追跡されていないファイルをどのように隠しますか?
git stash --include-untracked
私は同じ機能を熟考し、望んでいました。しかし、時間が経つにつれて、それは本当に必要ではないことに気付きました。スタッシュするときは、新しいファイルを残しても問題ありません。それらに「悪い」ことは何も起こりません(他の何かをチェックアウトすると、gitはエラーになり、既存の追跡されていないファイルを上書きしません)
通常、git stash
と の間の時間枠git stash pop
はかなり短いため、追跡されていないファイルが再びすぐに必要になります。したがってgit status
、何か他の作業をしているときに ( と の間でgit stash
)ファイルが表示されるgit stash pop
不便さは、その作業によって引き起こされる不便さよりも小さく、追跡されていないファイルをあなたの隠し場所。