5

git stash に問題があります。

たとえばa.txt,b.txt & c.txt、リポジトリに 3 つのファイルがあり、ディレクトリがクリーンであるとします。

現在、その中の 2 つのファイルを変更していますa.txt and b.txt

今、私は 2 つのファイルの変更を完了していないので、foll コマンドでそれらを隠しています:

$ git stash save "First Stash"

いいえ、私がするなら$ git stash list、私は得ます

stash@{0}: On master: First Stash

いいえ、3 番目のテキスト ファイルを変更して、次のようにc.txt隠します。

$ git stash save "Second Stash"

いいえ、最終的には$git stash list、次の結果が得られます。

stash@{0}: On master: Second stash
stash@{1}: On master: First Stash

ここには隠し番号とメッセージが混同されています。ここでポップするstash@{0}と、最初の隠し場所の内容が表示されますが、ここでメッセージが逆になり、2 番目の隠し場所として表示されますが、最初の隠し場所である必要があります。

これが私のワークフローです

admin:stud:/demo/stash_demo> ls
a.txt  b.txt
admin:stud:/demo/stash_demo> echo Hello World >> a.txt
admin:stud:/demo/stash_demo> git stash save "First"
Saved working directory and index state On master: First
HEAD is now at cff03c6 Initail Commit
admin:stud:/demo/stash_demo> echo Hello World >> b.txt
admin:stud:/demo/stash_demo> git stash save "Second"
Saved working directory and index state On master: Second
HEAD is now at cff03c6 Initail Commit

これらは私の利用可能な隠し場所です:

admin:stud:/demo/stash_demo> git stash list
stash@{0}: On master: Second
stash@{1}: On master: First

ここで、最初の stash である stash@{1} を適用しようとし、ファイル a.txt を適用する必要があります

admin:stud:/demo/stash_demo> git stash apply `stash@{1}`
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   b.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

上記のように、最新の変更が適用されます。

そして、目盛りなしで試してみると、次のエラーが発生します。

admin:stud:/demo/stash_demo> git stash apply stash@{1}
fatal: ambiguous argument 'stash@1': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
4

2 に答える 2

5

Git の stash は (デフォルトでは) LIFO storageです。

git stash applyorを使用git stash popすると、常に最後にスタッシュされたパッチを取得できます (これは、スタッシュ内のインデックスであり、stash@{0}を使用して参照することもできます)。0新しいパッチをスタッシュすると、他のスタッシュされたパッチの上に配置されるため、インデックスが 1 つ増えます (stash@{0}は になりstash@{1}ます)。

つまり、最後に隠したパッチ以外のパッチを適用またはポップしたい場合は、その参照をコマンドに渡す必要があります。

$ git stash apply stash@{1}
于 2013-01-29T12:39:40.897 に答える
1

それらは混同されていません!

スタッシングは、「コミット」(ここでは正しい言葉ではありませんが、私は知っています) をスタックに保存します。

http://en.wikipedia.org/wiki/Stack_(abstract_data_type)

そのため、操作 pop は常に最後に入力したものを取得します。

この動作は仕様です

編集:何かをひっくり返す必要がある場合は、スタック(スタッシュ)内の各アイテムを個別にポップします-実際のコミットを行います-そしてインタラクティブなリベースなど..

編集/編集: する

git stash pop 

次に、変更をコミットします(このコミットが有用かどうかに関係なく)

その後、もう一度やり直して、git stash popもう一度コミットします

単一のコミットを並べ替えたり削除したりできるようになりました - http://gitready.com/advanced/2009/03/20/reorder-commits-with-rebase.htmlを参照 するか、インタラクティブなリベースを検索してください (再び .. 次のブランチを作成するとき、この概念はスタッシングよりもはるかに強力です)

于 2013-01-29T12:38:26.043 に答える