SYNOPSIS
gitstash
list
[<log-options>] gitstash
show
[-u
|--include-untracked
|--only-untracked
] [<diff-options>] [<stash>] gitstash
drop
[-q
|--quiet
] [<stash>] gitstash
pop
[--index
] [-q
|--quiet
] [<stash>] gitstash
apply
[--index
] [-q
|--quiet
] [<stash>] gitstash
branch
<branchname> [<stash>] gitstash
[push
[-p
|--patch
] [-S
|--staged
] [-k
|--
[no-
]keep-index
] [-q
|--quiet
] [-u
|--include-untracked
] [-a
|--all
] [(-m
|--message
) <message>] [--pathspec-from-file=
<file> [--pathspec-file-nul
]] [--
] [<pathspec>…]] gitstash
save
[-p
|--patch
] [-S
|--staged
] [-k
|--
[no-
]keep-index
] [-q
|--quiet
] [-u
|--include-untracked
] [-a
|--all
] [<message>] gitstash
clear
gitstash
create
[<message>] gitstash
store
[(-m
|--message
) <message>] [-q
|--quiet
] <commit>
DESCRIPTION
作業ディレクトリとインデックスの現在の状態を記録したいが、 作業ディレクトリをクリーンな状態に戻したい場合は、 git
stash
を使用します。 このコマンドは、ローカルの変更を保存し、 作業ディレクトリを元に戻して(revert)、HEAD
コミットに一致させます。
このコマンドによって保存(stash)された変更は、 git
stash
list
で一覧表示でき、 git
stash
show
で確認でき、 git
stash
apply
で(異なるコミットの上に)復元できます。 引数なしで git
stash
を呼び出すことは、 git
stash
push
と同等です。 スタッシュはデフォルトで WIP
on
'branchname' ... と表示されますが、 作成時にコマンドラインでより詳細なメッセージを指定できます。
最新のスタッシュ は refs/stash
に保存されます。 古いスタッシュはこの参照の reflog にあり、 通常の reflog 構文(例: stash@
{0} は最新のスタッシュで、 stash@
{1} はその前のもの、 stash@
{2.hours.ago} なんてのも可能)で名前を付けれます。 スタッシュは、 スタッシュ・インデックス番号(例: 整数 n は stash@
{n} と同等)だけで参照することもできます。
COMMANDS
- push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [(-m|--message) <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>…]
-
ローカルの変更を新しい「スタッシュエントリ」に保存し、 作業ツリーとインデックスを HEAD に戻します(roll back)。 <message> の部分は任意で、 スタッシュ状態と一緒に説明を付加します。
スナップショットを素早く作成する場合、「push」を省略できます。 このモードでは、 誤ったサブ・コマンドが意図しないスタッシュ・エントリを作成するのを防ぐため、 オプション以外の引数は許可されません。 これには例外が2つあり、
stash
-p
はstash
push
-p
のエイリアスとして機能し、 pathspec 要素は曖昧さを避けるためにダブルハイフン--
の後ろで許可されます。 - save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]
-
このオプションは廃止され、
git
stash
push
が採用されました。 pathspecをとることができないという点で「stash push」とは異なります。 代わりに、オプション以外のすべての引数が連結されて、スタッシュメッセージが形成されます。 - list [<log-options>]
-
現在持っているスタッシュエントリを一覧表示します。 各「スタッシュエントリ」は、その名前(たとえば、
stash@
{0} は最新のエントリ、stash@
{1} はその前のエントリ、など)と、 エントリが作成されたときの現在のブランチの名前と、エントリが基づいていたコミットの簡単な説明と、ともに一覧表示されます。stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation stash@{1}: On master: 9cc0589... Add git-stash
このコマンドは、
git
log
コマンドに適用可能なオプションを使用して、表示内容と方法を制御します。 git-log(1) を参照してください。 -
show
[-u
|--include-untracked
|--only-untracked
] [<diff-options>] [<stash>] -
スタッシュエントリに記録された変更を、スタッシュされたコンテンツとスタッシュエントリが最初に作成されたときのコミットとの差分として表示します。 デフォルトでは、コマンドはdiffstatを表示しますが、
git
diff
として認識される任意の形式を受け入れます(たとえば、パッチ形式で2番目に新しいエントリを表示するにはgit
stash
show
-p
stash@
{1})。 <diff-option> が指定されていない場合、デフォルトの動作はstash.showStat
およびstash.showPatch
構成変数によって与えられます。stash.showIncludeUntracked
を使用して、--include-untracked
がデフォルトで有効になっているかどうかを設定することもできます。 -
pop
[--index
] [-q
|--quiet
] [<stash>] -
スタッシュリストから単一のスタッシュ状態を削除し、現在の作業ツリー状態の上に適用(apply)します。つまり、
git
stash
push
の逆の操作を実行します。 作業ディレクトリはインデックスと一致している必要があります。状態の適用(apply)は、競合で失敗する可能性があります。 この場合、スタッシュリストからは削除されません。 競合を手動で解決し、後で手動で
git
stash
drop
を呼び出す必要があります。 -
apply
[--index
] [-q
|--quiet
] [<stash>] -
pop
と似ていますが、 スタッシュ・リストから状態を削除しません。pop
とは異なり、 <stash> は、stash
push
またはstash
create
によって作成されたコミットのように見える任意のコミットでかまいません。 - branch <branchname> [<stash>]
-
<branchname> という名前の新しいブランチを作成し、 チェックアウトします。 このブランチは <stash> が最初に作成されたコミットから開始されます。 <stash> に記録された変更を新しい作業ツリーとインデックスに適用(apply)します。 成功した場合、 かつ <stash> が
stash@
{<revision>} 形式の参照である場合、 その <stash> を削除します。これは、
git
stash
push
を実行したブランチがすごく変更されていて、git
stash
apply
が競合のために失敗した場合に便利です。 スタッシュ・エントリは、git
stash
が実行された時点での HEAD であったコミットの上に適用されるため、 元のスタッシュ状態を競合なく復元します。 - clear
-
すべてのスタッシュエントリを削除します。 これらのエントリは刈り込みの対象となり、回復(recover)できない可能性があることに注意してください(可能な戦略については、下記「Examples」を参照してください)。
-
drop
[-q
|--quiet
] [<stash>] -
スタッシュ・エントリー・リストからスタッシュ・エントリを1つ削除します。
- create
-
スタッシュ・エントリー(通常のコミット・オブジェクト)を作成し、 そのオブジェクト名を返しますが、 ref 名前空間にはどこにも保存しません。 これはスクリプトで使用することを目的としています。 おそらくあなたが通常使用したいコマンドではありません。 上記「push」をご覧ください。
- store
-
git
stash
create
で作成された指定のスタッシュ(宙ぶらりんマージコミット(dangling merge commit))をスタッシュ ref に保存し、 スタッシュ reflog を更新します。 これはスクリプトで使用することを目的としています。 おそらくあなたが通常使用したいコマンドではありません。上記の「push」を参照してください。
OPTIONS
-
-a
-
--all
-
このオプションは、
push
とsave
コマンドのみ有効です。無視され追跡されていないすべてのファイルもスタッシュしてから、
git
clean
でクリーンアップします。 -
-u
-
--include-untracked
-
--no-include-untracked
-
push
およびsave
コマンドと一緒に使用すると、追跡されていないすべてのファイルもスタッシュし、git
clean
でクリーンアップします。show
コマンドと一緒に使用すると、diffの一部としてスタッシュエントリの追跡されていないファイルを表示します。 -
--only-untracked
-
このオプションは
show
コマンドでのみ有効です。diffの一部として、スタッシュエントリ内の、追跡されていないファイル(untracked files)のみを表示します。
-
--index
-
このオプションは、
pop
およびapply
コマンドにのみ有効です。作業ツリーの変更だけでなく、インデックスの変更も復元しようと試みます。 ただし、競合がある場合(競合がインデックスに保存されているため、元の変更を適用できなくなる)、これは失敗する可能性があります。
-
-k
-
--keep-index
-
--no-keep-index
-
このオプションは、
push
とsave
コマンドのみ有効です。インデックスにすでに追加されているすべての変更はそのまま残ります。
-
-p
-
--patch
-
このオプションは、
push
とsave
コマンドのみ有効です。HEADと作業ツリー間のdiffから、スタッシュするハンクを対話的に選択します。 スタッシュエントリは、リポジトリのインデックス状態と同じになるように構築され、そのワークツリーには、対話的に選択した変更点のみが含まれます。 そして、選択した変更はワークツリーから巻き戻されます。
--patch
モードの操作方法については、 git-add(1) の「Interactive Mode」セクションを参照してください。--patch
オプションは--keep-index
の指定を含んでいます。あなたは--no-keep-index
を使用してこれを上書きできます。 -
-S
-
--staged
-
このオプションは、
push
とsave
コマンドのみ有効です。現在ステージングされている変更のみをスタッシュします。 これは、状態が現在のブランチではなくスタッシュにコミットされることを除いて、基本的な
git
commit
に似ています。--patch
オプションはこれよりも優先されます。 -
--pathspec-from-file=
<file> -
このオプションは、
push
コマンドにのみ有効です。pathspecは、コマンドライン引数の代わりに <file> で渡されます。 <file> が正確に
-
の場合、標準入力が使用されます。 pathspec要素はLFまたはCR/LFで区切られます。 pathspec要素は、構成変数core.quotePath
にて説明されているようにクォートできます(git-config(1) 参照)。--pathspec-file-nul
および グローバルの--literal-pathspecs
も参照してください。 -
--pathspec-file-nul
-
このオプションは、
push
コマンドにのみ有効です。このオプションは
--pathspec-from-file
でのみ意味があります。 pathspec要素はNUL文字で区切られ、他のすべての文字は文字通りに解釈されます(改行と引用符を含む)。 -
-q
-
--quiet
-
このオプションは、
apply
,drop
,pop
,push
,save
,store
コマンドにのみ有効です。静かにして、フィードバックメッセージを抑制します。
-
--
-
このオプションは、
push
コマンドにのみ有効です。曖昧さ解消の目的のために pathspec をオプションから分離します。
- <pathspec>…
-
このオプションは、
push
コマンドにのみ有効です。新しいスタッシュエントリは、pathspecに一致するファイルについてのみ変更された状態を記録します。 次に、インデックスエントリと作業ツリーファイルは、これらのファイルについてのみHEADの状態に巻き戻されされ、pathspecに一致しないファイルはそのまま残ります。
詳細については、 gitglossary(7) の「pathspec」エントリを参照してください。
- <stash>
-
このオプションは、
apply
,branch
,drop
,pop
,show
コマンドにのみ有効です。stash@
{<revision>} 形式の参照。 <stash> が指定されていない場合、最新のスタッシュ(stash@
{0})を想定します。
DISCUSSION
スタッシュエントリーは、作業ディレクトリの状態を記録するツリーを持つコミットとして表現され、その最初の親はエントリーが作成された HEAD
でのコミットとなります。 2番目の親のツリーは、エントリーが作成されたときのインデックスの状態を記録しており、HEAD
コミットの子として作られます。 祖先のグラフは以下のようになります:
.----W
/ /
-----H----I
ここで、 H
は HEAD
コミット、 I
はインデックスの状態を記録するコミット、 W
は作業ツリーの状態を記録するコミットです。
EXAMPLES
- 変更があるツリーへのプル(Pulling into a dirty tree)
-
作業の途中で、 上流にあなたが取り組んでいる内容に関連する可能性のある変更があることがわかった場合。 あなたのローカルの変更が上流の変更と競合しない場合、 単純な
git
pull
で作業を進めることができます。しかし、 あなたのローカルの変更が上流の変更と競合する場合、
git
pull
はあなたの変更を上書きすることを拒否します。 そのような場合、 以下のように、 変更をスタッシュに退避させ、 プルを実行してからスタッシュを戻すことができます:$ git pull ... file foobar not up to date, cannot merge. $ git stash $ git pull $ git stash pop
- 割り込み作業(Interrupted workflow)
-
作業の途中で上司がやって来て、 すぐに何かを修正するように要求した場合。 従来は、 以下のように、 変更を一時的なブランチにコミットして退避させ、 元のブランチに戻って緊急修正を行う方法が一般的でした:
# ... hack hack hack ... $ git switch -c my_wip $ git commit -a -m "WIP" $ git switch master $ edit emergency fix $ git commit -a -m "Fix in a hurry" $ git switch my_wip $ git reset --soft HEAD^ # ... continue hacking ...
これは、
git
stash
を使用することで以下のように簡略化できます:# ... hack hack hack ... $ git stash $ edit emergency fix $ git commit -a -m "Fix in a hurry" $ git stash pop # ... continue hacking ...
- 局所的なコミットをテスト(Testing partial commits)
-
作業ツリーの変更を2つ以上のコミットに分割したい場合や、 コミット前に各変更をテストしたい場合、
git
stash
push
--keep-index
を使用できます:# ... hack hack hack ... $ git add --patch foo # add just first part to the index $ git stash push --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'
- 将来利用するために今取り組んでいる事と無関係な変更を保存
-
大規模な変更の途中で、 忘れたくない無関係な問題を見つけた場合、 その変更を行い、 ステージ後、
git
stash
push
--staged
を使って将来のためにスタッシュに退避できます。 これはステージした変更をコミットするのと似ていますが、 コミットは現在のブランチではなくスタッシュに保存されます。# ... hack hack hack ... $ git add --patch foo # add unrelated changes to the index $ git stash push --staged # save these changes to the stash # ... hack hack hack, finish current changes ... $ git commit -m 'Massive' # commit fully tested changes $ git switch fixup-branch # switch to another branch $ git stash pop # to finish work on the saved changes
- 誤ってクリアまたはドロップされたスタッシュ・エントリを回復
-
誤ってスタッシュ・エントリをドロップまたはクリアした場合、 通常のセーフティ機構では回復できません。 ただし、 リポジトリー内にまだ存在しているが、 到達できなくなったスタッシュ・エントリの一覧を取得するために、 以下の呪文を試すことができます:
git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIP
CONFIGURATION
このセクションの以下のすべては、 git-config(1) ドキュメントの抜粋です。 内容は git-config(1) ドキュメント にあるものと同一です:
- stash.showIncludeUntracked
-
これがtrueに設定されている場合、
git
stash
show
コマンドはstashエントリの追跡されていないファイル(untracked files)を表示します。 デフォルトはfalseです。 git-stash(1) の showコマンドの説明を参照してください。 - stash.showPatch
-
これがtrueに設定されている場合、オプションのない
git
stash
show
コマンドは、パッチ形式でstashエントリを表示します。 デフォルトはfalseです。 git-stash(1)の showコマンドの説明を参照してください。 - stash.showStat
-
これがtrueに設定されている場合、オプションのない
git
stash
show
コマンドは、stashエントリのdiffstatを表示します。 デフォルトはtrueです。 git-stash(1) の showコマンドの説明を参照してください。
SEE ALSO
GIT
Part of the git(1) suite