2017-10-13 10 views
0

私はgitでひそかに遊んでいました。 。正しいstash @ {0} `の代わりに` git stash show -p @ {0} `の不正な構文があります

多くのスタッシュを作成した後、その中に何が入っているかを見たいと思っていました。私はgit stash show -pを実行し、それは私が期待するように私に最後の隠れ家のdiffを示した。私はインデックス0が最新の隠しを参照していることを確認したかったので、私は(間違って)git stash show -p @{0}を実行しました。これにより、次のエラーが表示されました。

fatal: ambiguous argument '': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions, like this: 
'git <command> [<revision>...] -- [<file>...]' 

しかし、変わったのは、私が気づいていない、そして私の隠し場所には存在しなかったたくさんの変化の差を私に与えたということです。

この文脈では@{0}とは何ですか、その差分はどこから来たのですか? gitrevisions(7) manual page から

答えて

1

git stashコードは以下の原則を使用して、kostix's answer上のビットを展開するには:

  • "" スタッシュ(デフォルトを1つ)はrefs/stashという名前で識別されるため、[email protected]{number}はこの参照のためのreflogエントリです。
  • Is this a valid visualization of the "git stash" operation?の図に示すように、各隠しは実際には2つ(時には3つ)のコミットで構成されています。stash参照は作業ディレクトリまたは作業ツリーコミットの参照ポイントで、2つコミットは存在する)親はコミットする。これは、作業木のコミットが通常のGitコマンドによって行われた通常のコミットのように扱われた場合、単にマージコミットとなることを意味します。 (実際には独特の効果を得ることができる普通のマージとしてそれを処理するので、それはそれで動作するようにgit stashコマンドを使用することをお勧めします。)

この第二のポイント実装の詳細-それにもかかわらずであるが、非常に強くgit stashコードに影響を及ぼし。特に、git stashは、のいずれかコミットであると信じます。マージコミットの場合にのみ有効な隠しです。コミットにはrefs/stashまたは対応するreflogエントリの1つを介して名前を付ける必要はありません。あなたが[email protected]{1}を書く場合

gitrevisionsに概説されたルールは通常refs/stashを見つけて、1番目のREFLOGエントリ(つまり、最初のものを抽出し、技術的には全くREFLOGエントリではありません[email protected]{0}エントリをカウントしません:Gitは、reflogからのエントリではなく、参照自体の値を取得するだけです)。

[email protected]{1}が存在すると仮定すると、マージコミットとなる隠された作業ツリーコミットの名前が付けられます。 git stashコードでは、指定したコミットがstash-likeであること、つまり所定の形式を持つことを確認します。

しかし、これはまた、あなたが含むコード - パース改正に許容可能なハッシュID、または支店名、または他の名前を使用して(例えばshowまたはapplyなど)git stashサブコマンドの一部を実行する場合ことを意味し@{0}のような通常のreflogのような参照は、 "HEADから抽出された値"を意味します。つまり、stashコードはそのコミットでそのことを実行しようとします。

このコミットが "stash-like"テストに合格した場合、stashコードはと同じようにのように処理します。 の場合、現在のコミットがマージの場合、git stash showはその一部を表示する傾向があります(技術的にはHEAD^1HEADを比較しています)。これは、 "stash-like"テストは基本的に "マージコミット" 。それはないがマージコミットだ場合、git stash showは文句を言うと終了する必要があります:

'HEAD' is not a stash-like commit 

が、Gitリポジトリの古いバージョンでは、いつものように巧妙ではありません。あなたのGitが本当に古代なら、それは余分な議論をgit diffに渡して、それらについて不平を言う既存の隠し場所を表示しようとするかもしれません。

1

(あなたがgit help revisionsを実行することができます):

@{<n>} , e.g. @{1}

You can use the @ construct with an empty ref part to get at a reflog entry of the current branch.For example, if you are on branch blabla then @{1} means the same as [email protected]{1} .

+0

この場合、 '@ {0}'は無効です。 – ElpieKay

+0

@ElpieKayこれは、OPの問題が何だったのか? – kostix

関連する問題